昨今にわかに機械学習をトレードに応用する流れが出てきてるように感じます
やってみたブログも多いですし、機械学習トレードのサービスもいくつか世に出てきているものもあります。
AIトレードと称した詐欺のような案件もあったそう。
Deep Learningが凄いと言われている中、トレードに対して応用できるのか?という疑問が出てくるのは当然かと思います。
機械学習でトレードは勝てるのか?という疑問に対して、あくまで個人的な経験を元にした考察を書き記したいと思います。
単に機械学習を利用しただけでは勝てない
ヒストリカルデータを機械学習させただけでは勝てないと思います。
なぜ勝てないと言うのは、単純にこれまでめちゃくちゃ沢山色々検証したけど、全く勝てなかったからです。(自分のトレードの学習も、ヒストリカルの学習も両方やったが、やはり自学習のほうが平均的に有意な結果が多かったです)
検証の一例を下記に記します。
ヒストリカルデータ学習 vs 過去検証データ学習
自身が現状最適と考えている学習条件で検証します。
比較として用いるのは、私が独自で考えたAIです。これは、自分が過去検証ソフトを使用して、実際に裁量トレードを再現し、そのトレード結果を元に学習させるというシステムです。(詳細は後ほど説明します)
日経平均のヒストリカルデータ学習(PF=0.8,勝率47%)

日経平均の過去検証データ学習結果(PF=1.9,勝率60%)


ビットコインのヒストリカルデータ(PF=1.1,勝率46%)

ビットコインの過去検証データ学習(PF=1.7,勝率44%)

