0
0

機械学習で株価分析 13.機械学習の試行

Last updated at Posted at 2023-12-21

はじめに

本記事では、実際に機械学習を試行する方法を紹介します。なお、本記事は過去の記事 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)

プログラムを実行し、予測結果が表示されれば成功です。

目次へのリンク

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0