FC2ブログ

機械学習をEAの出力ファイルでやってます、その1

EA作成中
05 /31 2020
解析できるようなデータをEAで残す仕組みができました。
こんな感じ。

GlobalVariableSet("forestEye5_arg_count", count);
for (int n=0; n < count; n++)
{
string variable = StringFormat("forestEye5_arg_%d", n);
GlobalVariableSet(variable, data[n]);
}

グローバル変数をこっそり使うことで簡単?にできます。
パラメータによってデータが可変になるので、ちょっと工夫はしています。

EAから出力されたデータを解析してみると、ほとんどのテクニカル指標がランダムな感じでした。
ボリンジャーバンド2σ抜けで順張り、ストキャスティクス80-20で逆張り、決済は一定期間で強制的にした出力データで各テクニカルに偏った傾向があるか見てみた(ちゃんと解析はしてないです)のですが、関連性が見られたのはストキャスティクスRCIでした。
※ボリンジャーバンドは逆張りで使用されることが多いようですが、バックテストではボロボロだったので順張りにしています。

ストキャスティクスのシグナルなのでストキャスティクスは当たり前ですね。
RCIもストキャスティクスと同じような動きをするので、まぁうなづけます。

RCIの傾向
ただ、青色の部分をフィルターすれば、良い感じで利益が出そうです。
試しにExcelで計算してみると、全体の損益は-104.85でしたが、80以上、-80以下を合計すると5145.37になりました。
(バックテストの期間は、2020年1月~4月末です)

RCIフィルターでも良さげな結果になりそうですが、目的は機械学習ですから横道にそれずに、データの準備です。

データの準備

今回、データ解析するためにいろいろデータを残しすぎていますので、学習しないデータを削除します。

データの準備

がっつり削除します。(python慣れてないので1行ずつww)
学習するデータはシグナルとストキャスティクス長短期、RSI、ADX、RCI三種です。
学習データは2019年9月~12月末で、評価データは2020年1月~4月末です。

さて学習&評価!

予測100

オーダーしない選択を含めると85%正解、オーダー方向は100%正解・・・・

こっ!これは!!!100%バグってますねww
(_ _|||)
何、間違えたんだろう><
実際にこのモデルでバックテストをするか、scikit-learnつかって検証するか・・

パぺ太メモ

汎化忘れてる!と思って、汎化してみましたが100%の予測結果w

学習データを評価データにしてしまっているとか、どこかでマージしちゃったとか・・・
今週の休日全部使ってやっとここまで。
┐( ̄- ̄)┌ 

来週は、実際にこのモデルでバックテストをしてみますか。
休日にMT5でバックテストをすると、ティックデータが取れない期間が多くてテストにならないのですが、どうにかしたいなー
自分のネットワーク環境なのか、OANDAさんなのかな?
MT5でバックテストをしている人が少ないのか、そういう情報が出てないのです。

このモデルでバックテストをすると・・・ボロボロな予感w


MT5 EAプロトタイプ初号、バックテストした

EA作成中
05 /25 2020
データ保存までやろうとすると時間がかかるので、まずはバックテストをいろいろやってみました。

2019年15分足で学習したデータで、2019年を予測!(外れてたら、全く使えないw)
2019学習-2019

当たり前ですが、2019年のデータを学習させて、2019年が予測できなかったら、もう完全にやり直しというか、もうこの手法はないでしょ。
(2018年で学習させていたと思って、ぬか喜びをしてしまったのは内緒ですw)

ところが、2018年を予測させると・・・
2019学習-2018
使えませんねー

2020年が使えるなら、ワンチャン
2019学習-2020
ダメないような、良いような・・・・でもダメですねー
(_ _|||)

じゃぁ、2020年3月までで学習させて、4月から評価したら?
2020-03学習-202004~

学習期間は良いんだけどなー(当たり前!)・・・4月、5月はマイナスですねー

どう見たらいいのか?

検証をするまでもなくオーバーフィッティング?カーブフィッティングになっていると考えていいかなーと思っています。

