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用の機械学習おさらい

EA作成中
05 /05 2020
ずいぶん前に機械学習「ランダムフォレスト」を使ったEAを作る!と書いたのですが、機械学習部分の作成具合は、今どのような状況かというと。

ランダムフォレスト予測

いくつかの通貨ペアで試しましたが、EURUSD、CADJPYの成績がまぁまぁでした。
半年間で学習させ、違う年度の半年間で評価をした成績です。
  • EURUSD 58.46%(45.0%)
  • CADJPY 58.6%(34.48%)
カッコ内は予測が合っていた割合、カッコ外(こちらが重要)は、ロング・ショートをオーダー後に指定期間内でオーダー方向に一定PIPS動いたかの割合。
  • 指定期間内で一定PIPS上昇
  • 指定期間内で一定PIPS下降
  • 指定期間内で一定PIPSまで動かない
※指定期間=8期間、一定PIPS=10PIPS
いろいろ簡易的に作成していますので、そこまでの信頼性は残念ながら無いのですが、ある程度の目安にはなると思います。

特徴量=入力データは、
  • 終値
  • Stochastics 9期間, 26期間, 両指標のサイン(80-20越え)
  • RSI 14期間、サイン(70-30越え) 
  • 移動平均 6期間, 26期間
  • 適応型移動平均 26期間
  • MACD 19, 9期間、サイン(6期間のシグナル線とのクロス)
  • 包み足、ピンバーの状態

全期間を学習させて、全期間で評価しています。
間違えていました。全期間ではなく、StochasticsとMACDのサインが出ている時のみ学習・評価しています。

ただランダムフォレストは一時点でのデータの扱いしかできないため、時系列データを考慮できないのが難点です。特徴量同士の関連付けもできないので、終値や移動平均などを前値とのパーセンテージで表すなどをしたほうがいいかも。
目標値は60%を達成するには、時系列要素をデータに入れ込むことが必要になると思っています。

まずは、MT5で動かすほうを先決に考えます。

MT5への組み込み

機械学習の組み込みで問題?というか課題?だと思っているのが「学習と予測はいつする?」ということです。
理想的には、ベースを学習した「学習モデル」を随時、学習していって「学習モデル」を成長させていくというパターン。ただ計算コストが半端ないw
定期的にローカルで学習させたモデルを運用しているモデルと入れ替えるのが現実的でしょう。
ローカルで学習させるには、pythonでの学習用プログラムが別途必要になるのが難点。

そして全期間で予測するというのもVPSのパワーによりますが、きついのではないかと思っています。(Linuxでは動作が早めなのですが、Windowsでの動作が異様に遅いんですよねー)

全期間で予測するのはパワーの問題だけでもなくて、あまり予測を連続させても成績が悪くなるだけのような気がしています。まぁこちらに関してはやってみれば良いことですね。

ということで、基本方針は、
  • 特徴量の選別。(今のままでいいか?w)
  • ローカルで学習させる。
  • MT5では、全期間での予測もしくは、予測ポイントでの予測
※予測ポイントは「MACD山谷」や「Stochastics、MACDのシグナル」など

