ファンダメンタルズ指標(PER、PBR)を用いた機械学習による株価予測

スポンサーリンク

以前

「釣れる日・釣れる場所を機械学習で予測する!」

という記事を書いたことがある。

 

(C)底辺領主の勘違い英雄譚 – ぱらボら/馬路まんじ/ファルまろ

 

この記事に対して

「社内で開催している『AIコンテスト』に応募してみたら?」

という連絡を貰ったので応募してみた。

応募総数は250件以上の中で、

 
 
 

結果、2位(プロト賞)を受賞した!

 

 

「釣れる日」と「釣れる場所」を機械学習で予測してみる(社内プロト賞受賞)
魚がちっとも釣れない。そもそも魚のいない場所に餌を垂らしても釣れるわけがない。例えば回遊魚であるアジやサバを狙うのなら、岸近くで回遊してくれないと釣れない。けれど、いつ・どの場所に回遊して来るのか分からない。...

 
 

応募タイトル

「明日朝6時に○湾で釣ったらアジが30匹釣れるってよ」

 
 

いつも通り ブレないふざけたタイトルww

司会者の女性の社員が普通に読み上げてくれたわww

 

サステナビリティ(持続可能)な社会に繋がる……

とか

漁業に対する可能性を広げた……

 

とかが受賞理由らしい。

 

 

勝手に拡大解釈してくださりありがとございますm(_ _)m

単にプロト実装応募数が少ないから受賞できた気がするけどねww

 

近年の私の受賞履歴

 

年度 内外 内容 賞金
2021年 社内 社内AIコンテストでプロト賞受賞 3万円相当
2020年
2019年 社外 地元公園の写生大会で入賞受賞 1000円相当
2018年 社外 The Japan News翻訳コンテストで佳作受賞 500円相当
2017年 社内 事業部門MVP 2017を受賞 1万円相当
2016年 社内 社内アイデアコンテストで部門長奨励賞を受賞 0円

 

昨年(2020年度)は一体 何をしていたんだろう……。

機械学習による株価予測も進めてみた。

で、この株価予測もAIコンテストに応募してみた。

 
 
 

結果:箸にも棒にもかからなかったww

 
 

会社に自分が真剣にやってることを認められた事がないわww

まぁ絶対受賞しないと思ったから、同じ技術を漁業に代用して応募したんだけどね。

 

因みに、機械学習による株価予測したい人は過去記事が参考になると思う。

どうでも良いけど「アイデアソン/ハッカソン」は、実現性が30%~70%なネタを選ぶのが良いらしい。

スポンサーリンク

ファンダメンタルズ指標を取り入れる

今まで100近いストラテジーを実装してきたが、システムトレーダーって

 

日付、始値、高値、安値、終値、出来高

 

という情報だけをこねくり回し

 

  • 2本の移動平均線が〇〇となったら「買い(又は売り)」
  • ストキャスティクスとMACDが〇〇だったら「買い(又は売り)」
  • 寄り付きから〇円以上上昇した後、〇円変動したら「買い(又は売り)」
  • 日経が〇〇だったら「買い(又は売り)」
  • 移動平均乖離率が〇〇%以上だったら「買い(又は売り)」

 

とイミフな組み合わせを見つける行為に過ぎない。

 

まるで化学式を知らなかった中世の錬金術師が

 

石炭などの素材から金を生成する

 

ために素材の組み合わせや比重を変えて取り組んでいたのと同じに見える。

 

そもそも発想がチープなんじゃない?

NYダウとか10年国債とか外部データを使うイザナミユーザーもいるけれどさ、もっと使えるデータあるでしょ!!

 

そう。

 

ファンダメンタルズ指標

 

前置きが長くなったけど、前回のブログで、ファンダメンタルズ指標を定期的に取得する方法を説明した。

システムトレードのために定期的にファンダメンタルズ指標を取得
J-Quants データ分析コンペではファンダメンタルズ指標を使った機械学習による株式売買が行われていた。株価は、過去の実績よりも将来の業績を織り込んで動くことが多いので当然必要な指標だと思う。以前、ファンド務めのプ...

このブログは実は一年前に記載して非公開だったもの。

つまり、既にファンダメンタルズ指標は一年分溜まっている。

今回は早速このデータを使って機械学習によりバックテストを試みる。

バックテストに利用したストラテジーのおさらい

ファンダメンタルズ指標を使ったとしても比較のためにストラテジーは変えてない。

【資金管理条件】

  • 銘柄選定(時価総額ランキングTop20位)
  • 1回の購入資金 (50万円)
  • 投資総額 (300万円)
  • 単利運用

【買いルール】

  • 3日後の始値が50%以上の確率で3%以上 上がると判断した場合に翌日の始値で買い

