過去10年のアップルの株価を機械学習(LightGBM)して、次の日は上がるか下がるか予測する。
参考URL
https://note.com/10mohi6/n/n4b1196fea816
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
# 必要なライブラリをインストール # !pip install scikit-learn lightgbm pandas-datareader from pandas_datareader import data as pdr #修正 from sklearn.model_selection import train_test_split import lightgbm as lgb from sklearn.metrics import accuracy_score import yfinance as yf #追加 yf.pdr_override() #追加 # アップル株価の過去チャートを取得 df = pdr.get_data_yahoo("AAPL", "2010-11-01", "2020-11-01") # 終値の差分を計算 df["Diff"] = df.Close.diff() # 1行前の値との差分を計算。diff(2)なら2行前との差分 # 移動平均を計算。rolling(n)で前nレコードの値を取得、mean()やsum()で、平均や合計を取得できる df["SMA_14"] = df.Close.rolling(14).mean() # 取り扱い額を計算 df["Force_Index"] = df["Close"] * df["Volume"] # 株価が上がったら1、上がらずに下がったら0を、目標変数yに格納 # 前日との差分df["Diff"]を見て、0より大きければなら株価が上がったので、前日shift(-1)の目標変数df["y"]に1を入れる(株価が上がったパターン) # 逆に下がったら、0を入れる。(株価が下がったパターン) df["y"] = df["Diff"].apply(lambda x: 1 if x > 0 else 0).shift(-1) # NaN(Not A Number)がある行は削除する。 df = df.dropna() print(df) X = df.drop(["y"], axis=1).values # 目標変数yを削除して、説明変数X(過去チャート・移動平均・取り扱い額) y = df["y"].values # 目標変数yだけ格納(株価があがったら1,下がったら0) # 学習データとテストデータ(20%)に分離する。 X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.2, shuffle=False, ) # LightGBM(Gradient Boosting Machine)モデルを生成。 # learning_rate = 学習率。次の学習で、前の学習をどれくらい更新するか。 # n_estimators = 学習回数の指定。整数を指定する。デフォルトは100。 # clf = lgb.LGBMRegressor() # パラメータ無しでも動作するけど、正解率が下がる。Optunaでハイパーパラメータ自動最適化? clf = lgb.LGBMRegressor(learning_rate=0.01, n_estimators=2) # 80%学習データ(過去チャート・移動平均・取り扱い額)から、株価が上がるか下がるかを予測する機械学習モデルを作る clf.fit( X_train, y_train, ) # 残り20%をテストデータとして、株価が上がるか下がるか予測してみる y_pred = clf.predict(X_test) # テストデータの正解(y_test)と答え合わせして、どのくらい予測が当たっていたか検証する。 # y_pred > 0.5で、1だけ(株価が上がった)検証している。one-hot方式(0/1だから片方だけでOK) print(accuracy_score(y_test, y_pred > 0.5)) # 55%しか当たっていない…。ランダムよりマシ? |