Прогнозирование цен на акции с помощью машинного обучения
Мы будем использовать библиотеку 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