機械学習一本槍でエッジが生み出されるほど甘くない
ここで私が言いたいのは、”機械学習は使い物にならない”ということでもなければ、”俺の作ったシステム最強”ということでもありません。
私のシステムも上記のように機械学習一本槍でやってるわけでは無く、自分なりのアイデア、工夫、努力の積み重ねでエッジを生み出しています。(もちろん”過去検証データを用いる”というのは軸となるアイデアですが、これ以外にも数え切れないくらいの工夫を込めています)
もしかしたら、私が考えつかないようなアイデアで、世の中にはヒストリカルデータの学習で勝てるシステムを作っている方もいるかもしれません。
裁量もシストレも、一般的に勝てると言われている手法、みたいな一般論、他人由来の情報では無く、自分なりの考え、切り口でトレードすることでエッジが生まれると思います。
独自のAI紹介(過去検証データからAI作成までの流れ説明)
単なるヒストリカルデータの機械学習では勝てない、という前フリが終わったところで、私のシステムの紹介をしたいと思います。
先にも話した通り、このシステムの肝になる部分は、私が手動で過去検証したデータをもとに学習をしているということです。
なぜこのようなトリッキーな機械学習をしているかというと、一般的なヒストリカルデータのみを学習した場合は勝てなかったからです。
(ちなみにここで言うヒストリカルデータのみの学習とは、ランダムな時点での過去の波形データと、数時間後の価格変動で学習した場合です)
このシステムの作成過程を下記にご紹介します。
1.過去検証でデータ溜める
好きな過去検証ソフトを使ってデータを溜めます。
私はChart book(現:FX検証)を 使ってました。
データの数は 買い、売り 合わせて1000回くらいあれば優位なロジックができるのではないかと思います。
(これまで色々トライしてみた結果からのなんとなくの感覚です)
私は日経平均は5000回くらいやりました。
(5年間で300回くらい、それを15周くらいしました)
データを溜めたらエントリータイミングと獲得pipsをcsvで出力します。
2.ヒストリカルデータを準備
1分足を準備します。
私はForex testerの有料プランでヒストリカルデータをダウンロードしています。
(ちなみに一通りダウンロードしたら、有料プランを解約してます。結構な金額なので)
MT5 pythonでも6ヶ月くらいのデータをダウンロードできます。
(やり方は後日投稿します)
3.Pythonで機械学習用のデータ準備
ここからはプログラミング言語Pythonを使用します。
エントリーポイントからの波形データと、そのpips を作成します。
過去検証データとヒストリカルデータを照らし合わせて、波形データを作成します。
波形データは正規化させる。
買いと売りそれぞれデータを作成します。
コードは下記のような感じ。部分的すぎてわかりにくいと思いますが。
dfV = pd.read_csv('過去検証データのCSVファイルのパス')
dfH = pd.read_csv('ヒストリカルデータCSVファイルのパス')
#各過去トレードの波形"hist"と損益結果"Pips"データを作成する
for index, row in dfV.iterrows():
#同じ日付のデータフレームを作成
dfH0=dfH[dfH["<DTYYYYMMDD>"]==row["date1"]]
#同じ時刻のデータフレームを作成(一個のデータになる)
dfH0=dfH0[dfH0["<TIME>"]==row["h1"]]
#Lengはデータの数、barは足の間隔
dfH2=dfH1[dfH0.index.values[0]+1-Leng*bar:dfH0.index.values[0]+1:bar]
#データを正規化する(波形を0から1のデータになる)
dfH2=(dfH2-dfH2.min())/(dfH2.max()-dfH2.min())*10000
#波形データをhistに格納する
hist.append(dfH2)
#pipsデータをpipsに格納する
pips.append(row["pips"])
3.~5.は後日Pythonのプログラムコードを公開しますので参考にしてください。
Pythonやったことがない人でも出来るように詳しい解説ページも今後用意します。
4.機械学習モデル作成
好きなライブラリ、アルゴリズムでモデル作成します。
私はScikit Learnでやっています。
他にも人気の機械学習ライブラリとして、Tensor Flowとか、Light GBMとかも無論利用可能です。
上記は世間(というかKaggle界隈)でも人気だったので私も使いましたが、結局Scikit Learnに戻りました。(アルゴリズムの使い回しが非常に便利)
モデルを作成したら、テスト期間の予測をします。
上記のモデルでテスト期間の予測をする
予測値は標準化(平均0、標準偏差1になるようにデータを整形)します。
コードは下記のような感じ。
#clfLで使用するアルゴリズムを選択する
clfL = LinearRegression()
#波形データxとpipsデータtを利用してモデルclfLを作成
clfL.fit(x,t)
#過去の波形データから予測値を出力
preds2L = clfL.predict(xH)
#予測値を標準化する
preds2L=(preds2L -preds2L.mean()) / preds2L.std()
5.バックテストの方法
買いと売りそれぞれの予測値の差分でエントリー、決済をします。
バックテスト用のpythonライブラリも世の中でたくさんありますが、私は自作プログラムでバックテストしています。
5年間のシストレ検証を通して学んだノウハウ集
冒頭にも書きましたが、様々なトライ・アンド・エラーを繰り返して上記のシステムを作成しました。
様々な検証をしてきた中で感じたノウハウを下記に記載しています。
シストレに限らず、裁量トレードにも通じるところがあるかと思いますのでご参考まで。
入力データについて
ヒゲ(hight,Low)のデータは必要か→必要ない
Closeのデータのみ vs Close、High、Lowのデータ3つを追加して機械学習、で比較したが、後者は全然良くなかった。
他の通貨のデータは利用価値あるのか→ない
日経平均、sp500、USDJPY、などなど を入力データにして学習とかさせてみたこともあるが、上手くいかなかった
学習させる波形データの期間は?→人による(私は5日ほど)
自分が検証で参照している期間が良い私の場合は5日くらい。短い期間(一日分)の過去検証をやってみたこともあるが、この学習は何故か上手くいかなかった。理由は不明だが。
スキャルピング(一日に何回かトレードする)を学習させたことは沢山あるが、なぜか全然上手くいかなかった。
時間足は何が良いか?→人による(私は30分あたり)
自分は30分×250=5日分くらいになる。
波形データの解像度は高ければ高いほど良いのか?→そんな事はない
1分足×5日分のデータ(7200)で学習とかやってみたが、全然ダメだった。
色々やってみたが、今は250個のデータ数で固定してる。
機械学習について
波形データはそのままで学習させるべき?それとも標準化、正規化したほうが良いのか?→正規化すると成績よくなる。
正規化めちゃくちゃ大事です。
これやることで学習成績はかなり上がる。
理屈はわからないけど、標準化はあまり成績が良くなかった。
ちなみに標準化、正規化がよくわからない方は下記参照ください。

