羽田空港は全空港職員がマスクをし、利用客も7割がマスクをしています。
一方で、アメリカの空港に着いた途端にマスク着用率は一気に2割にまで下がります。
アメリカのテレビキャスターも
「マスクはウイルスにかかった人が周りへの配慮でするもので、予防的につけるものではない」
と言っており、マスクとは東洋の習慣、または迷信でしかないという位置づけのようです。
日本ではオイルショックのような状態です。
マスクを三連休に買おうと色々な薬局スーパの開店時に並びましたが、そもそも入荷がありません。
【引用】誰かのツイート(下北沢の薬局にて)
このような状況になることを予測していませんでした・・・・。
今では、会議やセミナー開催にはマスク着用が必要な状態です。
今まで「機械学習と株価予測」を合体して色々と実験してきました。
- 【14回目】機械学習による株価予測(導き出たのは斉藤正章氏の手法)
- 【13回目】機械学習を使った株価予測(LightGBMをOptunaでパラメータチューニング)
- 【12回目】機械学習を使った株価予測(pandas-profiling、create_tree_digraphで可視化する)
- 【11回目】機械学習を使った株価予測(ファンダメンタルズ指標導入でAUC=0.70超え)
- 【10回目】機械学習を使った株価予測(関連論文・サイトを調査してみる)
- 【9回目】機械学習で株価予測(年利・勝率向上の分析)
- 【8回目】機械学習で株価予測(交差検証+ROC 曲線とAUCで脱過学習)
これは、ヘッジファンド転職を夢見て「株の自動売買」に挑戦し、詰みかけている一人の中年男の物語です。
今回は機械学習を使ってストラテジーの拡張が可能か実験してみます。
ストラテジー改善に機械学習を使ってみる
「勝率53.90%」の三点チャージ法があります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
[年度別レポート] 年度 取引回数 運用損益 年利 勝率 PF 最大DD 2020年 17回 ¥80,085円 4.91% 58.82% 2.60倍 -6.35% 2019年 83回 ¥365,654円 22.44% 50.60% 1.50倍 -13.65% 2018年 157回 ¥913,193円 56.04% 56.05% 1.78倍 -21.38% 2017年 42回 ¥235,986円 14.48% 69.05% 1.80倍 -17.16% 2016年 95回 ¥130,939円 8.04% 55.79% 1.16倍 -10.75% 2015年 88回 ¥499,718円 30.67% 55.68% 1.56倍 -23.33% 2014年 114回 ¥720,668円 44.23% 57.89% 1.85倍 -11.64% 2013年 81回 ¥785,912円 48.23% 60.49% 2.33倍 -13.59% 2012年 95回 ¥205,930円 12.64% 48.42% 1.28倍 -9.04% 2011年 123回 ¥965,942円 59.28% 58.54% 1.54倍 -46.52% 2010年 130回 ¥1,343,799円 82.47% 52.31% 2.42倍 -14.50% 2009年 137回 ¥791,292円 48.56% 56.93% 1.46倍 -23.33% 2008年 262回 ¥1,062,259円 65.19% 50.76% 1.25倍 -34.55% 2007年 204回 ¥1,503,944円 92.29% 53.92% 1.86倍 -16.04% 2006年 155回 ¥1,014,000円 62.23% 48.39% 1.53倍 -31.47% 2005年 50回 ¥828,960円 50.87% 70.00% 3.46倍 -18.01% 2004年 84回 ¥1,001,500円 61.46% 67.86% 2.21倍 -21.12% 2003年 88回 ¥1,224,500円 75.15% 61.36% 2.50倍 -25.79% 2002年 157回 ¥2,060,200円 126.43% 60.51% 2.72倍 -20.41% 2001年 158回 ¥972,500円 59.68% 48.73% 1.54倍 -34.49% 2000年 129回 ¥1,255,100円 77.02% 60.47% 2.02倍 -18.50% |
単調増加していますが勝率が低いのが難点です。
この勝率が機械学習によって上がるか確かめてみます。
前回気づいた下記の実験です。
作ったストラテジーに、あとは何の指標を追加すれば勝率が上がるか?最適なパラメーターは何?を自動的に出力はできそうです。
売買履歴を分類する
Protraの売買履歴を抽出してみます。
これをテキストにコピー&ペーストして「CSV」で保存した後に次のようなPythonスクリプトを実行します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
import csv import numpy as np import pandas as pd file = "soneki.csv" df = pd.read_csv(file, skiprows=0, skipfooter=0, engine="python", names=("date", "code", "name", "close", "num", "buy_sell")).iloc[::-1] df["buy_sell"] = df["buy_sell"].map({"買": 0, "売": 1}).astype(int) #display(df) output = [] for i in range(df.shape[0]): if (df.buy_sell.values[i] == 0): #print(df.name.values[i]) for j in range(df.shape[0] - i - 1): n = i + j + 1 if ((df.name.values[i] == df.name.values[n]) and (df.buy_sell.values[n] == 1)): close = df.close.values[n] - df.close.values[i] output.append([df.date.values[i], df.code.values[i], df.name.values[i], str(close)]) break with open("output.csv", mode='w') as f: writer = csv.writer(f, lineterminator="\n") writer.writerows(output) |
これにより、各日の売買が「勝った」「負けた」かどうかが判別できるようになります。
これを二値の目的変数で分類すれば機械学習が利用できます。
説明変数を追加する
銘柄に対する過去の株価データを呼び出し、以前作成した説明変数追加処理を適用してみます。
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 |
if __name__ == '__main__': df_test = create_df_test() df_train = pd.DataFrame() list_code = [] for i in range(df_test.shape[0]): c = str(df_test.code.values[i]) if not (c in list_code): list_code.append(c) d = "\\" + str(c[0]) file = "C:\\Users\\Desktop\\stock\\Protra\\data\\price\\" df = pd.read_csv(file + d + "\\" + c + ".csv", skiprows=0, skipfooter=0, engine="python", names=("date", "open", "high", "low", "close", "volume")) df["code"] = int(c) # 前処理 df = pre_processing(df) df_train = pd.concat([df_train, df]) df_train = pd.merge(df_train, df_test, on=["date", "code"], how="outer") df_train = df_train.dropna(subset=["target1"]) df_train = df_train.drop("code", axis=1) df_train = df_train.drop("name", axis=1) df_train = df_train.drop("target", axis=1) df_train = df_train.rename(columns={'target1': 'target'}) #display(df_train) df_test = df_train df_train.to_csv("check.csv") |
これにより、出力されたCSVファイルは次のような形式となっています。
この説明変数の中で勝率アップに最適な変数とパラメータを機械学習にもとめてもらいます。
因みに、銘柄数2000〜3000で処理時間が3〜5時間ぐらいかかります(100銘柄単位で処理すれば10分程度の処理時間になります)。
機械学習を適用する
では、LightGBMで深さ1で機械学習を行います。
1 2 3 4 5 |
Starting cross_validation. Train shape: (2449, 27), test shape: (2449, 26) Plotting tree with graphviz... Plotting tree with graphviz... Full AUC score 0.744120 [0.34730453 0.33906968 0.70892312 ... 0.44002356 0.95360379 0.66590703] |
「AUC精度」は0.74なので悪くありません。
ツリーをcreate_tree_digraphで可視化してみます。
「前日比(終値)」がもっとも有効な指標と出力されました。
確認のために、x軸に前日差分値、y軸に「勝ち(1)」「負け(0)」をとった場合の散布図を作ってみると次のようになります。
なんとなく0.991で分割すると、負け売買を減らせそうな気がします。
これはいけるか!!
バックテスト結果
【買い手法】
- 三点チャージ法
- 前日比(終値)0.991より大きい
では、バックテスト結果です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
[年度別レポート] 年度 取引回数 運用損益 年利 勝率 PF 最大DD 2020年 7回 ¥88,385円 5.15% 100.00% ∞倍 0.00% 2019年 35回 ¥72,000円 4.19% 51.43% 1.39倍 -6.61% 2018年 73回 ¥200,800円 11.70% 56.16% 1.36倍 -14.19% 2017年 12回 ¥46,500円 2.71% 58.33% 1.55倍 -7.83% 2016年 45回 ¥167,379円 9.75% 55.56% 1.53倍 -8.52% 2015年 42回 ¥438,268円 25.53% 57.14% 2.06倍 -24.07% 2014年 43回 ¥839,480円 48.90% 72.09% 4.67倍 -10.43% 2013年 37回 ¥511,700円 29.81% 70.27% 2.97倍 -13.14% 2012年 47回 -¥321,988円 -18.76% 42.55% 0.43倍 -22.15% 2011年 54回 ¥1,180,826円 68.78% 66.67% 4.07倍 -14.58% 2010年 54回 -¥136,000円 -7.92% 42.59% 0.75倍 -13.14% 2009年 81回 ¥663,058円 38.62% 60.49% 2.03倍 -15.54% 2008年 188回 ¥1,334,141円 77.71% 53.72% 1.54倍 -20.93% 2007年 115回 ¥576,800円 33.60% 48.70% 1.48倍 -15.66% 2006年 85回 ¥930,900円 54.22% 57.65% 1.98倍 -22.14% 2005年 12回 ¥85,200円 4.96% 50.00% 1.63倍 -18.19% 2004年 20回 ¥90,000円 5.24% 45.00% 1.59倍 -9.09% 2003年 32回 ¥458,800円 26.72% 65.63% 2.38倍 -25.79% 2002年 68回 ¥284,800円 16.59% 55.88% 1.32倍 -25.20% 2001年 84回 ¥652,100円 37.98% 63.10% 2.08倍 -15.70% 2000年 35回 ¥60,600円 3.53% 48.57% 1.18倍 -12.50% |
あれれ・・・・
- 購入銘柄数・2449→1169
- 勝率・・・・53.90%→53.64
- 平均利益・・7334円→7035円
- PF・・・・・1.73→1.73
むしろ悪くなっています。
そして年度別レポートでも、勝てない年が増えてしまいました。
因みに、符号を逆にしてみると「勝率53.97%」と僅かに上り、利益曲線も単調増加になります。
1 2 3 4 5 6 7 8 9 10 |
全トレード数 2114 勝ちトレード数(勝率) 1141(53.97%) 負けトレード数(負率) 973(46.03%) 必要資金 ¥1,631,000 純利益 ¥15,354,130 プロフィットファクター 1.72 平均年利 44.83% 平均年利(直近5年) 21.61% 最大連勝 13回 最大連敗 7回 |
なんだこりゃ・・・・。
まとめ
結果は散々たるものでした。
疲れたよ・・・パトラッシュ・・・。
やり方、考え方は間違って無い・・・と思うんだけどなぁ。
各年の勝率だけ見ると良くなっている年が多いです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
年度 before after 2020年 58.82% 100.00% 2019年 50.60% 51.43% 2018年 56.05% 56.16% 2017年 69.05% 58.33% 2016年 55.79% 55.56% 2015年 55.68% 57.14% 2014年 44.23% 72.09% 2013年 60.49% 70.27% 2012年 48.42% 42.55% 2011年 58.54% 66.67% 2010年 52.31% 42.59% 2009年 56.93% 60.49% 2008年 50.76% 53.72% 2007年 53.92% 48.70% 2006年 48.39% 57.65% 2005年 70.00% 50.00% 2004年 67.86% 45.00% 2003年 61.36% 65.63% 2002年 60.51% 55.88% 2001年 48.73% 63.10% 2000年 60.47% 48.57% |
2020年は勝率100%になってるし、機能しているっぽいです。
となると、目的変数「勝ち(1)」「負け(0)」の二値が悪かったのかな・・・・うーん。
要調査です。