できるだけ今まで作成した部分を流用しながら、効率よく作っていこうと思います。
実際の成績はバックテスト、フォワードテストをやってみないと分からないですからねー
o( ̄ー ̄;)ゞ

    ダイバージェンスEAをiCustomで作る2

    EA作成中
    05 /04 2020
    前回作ったダイバージェンスEAの山谷判断ロジックを改善しました。
    あと、クローズサインでクローズするように改造しようと思ったのですが、もう出来ていました。
    o( ̄ー ̄;)ゞ

    そして山谷の判断ロジックを改善したら衝撃的な出来事が・・・・
    試しに山谷でオーダーしてみたら、ダイバージェンスより良い結果になってしまったww

    まずは改善項目の確認です。山谷が判断できない状態が頻繁にありました。(下図)
    icustom-divereye-falseチャート

    山谷の判断漏れがないように(できるだけ)改善しました。(下図)
    icustom-divereye-trueチャート

    これが山谷の判断がいまいちなEA。
    icustom-divereye-falseグラフ

    これが山谷の判断を改善したEA。
    icustom-divereye-trueグラフ

    改善前EAのグラフがフォワード付きのしか残ってないので、わかりにくいですが、あまり変わらないもしくは悪くなった
    まぁ、そんなもんでしょう。オーダー数は増えましたが、優秀なEAではないのでオーダーが増えれば良い時も増え、悪い時も増え・・・とんとんでしょう。

    では衝撃的なグラフを。
    icustom-divereye-MACD-Peakグラフ

    これがMACDの山谷だけでオーダーをしているグラフです。当然、オーダー数はだいぶ増えています。オーダー数が増えると普通は悪い方向に向かっていきます。
    が!フォワードが右肩上がりになっていますし、バックテストも利益が出ています。

    icustom-divereye-stochas-Peakグラフ

    Stochasticsの山谷だけのオーダーも試してみましたが、MACDのほうが優秀です。
    「山谷でのオーダーからトレイリングストップでのクローズ」の方がシンプルでオーダー数も多く、最適化がしやすいのでしょう。

    今回試したかったEAではダイバージェンスの有効性検証だけではなく、オーダー数が多いことが望ましかったので、これは良い結果になりました。

    パぺ太メモ


    機械学習のデータとしてチャートの値動きを入力しようと思っていますが、全ティック入れても意味がないというか、あまり有効な結果が出ない気がしています。
    特定のポイントで予測を行うほうが条件を絞りやすく、データが集めやすく、有効性もわかりやすいのではないかと思っています。

    でも予測ポイントよりオーダーは少なくなるため、予測ポイントが少ないとオーダーをしないEAになってしまう可能性が高くなります。月一回とか勘弁w

    これで方針は決まりましたので、機械学習での予測の準備に入ります。
    o(⌒ー⌒)o

    • MACDの山谷ポイントでのデータを集める
    • データは、移動平均各種、一目均衡表、RSI、Stochastics、MACD
    • 機械学習で予測モデルを作る
    • MT5のEAにDLLを組み込む
    • インジケータを作成する
    • EAをiCustomで作成する

    ・・・まだまだ先は遠い (_ _|||)




    ダイバージェンスEAをiCustomで作る

    EA作成中
    05 /02 2020
    案外簡単にできたのですが、デバッグしているとインジケータのデータが細切れに途切れてしまう現象が・・・
    一旦MT5を落として、立ち上げなおすと何とか動作するようになりました。
    同じインジケータの違うバージョンを同名で立ち上げていると誤動作するようですね。
    デバッグの時には気を付けよう。

    iCustomのオーダー

    オーダー部分は、MT5のExampleEA(MACD Sample.mq5)から取り出して使ったので、iCustomでインジケータのデータを取り込みオーダーする部分のみ実装すればOKでした。
    下のコードで「最大ヒストリーバー」以降は、インジケータのパラメータです。

    ex_ind_handle = iCustom(
    Symbol(),
    Period(),
    "DiverEye5",  // インジケータ名称(ファイル名)
    1000, // 最大ヒストリーバー
    0, // チャート表示選択
    true, // オーダーのみ表示
    true, // ダイバージェンス両表示
    macdDivSignal, // MACDダイバージェンス
    shortMacdPeriod, // 短期MACD期間
    longMacdPeriod, // 長期MACD期間
    divMacdPeriod, // MACD ダイバージェンス判断期間(期間より大きく)
    stochasDivSignal, // ストキャス ダイバージェンス
    stochasMidPeriod, // ストキャス期間
    stochasMidSlow, // ストキャス スローイング
    stochasViewThreshold, // ストキャスしきい値(ダイバージェンス)
    diverStochasPeriod // ストキャス ダイバージェンス判断期間(期間より大きく)
    );

    DiverEye5インジケータでは、バッファ0にロングオーダーサイン、バッファ1にショートオーダーサインを表示しています。なので、iCustomの戻りハンドルを使用して、バッファ0と1をコピーしてきます。
    その最新インデックス(0)が有効な値の場合は、オーダーサインになります。

    if (CopyBuffer(m_handle_ind, 0, 0, 1000, m_long) != m_period)
    {
    Print(" CopyBuffer error !! ");
    return false;
    }
    if (m_long[0] != 0 && m_long[0] != EMPTY_VALUE)
    {
    Print("long = ", m_long[0]);
    return 「ロングのオーダー」;
    }
    if (CopyBuffer(m_handle_ind, 1, 0, 1000, m_short) != m_period)
    {
    Print(" CopyBuffer error !! ");
    return false;
    }
    if (m_short[0] != 0 && m_short[0] != EMPTY_VALUE)
    {
    Print("short = ", m_short[0]);
    return 「ショートのオーダー」;
    }

    それでどうなの?

    いろいろな通貨ペアで試しましたが、USDJPYの1時間足が一番いい結果でした。

    icustom-divereye設定

    去年1年間でバックテスト・フォワードテストを行いました。

    icustom-divereyeパラメータ

    パラメータ最適化をしています。Lotは0.1固定です。

    icustom-divereyeバックテスト

    バックテスト期間(1年の2/3)では微益が出ました。勝率は辛うじて50%を超えています。

    icustom-divereyeフォワード

    フォワード期間(1年の1/3)でも微益が出ました。勝率は56%ぐらいです。

    icustom-divereyeグラフ

    グラフで見るとこんな感じ。バックテストからフォワードテストに移るときに金額がリセットされています。(2019年8月中旬で残高が100000$にリセットされています)

    他の通貨ペア(EURUSD、GBPUSD、CADJPY)は最適化してもプラスになっていません。
    他の時間足(5分、15分、30分)は微益でしたが、1時間足が一番いい結果でした。

    1時間足なので1年間83オーダーしかしていません。インジケータの時に説明した、山谷の判断ロジックを改善すれば、オーダー数は上がると思います。が・・・それがいい結果になるかどうかはわかりません。
    (_ _|||)

    あとクローズサインをインジケータでは表示しているのですが、EA側では全く違うクローズロジックになっています。
    これも損益に関係してくると思います。

    次にやること


    やはりMT5でのバックテストは良いですねー、MT4よりも相当早い気がします。
    最適化やバックテストを行うと、自動でパラメータや設定を保存しておいてくれるのもGOODです。
    フォワードテストで検証できるのも良いし。
    これで、移植さえ簡単なら・・・( ̄へ ̄||) 

    このEAのままでは使い物にならないので、次にやることは、
    • 山谷の判断ロジックを改善する。
    • クローズサインでクローズするようにする。
    特に「クローズサインでクローズ」は他のインジケータを作ったとき必須になるので、実装しておきたいですね。

    連休中にはできないかなぁ・・・( ̄ー ̄;)ゞ
    カルマンフィルタの改造もしたいし、機械学習の組み込みもしたいなぁ、休みがあと1ヵ月あればなぁ。
    Oo。。( ̄¬ ̄*)
    (そんなことしたら生活できませんてw)



    カルマンフィルタEAでバックテスト

    EA作成中
    05 /01 2020

    カルマンフィルタ

    Wikiでは「誤差のある観測値を用いて、ある動的システムの状態を推定あるいは制御するための、無限インパルス応答フィルターの一種」となっています。
    はい、イミフですw

    話が変わりますが、カーナビってトンネルでも今の位置を表示していますよね。なんで?!
    チコチャンじゃなくても気になりませんか?
    ※トンネルじゃなくても、民生用GPSではそこまで精度は高くないので、基地局の位置情報を使ったりするようです。
    あとは走行速度とか、コンパスとか・・・まぁどれも精度は期待できるものではありません。
    これらの情報から位置を推定して表示しているようです。

    「誤差のある観測値(GPS、基地局、速度、方位など)を用いて、ある動的システム(車)の状態(位置)を推定」しているのですね。
    ※実際のカーナビ開発をしていないので推測です。
    o( ̄ー ̄;)ゞ

    不正確な時系列データ(測定値は時々刻々送られてきます)から状態を推定する・・・FXに使えるかもって思いますよねー!
    ※鋭い方は「誤差のある観測値」(FXは誤差ってもんじゃないだろ?!)ってことに引っかかると思いますがスルーで。

    そう思ってたら、MQL5.comに記事があるじゃないですか?!それもEAを作られていて右肩上がりのバックテストが載っています。
    ダウンロードしてバックテストしてみるしかないですよね。

    ※カルマンフィルタのインジケータもMQL5.comからダウンロードできます。(見方がいまいちピンとこないですが・・・)

    MT5でバックテスト


    カルマンーストラテジー

    記事では EURUSD でバックテストをしていたので、昨年の半年間で行ってみました。
    (今年の相場では今後あまり参考になりそうもないのでw)

    カルマンーバックテスト

    MT5ではMT4と違い、スプレッドは指定しません。実際の値=その時々のスプレッドの変化が使われます。また実際の値動きを使用するため、データの品質は100%です。

    勝率35%程度で、1割近く負けていますね。
    グラフで見るとこうなります。

    カルマンーバックテストグラフ

    見事な右肩下がり(_ _|||)

    記事では・・・2017年8月の一か月だけでバックテストしてますね。
    一か月って、意味ないでしょw
    上のグラフでも8月は右肩上がりになっている感じです。8月には使える?!

    まぁそんなに甘くはなかったです。
    ところでMT5には「フォワードテスト」がシミュレート出来るんです。

    カルマンーフォワード

    バックテストデータを検証できるみたいですね。
    実際どういうことをしているのかわかりませんが、バックテスト最適化でのカーブフィッティング(過剰最適化)を検証する機能ということです。
    ※フォワードテストは指定期間の1/2、1/3、1/4期間が選択できます。上図では右側の1/3期間がフォワードテスト結果です。

    このカルマンフィルタEAもパラメータ最適化しましたので、フォワードテストで過剰最適化だということがバレました。
    ( ̄□ ̄;)

    他のフィルタ

    他にも「粒子フィルタ」(パーティクルフィルタ)というのがあるのですが、MQL5.comにはインジケータもEAもありませんでした。
    C++言語のソースは見つけたのでMQL5に移植すればいいのですが・・・・

    敷居も高いし、カルマンフィルタがこれではねぇ
    ┐( ̄- ̄)┌ 

    このカルマンフィルタEAに移動平均や一目均衡表の算出値を「誤差のある観測値」として入れてみる方が有効な気がします。

    パペ太

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