標準化が平均0、ばらつき1の波形に変換するというもの。
正規化は0~1の間の値になるように波形を変換するというもの。
ちなみにsklearnでは少数の数字は学習できないみたいな減少が起こるので、正規化したあと×1万しています。(1万という数字に意味はなし。整数にできれば何でもOK)
いろんな分足でのアベレージング めちゃくちゃ有効
いろんなアルゴリズムのアベレージング 上手く行かない
pythonでの検定方法 あまり優位性見にくい
水増しは有用か→あまり良くなかった
機械学習でよくやられるデータの水増し(拡張)をこれでもやってみた。
n分ずらして学習データに追加する、というようなもの。
しかし、あまりうまくいかない。
いろんな分足でのアベレージング→めちゃくちゃ有効
これも機械学習でよく行われるアンサンブル学習(要はアベレージング)を参考にやってみたもの。
30分×250本=5日を始めとして、31分、32分、、、60分までの30の機械学習システムを作成し、それぞれが算出した値を平均化するだけ。
つまり現在は5日~10日のデータをアベレージングしていることになる。
このアベレージングは非常に有効。基本的に成績が上がる。
いろんなアルゴリズムのアベレージング→上手く行かない
上記と同じ理屈で、異なる複数のアルゴリズムで算出した値をアベレージングしてみたが、これはあまりうまくいかなかった。
おそらく上記の分足変えるだけだと同じような結果が出てくるが、アルゴリズムを変えるとかなり傾向が変わるので、平均化しても上手くいかなかったのではないかと思われる。
pythonでの検定方法→あまり優位性見にくい
T検定みたいなこともやってみたが、結局のところまぐれでも当たっていれば優位となってしまうので、あまり意味がなかった。
いろんな条件(分足変えたり、期間少し変えたり)で再現性を検証するほうがよい。
アルゴリズムについて
どのアルゴリズムが良いのか?→各アルゴリズムごとの相関係数を参照ください
下記アルゴリズムはsklearnに入っている全てのRegressorアルゴリズムです。
日経平均の過去検証データの7割を機械学習させて、残り3割でテストさせたときの相関係数です。
ここで成績の良いPLSRegressor、SVR、ExtraTreesRegressorとかは再現度が良かったです。
(バックテストなどでも成績良く、他の通貨でも成績良かった)
アルゴリズム | 相関係数 |
ARDRegression | nan |
AdaBoostRegressor | 0.02 |
BaggingRegressor | -0.03 |
BayesianRidge | 0.00 |
CCA | -0.01 |
DecisionTreeRegressor | 0.01 |
DummyRegressor | nan |
ElasticNet | -0.01 |
ElasticNetCV | nan |
ExtraTreeRegressor | 0.03 |
ExtraTreesRegressor | 0.02 |
GammaRegressor | nan |
GaussianProcessRegressor | nan |
GradientBoostingRegressor | -0.02 |
HistGradientBoostingRegressor | 0.00 |
HuberRegressor | 0.01 |
IsotonicRegression | nan |
KNeighborsRegressor | 0.00 |
KernelRidge | -0.01 |
Lars | 0.00 |
LarsCV | nan |
Lasso | -0.01 |
LassoCV | nan |
LassoLars | nan |
LassoLarsCV | nan |
LassoLarsIC | 0.01 |
LinearRegression | -0.01 |
LinearSVR | -0.01 |
MLPRegressor | -0.01 |
MultiOutputRegressor | nan |
MultiTaskElasticNet | nan |
MultiTaskElasticNetCV | nan |
MultiTaskLasso | nan |
MultiTaskLassoCV | nan |
NuSVR | 0.02 |
OrthogonalMatchingPursuit | -0.01 |
OrthogonalMatchingPursuitCV | 0.02 |
PLSCanonical | 0.02 |
PLSRegression | 0.04 |
PassiveAggressiveRegressor | -0.01 |
PoissonRegressor | nan |
QuantileRegressor | 0.00 |
RANSACRegressor | -0.01 |
RadiusNeighborsRegressor | nan |
RandomForestRegressor | 0.00 |
RegressorChain | nan |
Ridge | -0.01 |
RidgeCV | -0.01 |
SGDRegressor | 0.01 |
SVR | 0.03 |
StackingRegressor | nan |
TheilSenRegressor | nan |

最近流行りのDeepLearningが最強なんじゃないのか?→そうでもない
SklearnではMLPRegressorがいわゆるDeep Learningのアルゴリズムになっています。
上記の相関係数も低いです。(-0.01)
これまで色々検証してきた体感とも一致します。
Deep Learningが最強のはず。おかしい。なぜ最強じゃないのか?→わかりません
私もそうに違いないと思って2年位時間を無駄にしました。
(2年位 TensorFlow沼にハマってました)
Kaggle界隈では最近LightGBMが流行っている。流石にこれは最強でしょ?→そうでもない
SklearnではGradientBoostingRegressorがいわゆるLightGBMと同じアルゴリズムです。
上記の相関係数も同様に低いです。(-0.02)
トレードルールについて
RiskRewardRatioはいくらが良いのか?→1~2あたりかな?
感覚的に1を切ると有意に成績下がります。大袈裟な例は下記参照。1から2で試してみるのが吉かと。
RiskRewardRatioが0.1のトレードは有効か→めちゃ負ける
試してみた結果が下記です。全然勝てません。こういったシステムが昔売られていた気がするのですが、これでは勝てない事は一目瞭然です。

