機械学習で株価予測(TA-LibとLightGBMを使った学習モデル構築)

以前、LSTMを使ってKerasで実現した学習モデルでは、「一つ手前のデータと、これまでのパターンから次の値を予測する」結果になってしまいました。

勝率も49%でした。

 

 

このアプローチにずっと疑問を持っていましたが、学習データやモデル構築の知識が不足しており手が出せませんでした。

例えば・・・・

  • よく見るモデルの多くは、株価が上がるか下がるかの2通りを予測するもの
  • 学習データのほとんどが日経平均や、1つの企業の株価データのみ
  • 勝率で計算しており、利益計算になっていない(勝率が49%でも利益が高ければ問題ないはず)
  • 売りはしないし毎日売買するつもりはないので、多くの利益が出る時に買いができればよい

のような点は、Protraと比べても劣ってます。
 

 

最終的には、ファンダメンタルズ分析や市場動向まで加味したモデルを作りたいです。

まだまだ知識も技術も足りないので、急いではいません。

テクニカル分析における代表的な指標を算出するために「TA-Lib」というライブラリを利用します。

python3.8上にTA-Libをインストール

pipコマンドでそのままではインストールできません。

https://www.lfd.uci.edu/~gohlke/pythonlibs/#ta-lib」に存在するcp38をダウンロードします。

32bitOS ⇒ TA_Lib‑0.4.17‑cp38‑cp38‑win32.whl
64bitOS ⇒ TA_Lib‑0.4.17‑cp38‑cp38‑win_amd64.whl

次に、各OSに合わせてインストール。

32bitOS

64bitOS

TA-Libで株価のテクニカル指標をチェック

Protraからトヨタ(7203)の株価をCSVとして出力して、テクニカル指標をプロットしてみます。

移動平均線

ボリンジャーバンド

MACD

RSI

「騰落レシオ」などは自分で実装が必要そうです。

※ 5日騰落レシオ = 過去5日間の値上がり銘柄数)/(過去5日間の値下がり銘柄数)×100

ですが、Pythonでクニカル分析指標を表示する程度なら非常に容易な事が分かりました。

テーブルデータを作成する

日付、株価、曜日、移動平均、ボリンジャーバンド、MACD、RSI

で、3日後の株価(3日後の始値 – 翌日始値)を予測します。

「時系列データ」としては、「移動平均」を渡すことで直接は利用しません。

最終的には銘柄毎に学習分類器を作ることで、機械学習で株価予測をしたいと考えています。

学習モデル

Kaggleなどのデータ分析コンペでテーブルデータを扱う場合、最近は取りあえずLightGBMを利用する場合が多いです。

  • 欠損値をそのまま扱える
  • カテゴリ変数の指定ができる
  • 特徴量のスケーリングが不要
  • feature importanceが確認できる
  • 精度が出やすく最終的なモデルとして残る可能性が高い
  • 比較的大きいデータも高速に扱える

ということで今回も「LightGBM」を使って解きます。

出力結果は次のようになりました。

学習モデルが重要と判断した「feature importance」を確認すると次のような順序になっています。

出来高、MACDなどが重要指標として利用されているようですが、移動平均線3日、5日などを重要視していない点は解せません。

 

 

で、肝心の正解率は53%です(学習に使う期間が短いほど正解率は高い)。

今回は、混合行列を使っているので、2値計算(上がったか下がったか)だけの計算で求めました。

利益曲線もProtraのようなシミュレーションは今は実装されていません。

とりあえず株価が+10円より大きく上がったと学習システムが判断した時のみ買いを仕掛けた場合の利益をマニュアルで確認してみます。

購入するのは一株で、計算・グラフ出力ツールとしてExcelを利用しています。

グラフを見ると右肩上がりです。過去一年だけの成績ですが。

まとめ

まだ知識も足りないし精度も低いけれど、今持っている知識で我流で機械学習で株価予想を解けた事を良しとします。

ただし、Protraのように簿価、時価、プロフィットファクターを求めたり、資産1000万円で単利計算、複利計算などが出来ないと分析が難しい。

もはや機械学習のジャンルじゃないね。

そして、株価予測が下落と予測した時は銘柄購入は不要です。

ですので、出来る限り「上昇」する確率が高いことを検知するシステムを構築する必要があります。

色々と苦労している間に優秀なサービス、ツールが出てきそうな気がします。

よく遭遇するエラー

ValueError: DataFrame.dtypes for data must be int, float or bool. Did not expect the data types in fields

pandas.DataFrameの値がLightGBMでは取り込めない文字列型になっている時に発生するエラー。

列を削除するか、ラベルエンコードが必要。

ValueError: Classification metrics can’t handle a mix of multiclass and continuous-multioutput targets

2値計算でないので2 x 2行列になりませんでした。

ソースコード

まだまだ改善の余地がありますが公開します。

タイトルとURLをコピーしました