【手仕舞いルール】

  • 3日経過したら翌日の始値で手仕舞い

【機械学習データ】

  • [目的変数] 翌日の始値から3日後の始値が3%以上上がったもの
  • [学習モデル] 勾配ブースティング(LightGBM)
  • [モデル評価] KFold(K-分割交差検証)

もはや機械学習のコードの中身は完全に覚えてないな……。

でも、テーブルデータさえ作れば、どんなデータでも勝手に結果を算出してくれるので便利だね。

機械学習に使った説明変数(指標)は何か?

次の32個を用意した。

【通常(システムトレード用)データ】

全部で7個。

  • 日付、始値、高値、安値、終値、出来高、曜日

【テクニカル指標】

全部で25個。計算して求めている。

  • 移動平均(3日、15日、50日、75日、100日)
  • ボリンジャーバンド(σ1、σ2、σ3)
  • MACD(シグナル、ヒストグラム)
  • RSI(9日、14日)
  • ADX(平均方向性指数)
  • CCI(商品チャンネル指数(Commodity Channel Index))
  • ROC(rate of change)
  • ADOSC(チャイキンオシレーター:A/DのMACD)
  • ATR(Average True Range)
  • 移動平均乖離率(5日、15日、25日)
  • 前日比(1日、2日、3日)
  • VR(Volume Ratio)

テクニカル指標は何年もやってきたし、もっと増やせるだろうね。

【ファンダメンタルズ指標】

全部で11個。

  • PER
  • PBR
  • 利回り
  • 信用倍率
  • 時価総額
  • (当期)純利益
  • EPS
  • 発行済株式総数
  • 1株当たりの純資産
  • ROE
  • 自己資本

 
 

これらを機械学習に突っ込む。

結果、今回の指標で学習過程で重要だとLightGBMが判断したもの(特徴量としての寄与度)は次のとおり。

ファンダメンタル指標としては「時価総額(price)」「曜日(day)」「利回り(rate)」などが上位のようだ。

 
 

曜日ってアノマリーかよww

アノマリー

一般的には、いわゆる法則や理論から合理的な説明ができない現象。
例をあげると「月曜日の株安」や「週末の株高」など。

あまり信用できないのかも……。

実装変更部分

以前は一度株価をCSVに落としていたが、Protraのバイナリ管理方法が分かったので直接株価を読み込んでいる。超楽。

1日は86,400秒のプレゼント。C#のBinaryReaderとDateTimeをPythonに変換
次のような銀行があると、考えてみましょう。その銀行は、毎朝あなたの口座へ86,400ドル振り込んでくれます。同時に、その口座の残高は毎日ゼロになります。...

ファンダメンタル指標は毎日CSVを更新しており、それを読み込んだ。

あとは、CSVファイルを読み込んで結合するだけで、勝手に機械学習が答えを出してくれる。

早いし簡単だね。

AUC scoreは「0.717633」だった。

機械学習による株価予測の期待値検証

計算時間は機械学習含めて前述のとおり3分。

早いし自動的にパラメータ調整してくれるし、これで儲かるなら、機械学習の方が断然良い。

結果は次のとおり。

利益曲線は、次の通り。

ファンダメンタルズ指標が1年分しか無いので、有効性があるのか分からん。

一応、利益は出ているっぽい。

機械学習を検討していた時はカーブフィッティングに泣かされ諦めた。

この結果は、まだワンチャンスあるんじゃない?

ファンダメンタル指標が無い場合・ある場合との比較

さて「ファンダメンタル指標」が特徴量としての寄与度に貢献している感はあるが、ファンダメンタルズ指標を使う前の結果が分かってない。

データ期間を同じにした学習データを利用して「ファンダメンタルズ指標あり・なし」の実験してみた。

ファンダメンタルズ指標なしの場合のAUC scoreは「0.733128」だった。

バックテスト結果は次のとおり。

利益曲線は、次の通り。

……うーん、よくわからない。

この結果を見る限り、ファンダメンタルズ指標を使ったほうが多少は純利益が高い。

でも雀の涙程度の違いだ。

まとめ

ファンダメンタル指標も機械学習による株価予測に導入した。

効果は残念ながらデータが少なすぎなのか よく分からない。

ただ早いし、これで本当に儲かるなら旧式システムトレードより機械学習が良い。

とりあえずシグナルを毎日出しながら、フォワードテストをやってみる。

ソースコード

バックテストには無料OSSの「Protra」を利用した。

今回は、前回GitHubに置いたソースコードに対して前述のコードを追加するだけなので割愛する。

そもそもファンダメンタルデータが無いと動作しないだろうしね。

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