ねほり.com

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

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

   

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

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

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

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

 

機械学習で購入銘柄を選択するという魅惑の物語(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の過学習結果を見ただけに、ショボく見えます。

ソースコード

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

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

  関連記事

「手品 種明かし」「簡単なハッキング」で訪問する客が多い

悲しいとき~(悲しいとき~) goo国語辞書で必要な熟語が見つからなかったのに …

「ついに証明された、新型コロナは空気感染する」はデマか?本当か?

新型コロナウイルスがまだ猛威を奮っています。   薬局に開店前に40分 …

動画配信サービスのビジネスモデル(アメリカ編)

現在 日本のライブストリーミングでは、 ニコニコ生放送(ニコ生) Twit Ca …

斉藤正章氏の手法の有効性検証(protraシストレ)

Protraに慣れてないので、まだまだ巷のサンプルソースコードを入手したい。 ・ …

月単位の利益を出力してみる(システムトレード)

世界的な株の下落が始まりました。 [8/5]米国株、ダウ続落で767ドル安 下げ …

エンジニアによる品質保証(品質説明力編)

「バグ出しのテスト」をすれば品質が保証できると思いがちですが、そうではありません …

社内アイデアソンって参加するだけアイデア損

アイデアソンに参加したり、社内の文化祭的イベントで色々なプロト実装をしています。 …

機械学習を使った株価予測(pandas-profiling、create_tree_digraphで可視化する)

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

社内アイデアコンテストに9件提出して部門長奨励賞を頂く

やり切りました。。 ホールの1ブロック占拠して、9件のデモを展示しました。 顔を …

NW-X1060のフォルダ再生対応スクリプト作成

2009年07月05日(日) NW-X1060でフォルダ再生させる テニス部ヘッ …