作りっぱなしでパラメータチューニングもしていないのですが、【学習】というチューニングが強力なのでしょう。
機械学習は似たパターンに対しては強いですが、未知のパターンへの対処が苦手なのは、わかっていましたが、現実を突きつけられた感じです。
ここで諦めても面白くないので、カーブフィッティングを解消するために汎化を考えましょう。

機械学習でオーバーフィッティングになっている場合は汎化するということ。
簡単にできる汎化はシンプルな学習モデルにすることです。

今回の学習モデルは、19種類のデータ(特徴量)を学習させています。他には、
・決定木の数:200
・ノードの深さ(最大値):99
・判断する時のデータ数:20
・判断するデータ量:全体の66%

決定木の数を増やすのは汎化方向に行くので増やす方向で、ノードの深さを浅くして、判断する時のデータ数を少なくすると汎化できると思います。
特徴量も10以下に絞った方がいいかもしれません。特徴量を絞れば決定木の数はそのままでも良いのかな。

気になっていたこと

iCustomでインジケータのデータを参照すると、indexが"1"(一期間前)のデータがBUY/SELLのシグナルになっていました。
インジケータの作りでは、index"0"(現在値)にセットしているのに!
なので、1期間遅れてオーダーがかかるので予測とはズレが出るため、予測したデータでも良い結果にならないのでは?と思っていました。
それは心配ないようですが・・・

パぺ太メモ

汎化するにしても、チューニングするにしても、解析のできるデータを残すことが必須なので、仕組みを考えないと・・・め、面倒><

なぜ面倒なのかというと、iCustomでEAから呼び出して予測はインジケータで行っています。
オーダー決済はEAでわかりますが(この仕組みもわかりにくいw)、その時に決裁したオーダー(EA)を出した時の特徴量(インジケータ)を取り出して1セットのデータとして保存する必要があります。

S/L、T/P、クローズしたオーダーを損益、オーダー・クローズ時間(=ここまでEA)と発行した時の特徴量(=インジケータ)を1セットで保存するということですね。
このデータがあれば解析・検証が可能になります。

この仕組みいろいろ使えそうですねー
でも、クラスライブラリで作ってしまえば、こんなこと考えなくてもいいのか
┐( ̄o ̄)┌ 


機械学習EAプロトタイプ初号

EA作成中
05 /23 2020
え~っとできました。
USDJPY EA 1st prototype for MT5 powered by Random Forest。
カッコつけてみたけど英語苦手なので、これで合ってるか不明w

出来たら当然最適化して、バックテスト&フォワードテストするでしょー

グラフ-proto0
2019年1年間のバックテスト・フォワードテストです。
・・・まぁこんなものかな(TヘT)
バックテストは
バックテスト-proto0
・・・
フォワードテストは?
フォワードテスト-proto0

年間取引、バックテスト 331回、フォワードテスト 52回で、383回ですね。勝率は65%弱、PF1.1前後、微利益が望めますがこの程度ですかー
トレイリングストップのロジックとの相性が悪いのかな?

今回使用した学習モデルは、2期間で8pipsの上下動(2018年データ)を学習させています。
年間の取引予測は475回なので少し抑えられた感じになっています。予測確率は65%を超えているので勝率もまぁ同じ程度(SL/TPの設定で変わるので一概には言えない)ですね。

この結果から

結果は残念としか言いようがないですね。前回の山谷オーダーの方が良いという。
( ̄へ ̄|||) 

さて、サンプルから持ってきたトレイリングストップのロジックでは機械学習予測の実力は測れません。
2期間で8PIPSの上下動を予測したのであれば、2期間でクローズして年間成績を見てみないと検証にはなりません。
年間成績だけではなく、予測通り8PIPS動いたかどうか、予測と逆の動きをしたのかなどが解るデータを残さないと次のステップに進めません。

ここで大きな問題があります!面倒><

まぁここまで面倒なことやってきてるんですから、頑張ってやりましょうかー・・・

次のステップは

