はじめに
本記事では、実際に機械学習を試行する方法を紹介します。なお、本記事は過去の記事 12.機械学習のためのデータ整形 の続きですので、未読の方はまずこちらをご参照ください。ここで、機械学習手法にはLightGBMを選定しています。興味のある方はその他の機械学習手法を調査・実装・比較検討してみてください。
概要
作成したトレーニングデータとテストデータに対し、以下のプログラムを実行することで、機械学習が実行できます。今回予測したいのは株価高騰フラグのTrue/Falseのため、パラメータにbinary
を指定しています。その他パラメータの設定に関しては、ぜひご自身で調査してみてください。
# 機械学習(LightGBM)のパラメータ設定
params = {
'objective' : 'binary',
'metric' : 'auc' ,
'boosting_type': 'gbdt' ,
}
# 機械学習(LightGBM)の試行
lgb_train = lgb.Dataset(X_train, y_train)
lgb.test = lgb.Dataset(X_test, y_test)
gbm = lgb.train(params, lgb_train)
y_pred = gbm.predict(X_test)
# 機械学習結果の表示
display(pd.DataFrame(y_pred).tail().T)
ソースコード全文
以下にソースコード全文を示します。
!pip install yfinance
# 必要なライブラリをインポート
import yfinance as yf
yf.pdr_override()
import numpy as np
import pandas as pd
from pandas_datareader import data
import datetime
from IPython.display import display
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
import lightgbm as lgb
# 株価データの取得 ----------------------------------------------------------
# データの取得開始日・取得終了日を設定
day_start = datetime.date(2021,1,1)
day_end = datetime.date.today() + datetime.timedelta(days=1)
# 銘柄名を変数に格納
stock_name = ["4689.T"]
# 株価データを読み込み
df_stock = data.DataReader(stock_name, day_start, day_end, interval="1d")
# 取得する経済指標を設定
fred_name = ["^N225"]
# 経済指標データ取得
df_fred = data.DataReader(fred_name, day_start, day_end, interval="1d")
# 経済指標データの列名を編集
for i in range(len(fred_name)):
df_fred = df_fred.add_prefix(fred_name[i] + " ")
# 株価データに経済指標データを統合
df_merge = pd.concat([df_stock, df_fred], axis=1)
# データのブランクを穴埋め
df_merge = df_merge.fillna(method='ffill')
df_merge = df_merge.fillna(0)
# 機械学習の試行 ----------------------------------------------------------
# 説明変数に株価に関する情報を追加
df_merge['Body'] = df_merge['Open'] - df_merge['Close']
df_merge['Body Ratio'] = df_merge['Body'] / df_merge['Close']
df_merge['Range'] = df_merge['High'] - df_merge['Low']
df_merge['Range Ratio'] = df_merge['Range'] / df_merge['Close']
df_merge['Gap'] = df_merge['Open'] - df_merge.shift(1)['Close']
df_merge['Gap Ratio'] = df_merge['Gap'] / df_merge.shift(1)['Close']
df_merge["Return"] = df_merge.pct_change()["Adj Close"]
# 説明変数に各種移動平均と移動平均乖離率を追加
for dd in [5,10,15,20,25,30]:
df_merge["Close " + str(dd) + "days Average"] = df_merge["Close"].rolling(dd).mean()
df_merge["Close " + str(dd) + "days Diverge"] = (df_merge["Close"] - df_merge["Close " + str(dd) + "days Average"]) / df_merge["Close " + str(dd) + "days Average"]
df_merge["Volume " + str(dd) + "days Average"] = df_merge["Volume"].rolling(dd).mean()
df_merge["Volume " + str(dd) + "days Diverge"] = (df_merge["Volume"] - df_merge["Volume " + str(dd) + "days Average"]) / df_merge["Volume " + str(dd) + "days Average"]
# 株価高騰判定関数
rate_rise = 0.01
def func_flg_rise(data):
if data["Return 1d_After"] > rate_rise :
return 1
else:
return 0
# 目的変数作成のために翌日の株価の変動率データを追加
df_merge["Return 1d_After"] = df_merge.shift(-1)["Return"]
# 目的変数として翌日の株価の変動率を二値化
df_merge["flg_rise"] = df_merge.apply(func_flg_rise, axis=1)
# 説明変数から未来指標を削除
df_merge = df_merge.drop(["Return 1d_After"], axis=1)
# トレーニングデータとテストデータに分割
df_train, df_test = train_test_split(df_merge, test_size=0.2, shuffle=False)
# 説明変数と目的変数に分割
X_train = df_train.drop(["flg_rise"], axis=1)
X_test = df_test.drop(["flg_rise"], axis=1)
y_train = df_train["flg_rise"]
y_test = df_test["flg_rise"]
# 説明変数を標準化
std_scaler = StandardScaler()
std_scaler.fit(X_train)
X_train = pd.DataFrame(std_scaler.transform(X_train), columns=X_train.columns)
std_scaler.fit(X_test)
X_test = pd.DataFrame(std_scaler.transform(X_test), columns=X_test.columns)
# 説明変数をnumpyに変換
X_train = np.array(X_train, dtype = 'float64')
X_test = np.array(X_test, dtype = 'float64')
# 機械学習(LightGBM)のパラメータ設定
params = {
'objective' : 'binary',
'metric' : 'auc' ,
'boosting_type': 'gbdt' ,
}
# 機械学習(LightGBM)の試行
lgb_train = lgb.Dataset(X_train, y_train)
lgb.test = lgb.Dataset(X_test, y_test)
gbm = lgb.train(params, lgb_train)
y_pred = gbm.predict(X_test)
# 機械学習結果の表示
display(pd.DataFrame(y_pred).tail().T)
プログラムを実行し、予測結果が表示されれば成功です。
目次へのリンク