機械学習で株価予測(騰落レシオ+株価分割対応で複数銘柄)

株式投資で利益を得るために必要な事

  • 知識ではなく(正しい手順による)練習(本人の努力)あるのみ
  • 選んだ銘柄が当たろうが外れようが、つねに勝てる状況を作り出す

そのためには、市場がもつ不確実性をかぎりなく排除する必要があります。

そして、株式投資は予測するものではなくルールに沿って選ぶものです。
 

 

機械学習で購入銘柄を選択するという魅惑の物語(4度目の正直)です。

一気に世の中のバックテストツールを超えます!!

オーバーフィッティングが発生する理由

「オーバーフィッティング(カーブフィッティング)」とはシステムを過去の相場にぴったり合うように過剰に最適化してしまうことです。

次のような理由で発生します。

  • 1 バックテスト用過去データの対象期間が短すぎる場合
  • 2 採用しているテクニカル指標が多過ぎる場合
  • 3 採用しているテクニカル指標が複雑過ぎる場合
  • 4 機械的に検出したパラメータセットをそのまま採用してしまう場合

機械学習なので「3」「4」は避けられません。

今回は「1」「2」を考えます。

重要でない説明変数を削除し、重要そうな騰落レシオを追加、加えて学習させる銘柄数を増やしてみます。

まずは株価の分割調整対策

銘柄の中には過去20年間で株価調整を行ったものもあります。

しかし残念ながら、Protraの出力するCSVファイルは株価調整がされていません。

株価調整を考慮しないと、株式分割が行われた日を境に株価が大きく変動したように見え、株価の過去データ分析ができません。

このため、SMAなどの値にも大きな影響を与えます。

ただし、Protraのソースコードを確認すると分割調整のデータを保有している事がわかりました。

分割調整したCSVを出力するには「Protra.Lib/Data/PriceData.cs」を次のように修正します。

これでCSVは手に入りました。

騰落レシオを説明変数に追加する

騰落レシオは、移動平均線、MACD、RSI、RCI等のミクロ的なテクニカル指標とは異なり、マクロ的なテクニカル指標です。

具体的には、相場の買われすぎ感(過熱感)、売られすぎ感(割安感)を教えてくれます。

そのため、市場の体温計とか、相場の体温計と言われています。

RSIなどのテクニカル指標的には下がる理由が見つからなくても、市場全体が下がっているから下落した。

というパターン分析などに有効な指標だと考えています。

計算方法

騰落レシオ=(25)日間の値上がり銘柄数合計 ÷ (25)日間の下がり銘柄数合計 × 100

となります。

なお、実装するには東証一部のリストを手に入れる必要があります。

DataFrameをインデックスで横方向に結合する

複数の銘柄の結合が必要です。

列名が重複すると concat、merge、join で動作がそれぞれ異なります。今回の用途では concatが適切です。

ignore_index=True を指定すると、列名が 0、1・・・と振りなおされます。

マルチプロセスでpandas.concatで結合する

東証一部2161銘柄のCSVファイルを読み込み計算させる必要があります。

ファイルの読み込みには並列処理を使います。

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

困った・・、メモリが足りません。

PandasやNumPyの並列処理だったり、メモリに乗り切らないデータを扱う際などにはDaskライブラリが便利です。

ただスピードが落ちるし、毎回計算するのは嫌なので困りました・・・・。

Protraで予め騰落レシオを出力させる

最後の手段はProtraで「騰落レシオ」を計算させてCSV保存し、利用します。

この方法は使いたくなかった・・・

出力した騰落レシオCSVと株価は日付のインデックスで結合します。

日付フォーマットが異なるのでゼロパディングしています。

実際にLightGBMに解かせてfeature_importances_を確認すると、機械学習が「騰落レシオ」の指標を重要視していることが伺えます。

複数銘柄で学習データ作って分析する

学習データのほとんどが日経平均や、1つの企業の株価データのみです。

そこで、ある1社(もしくは日経平均)だけでなく、9社の株価を学習させてみます。

銘柄は時価総額の高い順に1000~9000台から一つずつ選びました。

業種に対する偏りを排除するためです。

なお予測データから「3%上がる」と判断したものだけ抽出し、バックテストにかけています。

結合して一つの分類器を作る場合

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

訓練データの精度(Accuracy)は2%で、未学習・・つまり全く学習できていません。

バックテスト結果は次のようになりました。

利益曲線は次のとおりです。

全然駄目じゃん。

勝率は気にしないとして、プロフィットファクターが低すぎる。

銘柄毎に分類器を作る場合

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

こちらも訓練データの精度(Accuracy)は2%で、未学習・・つまり全く学習できていません。

バックテスト結果は次のようになりました。

利益曲線は次のとおりです。

グラフを見ると、まだこっちの方が良さそうです。

ですが、勝率51%、プロフィットファクター1.25で魅力を感じません。

まとめ

複数銘柄を一つの学習モデルで解くことが無理があったのかな・・・

でも、一般的なシステムトレードの手法なんだけどなぁ。

データ分析って仮説を検証する作業だと思ってますが、株価予測に関しては全く思ったようにいきません。

本職の人も多く、それでも上手く行って無いので、一生無理かも・・時間の無駄かな。

とりあえず、分析が足りないので今後も両方の手法でバックテストを確認してみます。

ここからがスタートなんだろうなぁ・・。

前回、勝率8割、プロフィットファクター7の過学習結果を見ただけに、ショボく見えます。

ソースコード

あまり曲線がキレイでなく、前回のコードに前述のソースコードを加えるだけなので省略します。

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