Stonksmaster: Прогнозируйте цены на акции с помощью Python & ML

146

В этой статье мы построим простое приложение, чтобы прогнозировать цены на акции с помощью Python, а также Machine Learning (машинное обучение) и его концепций. Итак, давайте начнем.

Машинное обучение — это область исследований, которая дает компьютерам возможность обучаться, не будучи запрограммированными напрямую. — Артур Сэмюель

В последние годы машинное обучение применяется в различных сферах деятельности, включая виртуальные персональные ассистенты, онлайн поддержку клиентов, рекомендации по продукции и т.д.

Мы же будем использовать такие библиотеки, как numpy, pandas, matplotlib, scikit-learn.

Этапы в машинном обучении

Каждая задача с помощью машинного обучения имеет определенный набор шагов:

1. Сбор данных

Для старта ML проекта нужны данные. Можно использовать исходные из Excel, текстовые файлы, видео, изображениия или другие. Этот шаг формирует основу будущего обучения.

2. Подготовка данных

Плохие данные всегда приводят к плохому пониманию, а это создает проблемы. Ведь результаты прогнозов зависят от качества используемых данных. Лучше потратить больше времени на определение их свойств, чем на исправления допущенных ошибок.

3. Обучение модели

Этот шаг включает в себя выбор подходящего алгоритма и представление данных в виде модели. Проще говоря, это превращения реальной задачи в математическую модель, которую сможет понять компьютер. Очищенный набор данных делятся на три части — Обучение, Валидация и Тестирование — пропорционально в зависимости от задумки. Затем обучающая часть передается модели для изучения взаимосвязи/функции.

4. Оценка модели

Довольно часто мы тестируем не одну модель, а много. Поэтому, чтобы сравнить их производительность, мы оцениваем все по данным валидации. Эта информация помогает оценить реальные результаты модели.

5. Улучшение производительности

Поначалу производительность модели может быть неудовлетворительная. В таком случае, нужно пересмотреть решения о представлении данных и параметрах модели. Возможно, понадобиться использовать различные переменные или даже собрать дополнительные данные. В худшем случае, нужно будет изменить всю структуру.

6. Отчетность о производительности

Когда производительность модели на валидационном уровне нас устраивает, мы оцениваем её на тестовом наборе данных. Это дает правильное представление о производительности модели на реальных данных, которые на раньше не видела.

И вот мы и подходим к самому проекту. Поскольку мы имеем дело с фондовым рынком и пытаемся предсказать цены акций, то самое главное — это умение читать акции.

Как читать акции?

Умение читать графики акций, или котировок,  — очень важный навык. Он помогает понять что происходит на более широком рынке, и как эти акции будут работать по прогнозам.

Акции имеют страницы котировок или графики. Они дают как базовую, так и более подробную информацию об акциях, их показателях и компании в целом.

Фондовая диаграмма или график акций

Фондовая диаграмма — это набор информации о конкретной акции компании. Обычно она отображает изменение цен, текущую торговую цену, исторические максимумы и минимумы, дивиденды, объем торгов и другую финансовую информацию о компании.

Также мы хотели бы ознакомить вас с некоторыми базовыми терминами фондового рынка.

Тикер

Тикер — это символ, который используется на бирже для обозначения данной акции. Например, тикер Apple — это (AAPL), а тикер Snapchat — (SNAP).

Открытая цена

Открытая цена — это цена, по которой акции были открыты в определенный день.

Цена закрытия

Закрытая цена — это цена, по которой акции перестали продаваться в обычные торговые часы. Если цена акции закрывается выше, чем в предыдущий день, то это восходящее движение. И наоборот, если цена закрытия ниже цены закрытия предыдущего дня, то цена акции показывает движение вниз.

Теперь пришло время начать настройку проекта.

Инициализация

Шаг 1: Сбор данных

Используйте библиотеку iexfinance для загрузки данных. Датафрейм, который мы получаем, содержит ежедневные данные о фондовом рынке. Загруженный датафрейм дает нам много информации, включая цену открытия, цену закрытия, объем и т.д. Но нас интересуют цены открытия с соответствующими датами.

import pandas as pd
import numpy as np
import iexfinance
from iexfinance.stocks import get_historical_data
from datetime import datetime, date

# start date should be within 5 years of current date according to iex API we have used
# The more data we have, the better results we get!

start = datetime(2016, 1, 1)
end = date.today()
# use your token in place of token which you will get after signing up on IEX cloud
# Head over to https://iexcloud.io/ and sign-up to get your API token
df = get_historical_data("AAPL", start=start, end=end, output_format="pandas", token="your_token")
сбор данных таблица

