ねほり.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年), 機械学習, システムトレード, テクノロジー

  関連記事

VinePlus(3.0系列)に私の自作ソフト掲載決定

February 15, 2005 なにやら一通のメールが届いてました。 &nb …

主成分分析が固有値問題となる理由

行列には「固有値」や「固有ベクトル」、統計には「分散」や「共分散」があるというの …

斉藤正章氏の「順張り買い」手法の有効性検証(システムトレード)

8月6日です。広島原爆の日です。今日は一日、平和の事を考えて過ごす日です。 昨日 …

機械学習で株価予測(交差検証+ROC 曲線とAUCで精度65%)

日本では5つの要因でサラリーマンの給料は上りません。 ① 労働組合の弱体化 ② …

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

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

アノマリー(曜日)の有効性検証(protraシストレ)

バックテスト環境を構築できたら、検証したかった一つに「アノマリー」があります。 …

3日続落投資法の有効性検証(protraシストレ)

テクニカルトレードは聖杯でない・・・ と前回書いたけど、結局テクニカルトレードっ …

「中振連」サイト作成業務をしつつ「名刺」を作ることにした

あ~気まぐれ日記とは言え、書くときは連続で本当に書くなぁ…。  &nb …

4点チャージ投資法の有効性検証(protraシストレ)

3点チャージ投資法というのは下落相場において、多くの銘柄に売買サインが出ます。 …

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

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