リスクリワードレシオが0.1の場合(ロスカット400円、テイクプロフィット40円)
損切りは入れるべきか否か→入れるべき
私は損切りを固定PIPSで入れて、それをもとに資金の20パーセントになるようにロット数(サイズ)を決めています。損切り無しだと有意に成績下がりました。
途中決済はすべきか、それとも損切りor利確ラインまで待つべきか
途中決済はあったほうがいいです。エントリー根拠が崩れたらプラスでもマイナスでも決済した方がいいです。
トレーリングストップは有効か?→良くなかった
経験的にトレーリングストップは成績が下がりました。やはりエントリー根拠ベースで考えるべきであって、損益ベースで決済しても有益にはならないですね。
資金の2%ルールというのは、必ず2%が最適か?→PFによる
少なくとも2%がベストというのは非合理的です。一般的にはバルサラの破産確率で計算した方がいいです。これも結局PFによって決まります。私はバックテストで決めてます。
カーブフィッティングかどうかの判断の仕方
バックテストをしていると、カーブフィッティングというか、単なるマグレで勝っている期間が発生することはよくあります。
他のサイトを見ると、”検証期間を1年以上にすればよい”とか何とか時々目にしますが、個人的には年数を長くしてもマグレ勝ちは余裕で発生します。
マグレ勝ちではなく、ちゃんと優位であるかどうかを自分なりにどう判断しているかを下記に紹介します。
エントリー条件が厳しくなるほどPFが上昇するかどうか
つまり、インジケーターのしきい値とPFが比例する、ということです。
当たり前の話ですが、ここは確認してみると良いです。
ここが比例して上がらない場合はなにかおかしいです。
インジケーターしきい値とPFに相関が出ない場合は、優位なアルゴリズムでない可能性が高いです。
ロスカット(損切)が遠いほど、PFが上昇するかどうか
ロスカットが遠くなるほど当然PFは上昇します。
その上昇はどこかでサチュレーションしますが。
ここが比例して上がらない場合はなにかおかしいです。
当然ですが、ロスカットが遠くなるほど、資金効率は下がるので、ここはバランスですが。
PFは適正な数値か?
PFが異常に高いと、なんかミスっているか、マグレ勝ちの可能性が高いと思います。
下記のバックテスト条件が間違っている可能性もあるので調べてみてください。
個人差あると思いますが、自動売買でPFが3を超えたらちょっと怪しいと思います。
(裁量トレーダーはPF3を超える怪物も結構いるかと思いますのでまた別物と思います。あくまで自動売買の話です)
バックテスト失敗例
今度は反対に、自分がこれまでやってきたバックテストの失敗例を紹介します。
バックテストのやり方が間違っていて、結果めちゃくちゃ勝ちまくるみたいなので、数ヶ月勘違いしていたみたいなことは結構ありました。
気づいたときの絶望感は忘れない。
テスト期間のデータを使って学習させていた
機械学習あるあるかと思います。
HighとLowのデータをちゃんと読み込めていなかった
Skip機能を追加したときにこのミスをしました。
なぜ情報公開するのか。自分で稼げばいいじゃないか。という質問に対して
ここまで読んで頂いた方が抱きそうな疑問に回答しておきます。
このシステムは当然自分でも運用していますが、下記のような理由で情報公開しています。
他のシステムと違って競合しない
上記で説明した通り、自身の過去検証結果を元に学習させる、という特質上、システムが競合する心配がないです。
よってシストレを公開したことによるエッジ消失も心配する必要もなし。
もっと言うと、システムのエッジ云々はこのPVだと気にする必要がないという悲しい現実もある。
他の人にもこのシステムを使ってほしい
このシステムで本当に稼げるかを、他の人にも使ってもらって確信を得たいと言うのが一つ。
確率的に優位である自信はあるが、実際勝ち続けられるかはわからないので。
あと結構気合を入れて(かれこれ5年位かけて)このシステムをひっそりコツコツ一人で作ってきて、ようやくモノになった感があるので、世に出したいという思いもあり。
さいごに
このような形でシステムを作成しています。
過去トレード結果or検証結果があれば、みなさんも同じようにシステムの作成が可能です。
システム作成のプログラム、そしてこのシステムで自動売買するシステムを今後公開する予定ですのでよければご参照ください。
コメント