Шаг 2: Подготовка данных

Удобно было бы конвертировать даты в соответствующие им метки по времени. Тогда у нас будет датафрейм, который будет содержать цены открытия и тайм-штампы.

Для того, чтобы понять, хороша ли наша модель, нужно хранить некоторые данные, которые алгоритмы не увидят. Мы будем использовать их для того, чтобы понять насколько точной на самом деле может быть лучшая модель.

Мы разделим загруженный набор данных на два. 80% из них будем использовать для обучения, оценки и выбора среди наших моделей, а 20% будем удерживать в качестве валидационных данных.

from sklearn.model_selection import train_test_split

prices = df[df.columns[0:1]]
prices.reset_index(level=0, inplace=True)
prices["timestamp"] = pd.to_datetime(prices.date).astype(int) // (10**9)
prices = prices.drop(['date'], axis=1)
prices

dataset = prices.values
X = dataset[:,1].reshape(-1,1)
Y = dataset[:,0:1]

validation_size = 0.15
seed = 7

X_train, X_validation, Y_train, Y_validation = train_test_split(X, Y, test_size=validation_size, random_state=seed)
подготовка данных

Функция train_test_split() исходит из библиотеки scikit-learn.

scikit-learn (также известна как sklearn) — это бесплатная программная библиотека машинного обучения для Python. Библиотека ориентирована на моделирование данных. Она не фокусируется на загрузке, манипулировании и обобщении данных.

Шаг 3: Обучение модели

Изначально мы не можем сказать какие алгоритмы подойдут данному проекту, и какие конфигурации использовать.

Поэтому тестируем 6 различных алгоритмов:

  • Linear Regression (LR)
  • Lasso (LASSO)
  • Elastic Net (EN)
  • KNN (K-Nearest Neighbors)
  • CART (Classification and Regression Trees)
  • SVR (Support Vector Regression)
from sklearn.linear_model import LinearRegression
from sklearn.linear_model import Lasso
from sklearn.linear_model import ElasticNet
from sklearn.tree import DecisionTreeRegressor
from sklearn.neighbors import KNeighborsRegressor
from sklearn.svm import SVR

# Test options and evaluation metric
num_folds = 10
seed = 7
scoring = "r2"

# Spot-Check Algorithms
models = []
models.append((' LR ', LinearRegression()))
models.append((' LASSO ', Lasso()))
models.append((' EN ', ElasticNet()))
models.append((' KNN ', KNeighborsRegressor()))
models.append((' CART ', DecisionTreeRegressor()))
models.append((' SVR ', SVR()))

Шаг 4: Оценка модели

from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score

# evaluate each model in turn
results = []
names = []
for name, model in models:
    kfold = KFold(n_splits=num_folds, random_state=seed, shuffle=True)
    cv_results = cross_val_score(model, X_train, Y_train, cv=kfold, scoring=scoring)
    # print(cv_results)
    results.append(cv_results)
    names.append(name)
    msg = "%s: %f (%f)" % (name, cv_results.mean(), cv_results.std())
    print(msg)

Выход приведенного кода дает оценки точности для каждого из наших алгоритмов. Нам необходимо сравнить модели друг с другом и выбрать наиболее точные.

После того, как мы определились, какой из результатов даст наибольшую точность, нужно:

  • Определить модель
  • Ввести данные в нашу модель
  • Сделать прогнозы

Поместите ваши прогнозы вместе с фактическими данными, и два графика будут почти совпадать.

Шаг 5: Отчет по модели и составление прогноза

# Future prediction, add dates here for which you want to predict
dates = ["2020-12-23", "2020-12-24", "2020-12-25", "2020-12-26", "2020-12-27",]
#convert to time stamp
for dt in dates:
  datetime_object = datetime.strptime(dt, "%Y-%m-%d")
  timestamp = datetime.timestamp(datetime_object)
  # to array X
  np.append(X, int(timestamp))

from matplotlib import pyplot as plt
from sklearn.metrics import mean_squared_error

# Define model
model = DecisionTreeRegressor()
# Fit to model
model.fit(X_train, Y_train)
# predict
predictions = model.predict(Xp)
print(mean_squared_error(Y, predictions))

# %matplotlib inline 
fig= plt.figure(figsize=(24,12))
plt.plot(X,Y)
plt.plot(X,predictions)
plt.show()
график акций

Ура! Мы наконец-то построили «Предсказатель акций». Надеемся, что эта статья была для вас полезна.

Источник: dev.to

Поделитесь в соц.сетях
  • 1
  •  
  •  
  •  
  •  
  •  
  •  

Оставить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *