Прогнозирование цен на акции с помощью машинного обучения

Мы будем использовать библиотеку SKlearn и линейную регрессию.

#Import Libraries
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
plt.style.use('seaborn-darkgrid')
from sklearn.linear_model import LinearRegression

Установите Yfinance, если он не установлен

!pip install yfinance
import yfinance as yf

Теперь нам нужно, например, загрузить цену акции TCS. В Yfinance (Yahoo Finance) путем поиска вы можете получить код скрипта. Код сценария TCS — TCS.NS.

# Down load the share/stock price data
# Here we are using TCS Share
# TCS index name in YFiannce is TCS.NS# We are reading Data from last 14 years
DF = yf.download('TCS.NS', '2008-01-01', '2022-03-26', auto_adjust=True)
#Showing first Five days data
DF.head()

#Showing Current Five days data
DF.tail()

# We will keep only value of close day price
DF = DF[['Close']]
# Drop rows with missing values
DF = DF.dropna()
# Plot the closing price of GLD
DF.Close.plot(figsize=(10, 7),color='r')
plt.ylabel("TCS Prices")
plt.title("TCS Price Series")
plt.show()

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

Объясняющими переменными в этой стратегии являются скользящие средние за последние 3 дня и 9 дней. Мы удаляем значения NaN с помощью функции dropna() и сохраняем переменные функций в X.

Однако вы можете добавить в X дополнительные переменные, которые, по вашему мнению, будут полезны для прогнозирования цен на акции TCS.

from pandas.io.formats.info import DataFrameTableBuilderNonVerbose
# Define explanatory variables
DF['S_3'] = DF['Close'].rolling(window=3).mean()
DF['S_9'] = DF['Close'].rolling(window=9).mean()
DF['next_day_price'] = DF['Close'].shift(-1)
DF = DF.dropna()
X = DF[['S_3', 'S_9']]
# Define dependent variable
y = DF['next_day_price']

Разделите данные на обучающие и тестовые данные

Мы разделим данные на два набора данных поезда 80% и тестовых данных 20%.

80 % данных будут использоваться для обучения, а оставшиеся 20 % будут тестироваться.

# Split the data into train and test dataset
t = .8
t = int(t*len(DF))
# Train dataset
X_train = X[:t]
y_train = y[:t]
# Test dataset
X_test = X[t:]
y_test = y[t:]

Мы создадим модель линейной регрессии

Изображение Dan White 1000 на Shutterstock. скользящая средняя дней + m2 * скользящая средняя 9 дней + c

# Create a linear regression model
linear = LinearRegression().fit(X_train, y_train)
print("Linear Regression model")
print("TCS chare Price (y) = %.2f * 3 Days Moving Average (x1) \
+ %.2f * 9 Days Moving Average (x2) \
+ %.2f (constant)" % (linear.coef_[0], linear.coef_[1], linear.intercept_))

Модель линейной регрессии Стоимость TCS (y) = 1,19 * 3-дневная скользящая средняя (x1) + -0,19 * 9-дневная скользящая средняя (x2) + 0,64 (постоянная)

# Predicting the TCS prices
predicted_price = linear.predict(X_test)
predicted_price = pd.DataFrame(
predicted_price, index=y_test.index, columns=['price'])
predicted_price.plot(figsize=(10, 7))
y_test.plot()
plt.legend(['predicted_price', 'actual_price'])
plt.ylabel("TCS Price")
plt.show()

R-квадрат — это мера согласия для моделей линейной регрессии. Эта статистика показывает процент дисперсии зависимой переменной, которую независимые переменные объясняют вместе. R-квадрат измеряет силу связи между вашей моделью и зависимой переменной в удобной шкале от 0 до 100%.

Оценка, близкая к 100%, указывает на то, что модель хорошо объясняет цены акций TCS.

# R square
r2_score = linear.score(X[t:], y[t:])*100
float("{0:.2f}".format(r2_score))

99.43

TCS = pd.DataFrame()
TCS['price'] = DF[t:]['Close']
TCS['predicted_price_next_day'] = predicted_price
TCS['actual_price_next_day'] = y_test
TCS['TCS_returns'] = TCS['price'].pct_change().shift(-1)
TCS['signal'] = np.where(TCS.predicted_price_next_day.shift(1) < TCS.predicted_price_next_day,1,0)
TCS['strategy_returns'] = TCS.signal * TCS['TCS_returns']
((TCS['strategy_returns']+1).cumprod()).plot(figsize=(10,7),color='g')
plt.ylabel('Cumulative Returns')
plt.show()

# import datetime and get today's date
import datetime as dt
current_date = dt.datetime.now()
# Get the data
data = yf.download('TCS.NS', '2008-06-01', current_date, auto_adjust=True)
data['S_3'] = data['Close'].rolling(window=3).mean()
data['S_9'] = data['Close'].rolling(window=9).mean()
data = data.dropna()
# Forecast the price
data['predicted_TCS_price'] = linear.predict(data[['S_3', 'S_9']])
data['signal'] = np.where(data.predicted_TCS_price.shift(1) < data.predicted_TCS_price,"Buy","No Position")
# Print the forecast
data.tail(1)[['signal','predicted_TCS_price']].T

Дата 2022–03–25

signalc Купить

предсказанная_TCS_цена 3734,638653