ねほり.com

何もないから何かみつかる

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

      2020/01/28

以前、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行列になりませんでした。

ソースコード

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

 - 2020年(社会人16年), 機械学習, システムトレード, テクノロジー

  関連記事

Java Appletで麻雀ゲームを実装することに挑戦するも・・

やばいぞ~!!    最近本当に何もしていない~!&nbsp …

printf関数が自作できないと「C言語が書ける」と言うなかれ

2005年07月10日(日) C言語 プリンタを購入。やっぱ必要になりました・・ …

線形近似を実装して求めた優良株

2007年12月25日(火) 私の資金じゃ買えませんが・・・ 「女性なんて星の数 …

NYダウを利用した逆張りの有効性検証(システムトレード)

明日から一週間、海外出張です・・・毎月あるね。     NY …

未来の株価をチートしてました・・・(protraシストレ)

未来の株価をチートしてました・・・。 そもそも、誤実装で夢のような手法ができるは …

斉藤学氏の逆張りストラテジーの有効性検証(protraシストレ)

テクニカル分析は、株よりFXの方が盛んです。 今回はFXのテクニカル手法を東証一 …

Windows2000をインストールしたらマウスから変な音が聞こえる

Windows2000へとうとう変更するときが来た。  なぜしないとい …

JSのグラフライブラリ・アニメーションライブラリの現状トレンド

JSライブラリは多種多様に存在する。 グラフィックライブラリのトレンド グラフィ …

投資機関の自動売買・支援ツール状況まとめ

日足のRSIやらMACDなどテクニカル指標を足したり引いたりするシステムトレード …

cosisin氏のスイング逆張り手法の有効性検証1(protraシストレ)

今年度に入って書いた日記は全て株の話でした。 理由の一つは、海外ヘッジファンドの …