1.オーダー時の各データ、n期間後にクローズした時の損益を1ラインでファイル出力
2.予測モデルでのオーダー、予測モデルなしのオーダーで比較検証
3.予測・損益をカテゴリ分けして、学習ロジックに突っ込む

書くだけなら簡単なんだけどなー
仕様から検討しないと。

パぺ太メモ

まだ「出来たー!」とは言えませんね。
MT5での値動きをデータ出力して学習モデルを作った方が現実的に思えます。
理想的には学習しながら予測するのが良いのでしょうが、そこまでのCPUパワーが無いですからねVPSには。

今回MT5でバックテストを行っていますので、当然ヒストリー品質は90%以上(というか100%)です。
MT5ではヒストリーデータをオンラインで(ボリュームもスプレッドも)取得していますので、ヒストリーデータの齟齬はありません。
また1分足でもティックデータによるバックテストが可能です。

しかし!MT4では注意が必要です。
1分足のバックテストはティックデータではなく1分足データでのシミュレートです(記憶が確かなら、そうでした)し、ヒストリーデータをインポートしないとバックテストはできません。
また、インポートする前に既存データを全削除しないと「n/a」とかになることもあります。
(そんな時は、もう一度全削除→いったん終了→1分足データをインポートして、各時間足に展開するスクリプトを走らせます)

フォワードテストもできるMT5の方が便利ですが、世の中の主流はMT4ですw

さて、仕様を考えようっと・・・


EAを作るのは何が必要?@振り返り

EA作成中
05 /14 2020
質問もあり、会社で切りの良いこともあり、振り返って整理します。

