機械学習の手法を用い、前日、前々日の株価や取引量を元に株価が上がるか・下がるかを予想するプログラムを作成します。
プログラムの作成
■予想対象
X日の「終値-始値」が+か-かを予測する。(ローソク足が陽線か陰線か)
■予想する際に使用するデータ(特徴量)
- N日前の株価上昇率:(CLOSE(X-N)-CLOSE(X-N-1))/CLOSE(X-N)
- N日前の取引量:VOLUME(X-N)
■機械学習アルゴリズム
アルゴリズムは下記の7種類を使用します。
- K近傍法(KNeighborsClassifier)
- ロジスティック回帰(LogisticRegression)
- サポートベクターマシーン (SVM)
- 決定木(DecisionTreeClassifier)
- AdaBoost
- GBDT(radientBoostingClassifier)
- RandomForest
■ハイパーパラメータ
それぞれのアルゴリズムに対してGridSearchCVでハイパーパラメータの最適化を行います。下記3種類ずつのハイパーパラメータで検証します。(cv=5)
{'kNN': (KNeighborsClassifier(), {'n_neighbors': [5, 25, 55]}), 'LR': (LogisticRegression(), {'C': [0.01, 1, 100]}), 'SVM': (SVC(), {'C': [0.01, 1, 100]}), 'DT': (DecisionTreeClassifier(), {'max_depth': [50, 100, 150]}), 'AdaBoost': (AdaBoostClassifier(), {'n_estimators': [100, 150, 200]}), 'GBDT': (GradientBoostingClassifier(), {'learning_rate': [0.01, 1, 100]}), 'RF': (RandomForestClassifier(), {'n_estimators': [100, 150, 200]})}
プログラムの検証
■検証対象銘柄
滬深300指数(中国A株を代表する300銘柄によって構成される指数)
■学習期間
- 2012/1/1~2017/8/31(教師データ)
- 2017/9/1~2018/9/14(テストデータ)
1.5年8か月分の株価・取引量データを使って各アルゴリズムで機械学習を行います。
2.1年分のデータで学習した結果がどれだけ正しいか検証します。
※Pythonの中国株情報取得ライブラリtushareでデータ取得
import tushare as ts ts.get_k_data(code='hs300', start='2012-01-01', end='2018-09-14')
■検証結果
検証結果は下記の通りとなりました。最も正答率が良かった決定木(DecisionTreeClassifier)で58%。直近1年間このプログラム通りに朝イチで買い(売り)終値で売り(買い)を行っていれば58%の確率で上昇下落が当たっていたことになります。
実際には上昇下落した金額の考慮やもう少し正答率が上がらないと使い物にはならないかと思います。数日前までの株価と取引量だけで予測するのは限界がありそうです。
kNN: 0.48 #正答率 [[34 84] #上昇予想で実際に上昇したのが34日、上昇予想で下落したのが84日 [48 89]] #下落予想で実際には上昇したのが48日、下落予想で下落したのが89日 LR: 0.54 [[ 16 102] [ 15 122]] SVM: 0.54 [[ 0 118] [ 0 137]] DT: 0.58 [[58 60] [48 89]] AdaBoost: 0.49 [[49 69] [61 76]] GBDT: 0.53 [[45 73] [48 89]] RF: 0.56 [[56 62] [49 88]]