以前
「釣れる日・釣れる場所を機械学習で予測する!」
という記事を書いたことがある。
(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
まぁ絶対受賞しないと思ったから、同じ技術を漁業に代用して応募したんだけどね。
因みに、機械学習による株価予測したい人は過去記事が参考になると思う。
- 【16回目】機械学習(LightGBM)を使った株価予測入門
- 【15回目】機械学習による株価予測(3点チャージ法を改良する→失敗)
- 【14回目】機械学習による株価予測(導き出たのは斉藤正章氏の手法)
- 【13回目】機械学習を使った株価予測(LightGBMをOptunaでパラメータチューニング)
- 【12回目】機械学習を使った株価予測(pandas-profiling、create_tree_digraph可視化)
- 【11回目】機械学習を使った株価予測(ファンダメンタルズ指標導入でAUC=0.70超え)
- 【10回目】機械学習を使った株価予測(関連論文・サイトを調査してみる)
- 【9回目】機械学習で株価予測(年利・勝率向上の分析)
どうでも良いけど「アイデアソン/ハッカソン」は、実現性が30%~70%なネタを選ぶのが良いらしい。
ファンダメンタルズ指標を取り入れる
今まで100近いストラテジーを実装してきたが、システムトレーダーって
日付、始値、高値、安値、終値、出来高
という情報だけをこねくり回し、
- 2本の移動平均線が〇〇となったら「買い(又は売り)」
- ストキャスティクスとMACDが〇〇だったら「買い(又は売り)」
- 寄り付きから〇円以上上昇した後、〇円変動したら「買い(又は売り)」
- 日経が〇〇だったら「買い(又は売り)」
- 移動平均乖離率が〇〇%以上だったら「買い(又は売り)」
とイミフな組み合わせを見つける行為に過ぎない。
まるで化学式を知らなかった中世の錬金術師が
石炭などの素材から金を生成する
ために素材の組み合わせや比重を変えて取り組んでいたのと同じに見える。
そもそも発想がチープなんじゃない?
NYダウとか10年国債とか外部データを使うイザナミユーザーもいるけれどさ、もっと使えるデータあるでしょ!!
そう。
ファンダメンタルズ指標
前置きが長くなったけど、前回のブログで、ファンダメンタルズ指標を定期的に取得する方法を説明した。
このブログは実は一年前に記載して非公開だったもの。
つまり、既にファンダメンタルズ指標は一年分溜まっている。
今回は早速このデータを使って機械学習によりバックテストを試みる。
バックテストに利用したストラテジーのおさらい
ファンダメンタルズ指標を使ったとしても比較のためにストラテジーは変えてない。
【資金管理条件】
- 銘柄選定(時価総額ランキング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のバイナリ管理方法が分かったので直接株価を読み込んでいる。超楽。
ファンダメンタル指標は毎日CSVを更新しており、それを読み込んだ。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
# CSVのファンダメンタル指標読み込み def read_per(df, stock_id, skiprows, skipfooter): file = "out/" + str(stock_id) + ".csv" if not os.path.exists(file): print("[Error] " + file + " does not exist.") return None, False else: df2 = pd.read_csv(file, skiprows=skiprows, skipfooter=skipfooter, engine="python", header=1, # ヘッダを飛ばす names=("date", "per", "pbr", "rate", "debt", "price"), # For "ValueError: DataFrame.dtypes for data must be int, float or bool." ) # 欠落値を0に変更 df2 = df2.replace({'per' : {'-': '0'}}) df2 = df2.replace({'pbr' : {'-': '0'}}) df2 = df2.replace({'rate' : {'-': '0'}}) df2 = df2.replace({'debt' : {'-': '0'}}) df2 = df2.replace({'price': {'-': '0'}}) df2[['per', 'pbr', 'rate', 'debt', 'price']] = \ df2[['per', 'pbr', 'rate', 'debt', 'price']].astype('float') close = df['close'] df2['profit'] = df2['price'] / df2['per'] # (当期)純利益 df2['eps'] = close / df2['per'] df2['sum'] = df2['eps'] * df2['profit'] # 発行済株式総数 df2['asset'] = close / df2['pbr'] # 1株当たりの純資産 df2['roe'] = df2['pbr'] / df2['per'] df2['capital'] = df2['profit'] / df2['roe'] # 自己資本 df2 = df2.replace('(.*)-(.*)-(.*)', r'\1/\2/\3', regex=True) return df2, True |
あとは、CSVファイルを読み込んで結合するだけで、勝手に機械学習が答えを出してくれる。
1 2 3 4 |
df, val = read_protra_stock(stock_id, 50, 50) df2, val2 = read_per(df, stock_id, 0, 0) if (val2): df = pd.merge(df, df2, on='date') |
早いし簡単だね。
AUC scoreは「0.717633」だった。
機械学習による株価予測の期待値検証
計算時間は機械学習含めて前述のとおり3分。
早いし自動的にパラメータ調整してくれるし、これで儲かるなら、機械学習の方が断然良い。
結果は次のとおり。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
株価データ: 日足 銘柄リスト: 時価総額ランキングTop20 2021/02/01~2021/10/27における成績です。 ---------------------------------------- 全トレード数 296 勝ちトレード数(勝率) 183(61.82%) 負けトレード数(負率) 113(38.18%) 全トレード平均利率 1.02% 勝ちトレード平均利率 2.66% 負けトレード平均損率 -1.64% 勝ちトレード最大利率 13.56% 負けトレード最大損率 -6.34% 全トレード平均期間 4.88 勝ちトレード平均期間 5.00 負けトレード平均期間 4.67 ---------------------------------------- 必要資金 ¥8,353,700 最大ポジション(簿価) ¥8,783,400 最大ポジション(時価) ¥9,097,900 純利益 ¥2,507,100 勝ちトレード総利益 ¥3,919,700 負けトレード総損失 -¥1,412,600 全トレード平均利益 ¥8,470 勝ちトレード平均利益 ¥21,419 負けトレード平均損失 -¥12,501 勝ちトレード最大利益 ¥81,100 負けトレード最大損失 -¥62,500 プロフィットファクター 2.77 最大ドローダウン(簿価) -¥170,200 最大ドローダウン(時価) -¥286,000 ---------------------------------------- 現在進行中のトレード数 7 ---------------------------------------- 平均年利 30.01% 平均年利(直近5年) 6.00% 最大連勝 12回 最大連敗 5回 ---------------------------------------- [年度別レポート] 年度 取引回数 運用損益 年利 勝率 PF 最大DD 2021年 296回 ¥2,507,100円 30.01% 63.18% 2.77倍 -6.34% ---------------------------------------- [年度別ドローダウンレポート] 年度 最大DD(簿価) 最大DD(時価) 2021年 -¥62,500(2021/08/20) -¥92,000(2021/08/16) ---------------------------------------- [月別レポート] [2021年] 月度 取引回数 運用損益 勝率 PF 最大DD 12月 0回 ¥0円 NaN NaN倍 0.00% 11月 0回 ¥0円 NaN NaN倍 0.00% 10月 33回 ¥87,300円 54.55% 1.37倍 -5.02% 9月 15回 ¥164,900円 46.67% 4.54倍 -1.86% 8月 40回 ¥54,100円 55.00% 1.18倍 -6.34% 7月 42回 -¥58,000円 47.62% 0.81倍 -3.82% 6月 32回 ¥272,500円 68.75% 2.82倍 -3.95% 5月 41回 ¥554,600円 80.49% 7.09倍 -3.45% 4月 34回 ¥116,600円 50.00% 1.59倍 -4.25% 3月 26回 ¥533,100円 88.46% 18.77倍 -1.85% 2月 33回 ¥782,000円 75.76% 13.93倍 -4.86% 1月 0回 ¥0円 NaN NaN倍 0.00% |
利益曲線は、次の通り。
ファンダメンタルズ指標が1年分しか無いので、有効性があるのか分からん。
一応、利益は出ているっぽい。
機械学習を検討していた時はカーブフィッティングに泣かされ諦めた。
この結果は、まだワンチャンスあるんじゃない?
ファンダメンタル指標が無い場合・ある場合との比較
さて「ファンダメンタル指標」が特徴量としての寄与度に貢献している感はあるが、ファンダメンタルズ指標を使う前の結果が分かってない。
データ期間を同じにした学習データを利用して「ファンダメンタルズ指標あり・なし」の実験してみた。
ファンダメンタルズ指標なしの場合のAUC scoreは「0.733128」だった。
バックテスト結果は次のとおり。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
株価データ: 日足 銘柄リスト: 時価総額ランキングTop20 2021/01/29~2021/10/25における成績です。 ---------------------------------------- 全トレード数 277 勝ちトレード数(勝率) 171(61.73%) 負けトレード数(負率) 106(38.27%) 全トレード平均利率 1.05% 勝ちトレード平均利率 2.67% 負けトレード平均損率 -1.57% 勝ちトレード最大利率 13.56% 負けトレード最大損率 -7.60% 全トレード平均期間 4.84 勝ちトレード平均期間 4.97 負けトレード平均期間 4.63 ---------------------------------------- 必要資金 ¥9,152,800 最大ポジション(簿価) ¥9,152,800 最大ポジション(時価) ¥9,533,100 純利益 ¥2,327,000 勝ちトレード総利益 ¥3,618,300 負けトレード総損失 -¥1,291,300 全トレード平均利益 ¥8,401 勝ちトレード平均利益 ¥21,160 負けトレード平均損失 -¥12,182 勝ちトレード最大利益 ¥81,100 負けトレード最大損失 -¥58,400 プロフィットファクター 2.80 最大ドローダウン(簿価) -¥200,700 最大ドローダウン(時価) -¥287,900 ---------------------------------------- 現在進行中のトレード数 6 ---------------------------------------- 平均年利 25.42% 平均年利(直近5年) 5.08% 最大連勝 10回 最大連敗 5回 ---------------------------------------- [年度別レポート] 年度 取引回数 運用損益 年利 勝率 PF 最大DD 2021年 277回 ¥2,327,000円 25.42% 64.26% 2.80倍 -7.60% ---------------------------------------- [年度別ドローダウンレポート] 年度 最大DD(簿価) 最大DD(時価) 2021年 -¥58,400(2021/09/10) -¥73,700(2021/05/31) ---------------------------------------- [月別レポート] [2021年] 月度 取引回数 運用損益 勝率 PF 最大DD 12月 0回 ¥0円 NaN NaN倍 0.00% 11月 0回 ¥0円 NaN NaN倍 0.00% 10月 32回 -¥137,000円 43.75% 0.62倍 -7.60% 9月 21回 ¥228,900円 66.67% 2.79倍 -6.53% 8月 35回 ¥3,900円 54.29% 1.02倍 -4.95% 7月 33回 ¥96,900円 48.48% 1.49倍 -3.49% 6月 32回 ¥359,400円 68.75% 5.16倍 -3.67% 5月 32回 ¥371,800円 78.13% 6.14倍 -1.99% 4月 28回 ¥128,500円 50.00% 2.17倍 -1.95% 3月 32回 ¥704,600円 93.75% 42.45倍 -1.85% 2月 32回 ¥570,000円 75.00% 9.53倍 -4.86% 1月 0回 ¥0円 NaN NaN倍 0.00% |
利益曲線は、次の通り。
……うーん、よくわからない。
この結果を見る限り、ファンダメンタルズ指標を使ったほうが多少は純利益が高い。
でも雀の涙程度の違いだ。
まとめ
ファンダメンタル指標も機械学習による株価予測に導入した。
効果は残念ながらデータが少なすぎなのか よく分からない。
ただ早いし、これで本当に儲かるなら旧式システムトレードより機械学習が良い。
とりあえずシグナルを毎日出しながら、フォワードテストをやってみる。
ソースコード
バックテストには無料OSSの「Protra」を利用した。
今回は、前回GitHubに置いたソースコードに対して前述のコードを追加するだけなので割愛する。
そもそもファンダメンタルデータが無いと動作しないだろうしね。