まず、EAを作るにはテクニカルの知識が必須です。
プログラムはFRBの動向や、日銀の政策、新コロナの予測はしてくれませんし、できません。
(´○`; 

トレードするときには、いろいろな指標を見たりニュースを見たりしますが、FXでは裁量トレードでも重視するのはテクニカルです。
移動平均に始まり、ボリンジャーバンド、RSI、ストキャスティクス、一目均衡表、モメンタム、MACD・・・挙げればきりがありません。

一時期は聖杯を探して、外為オンライン や AVA TRADE のテクニカル解説を読んだり、FX Works で皆さんのトレーディング手法を漁ったり、ゆきママ のトレード戦略を見たりしました。
当たり前ですが「聖杯はありません!
でも、どのサイトもすごく参考になりました!
FXの何かが垣間見えました。ありがとうございました!
o(⌒ー⌒)o

FXは9割の人が負けているという説や、いや7割だよという説や、今は5割くらいじゃない?という説を聞きますが、いろいろなサイトを見てみると「FXは7割が負けて、3割が勝てる。勝ち組が1割以下」という感じなのかなーと思っています。
こんな状況なのに聖杯なんてあるわけないですよねw

自分は今は裁量トレードは行っていません。
FXを始めたころにクローズタイミングがわからずに、仕事中も気になるし、結局小遣い半分以下になるしww
自分は裁量トレードに向いてないなぁ・・・と痛感して、EAでの自動トレードに切り替えました。

自動トレードEAの成績はプラスです。ここ一年ぐらいはSL(ストップロス)が頻繁になりEAを止めました。(もう少し早く止めておけば><)
自分はプログラマですから、自分でEA作ればいいじゃんと気楽に初めて早2年、全く右肩上がりのEAができないのですが・・・
┐( ̄ヘ ̄)┌ 

参考にさせていただいたサイトもいっぱいあります。(自分が右肩上がりのEAができないのは、こちらのサイトのせいではないですよww)
テクニカルの計算方法は、EXCELでテクニカル計算、EAの作り方や関数仕様は MT4でEA自作しちゃおーとあるMetaTraderの備忘秘録、MQL5のプログラミングは 本家のMetaQuotesのブログ、でも一番参考にもなるし、サンプルのEAがいっぱいある MQL5.com は神ですねー
そうそう忘れてはいけないのが gogoJungle ですね。有料EAはいくつか購入して運用させていただきました。(無料インジケータを公開させていただいてます)

※先人の方たち、ロスカットに負けない男無料EAポートフォリオで戦う、自動売買リアル戦記BeHacker・・・もう更新されていませんが、まだまだ参考にさせて頂いたサイトは山ほどありました。

EA作るのは難しい?

プログラマならば簡単です。
C(C++)言語、VB、Java、C#、Swift、Python、Rubyなど何でも良いので、2種類以上の言語が扱えれば、MQLは問題なく使えます。
(MQL4とMQL5は基本的な考え方=時系列データの配列順序が違う、テクニカル関数の使い方が違うなど、だいぶ違いがあります)
インジケータを作るのも簡単です。サンプルを参考にすれば大工さんにとっての日曜大工、簡単なテーブルを作る程度の労力でできます。
ただし「作るだけは」ですが。

裁量トレードで儲けるのが難しい以上に、儲かるEAを作るのは難しいです。
※マーチンゲール手法、iサイクルなどの手法は「儲かるEA」としません。資金力によって勝率が大きく変わりますから、儲かるのか破産するのかw

最近のトレンド=機械学習を使えば勝てるEAが作れるのでは?というのは自分も世間も思っていると思います。しかし機械学習で株やFXで大もうけした話は全く聞いたことがありません。
(まぁ大もうけしたとブログに書くわけないですけどねww)
RNNという翻訳や音声認識にも使われている手法ならば行けるのではと言われていますが、何故か「やったー!」とかいうブログは見つかりません。
( ̄- ̄;)

時系列データでの予測は、ARIMA(自己回帰和分移動平均モデル)、カルマンフィルタ、パーティクルフィルタ、ニューラルネットワークでは「RNN」(Recurrent Neural Network)などが検索にかかります。

裁量トレーダーの方が良いEAが作れる?

これは自分も考えていました。

ただ、あまり関係ないかなーと今は思っています。
自分に絶対もうかる手法を持っていて、それをEAにするのなら別ですけど。
これもカンが介入するとプログラムに出来ませんからw
「嫌な感じがする」とか「これいけるんじゃない?!」とか「今はやめておいたほうがいい」とか、プログラムにできませんからね。
( ̄ー ̄;)ゞ

テクニカルの知識、常套手段、テクニカルの組み合わせなど、裁量トレーダーの知識がある程度あれば十分で、あとはデータ分析が必要になってくると思います。
季節要因や曜日要因、時間要因、そういう要因とテクニカルの組み合わせ、チャートのパターン認識・・・あれ、今アイデアが浮かんできたww
Oo。。( ̄¬ ̄*)

EAを作るには?

初めはビジュアルでわかりやすい、インジケータを作るのが良いと思います。
インジケータでロング・ショートタイミングが表示できるようにできれば、もうEAはできたようなものです。
iCustomでEAにしてしまえばいい。
※EAではオーダー管理が必要になりますが、公式のサンプル(Exampleフォルダ)を参考にすれば基本的なものはできます。MQL5.comにも山ほどサンプルがあります。

iCustomじゃなくて!という方は、インジケータのロジックをクラスにして、EAと共通クラスライブラリとしてincludeディレクトリに突っ込んでおけば、インジケータ→EAという作成の流れができてしまいます。
MQL4の場合は、動作が遅かったのでクラスライブラリの手法をとっていましたが、MQL5では速度が上がっているので iCustomで作る手法に切り替えました。

好みによりますが、初めからEAを作るとデバッグがしづらいので、最初はインジケータでタイミングを表示させる手法をとっています。(2度手間と思う方もいると思います)

EAを売りたい!

現在、国内FX会社ではMT4が主流というか、MT5が使えるところがほとんどありません。なので売りたいという人はMT4で作らないとパイが小さすぎて収益は得られないでしょう。

でも自分はMT5で作ります。遅いの嫌いだからw

パぺ太メモ

全部メモでしたね。(⌒ー⌒;
今回使用する予定のランダムフォレストは時系列データ向きではありませんが、特徴量のスケーリングが必要ない、考慮するパラメータが少ない=簡便、特徴量の重要度が見られる、過学習しにくいなどメリットも多く、なによりも考え方が解りやすいので使ってみようと思っています。

将来的にはOANDAPYでRNNやLSTM(Long short-term memory)も使ってみたいなぁと思います。OANDAPYなら、python, keras, tensorflowという定石が使えますからねー
(MT5が使えないのと一回もやったことがないので、ちょっと面倒)

使って予測している人のブログもありますが、予測は無理でしょうねー
(予測できたと言われている方もいますが、デモ口座でフォワードをしていないので・・・)
でもなぜやりたいのか?それは秘密ですww
1%でも勝算があれば、やってみたいですよねーダメもとですからw
o(⌒ー⌒)o


EA用の機械学習おさらい2

EA作成中
05 /11 2020
連休が終わると途端に気力がなくなっていくのですが、そんなものなのでしょうか?
新コロナ対策で在宅勤務がたまにあるので、休み気分で少しやる気が出ます。
通勤時間が無いって幸せw

ちょっとした問題

今までの機械学習の評価から使う特徴量や通貨ペアを絞ってきたのですが問題がありました。

自分の能力と時間 ( ̄□ ̄;)

何かと言うと、pythonで機械学習の評価で作った特徴量データをMQLで作成しなければいけない(特徴量が多いと、ただただ面倒w)なのと、スプレッドを考えていなかったww

特徴量データの作成は、特徴量を絞る!ことで対処します。
特徴量を絞ることによって大量データの学習も早くなります。
(予測確度が落ちるとは思いますが・・・)

次のスプレッド。
ロング・ショートの価格差ですが、1PIPS違うとEAは別物のような動きをします。
USDJPYは0.3PIPSちょっとで、CADJPYは1.5PIPS程度です。(OANDAのスプレッドを参考にしています)

USDJPYのスプレッドでは右肩上がりのカーブを描いているEAも、CADJPYのスプレッドでは右肩下がりとかに普通になります。(スプレッドを変化させて、バックテストをやっている方なら、わかると思いますが)

まずはスプレッドの一番有利な通貨ペア、USDJPYをターゲットにします!

特徴量を絞る

MACD、ストキャスティクスの山谷インジケータ+EAを作成したのですから、この2つのオシレータ系テクニカルだけで行ってみたいと思います。

ランダムフォレストで予測してみたところ、
※15分足で1時間後に10PIPSの上下があるかを予測。スプレッドは 0.4PIPSとしています。

そしてランダムフォレストは特徴量の重要度がわかります。
Close, 5.848855
TickVolume, 6.936421
Spread, 2.896924
Stoch9, 12.734515
StoSign9, 0.544637
Stoch19, 17.112028
StoSign, 0.068893
StoPeak, 1.080708
MACD17, 19.368193
MacdSign, 0.742490
MacdPeak, 1.682858
Close_P, 11.877218
Stoch19_P, 11.494937
MACD17_P, 7.611324
※"_P"付きは、前値とのパーセンテージ入力です。
※MACD(シグナル線とのクロス)、ストキャスティクス(80-20)のシグナル、両オシレータの山谷が、特徴量データの学習ポイントです。

重要度は学習毎に変わるのですが、マイナスの項目がないので良しとします。

さて、15分足を2018年で学習して、2019年で評価した結果は、65%でした!
目標を上回りましたーo(⌒ー⌒)o
※実は評価のパーセンテージも毎回数%変化します。

スプレッドを、1.5→0.4にしたら、55%から65%に上がったというw

さて、あとは作るだけですが・・・気が重い><
大型連休が終わってしまったので、時間が取れないよー!
( ̄へ ̄|||) 

一か月、いやせめて2週間、休みたいなー・・・・



パペ太

パペ太は自動人形(EA)を操るという意味で、puppeteer(人形遣い)から付けました。
高収益のEAを目指して日々悩んでいます。