FC2ブログ

単純なブレイクアウトを使ってみる

EA作成中
07 /12 2020
行き詰ったら基本に戻りましょう。
大成功を収めた昔の投資集団のタートルズを見習って、ドンチャンブレイクアウトを試してみます。
MT4のインジケータ(昔、自分で作ったやつ)を掘り起こしてきました。

今回は、MT5への移植とドンチャンブレイクアウト手法を思い出すことですね。
このインジケータはスプレッドを考慮していない、検証が出来ていないので、まだまだブラッシュアップをしないといけませんが、MT5へ移植して動かしてみました。

ドンチャンブレイクアウト

  • 終値が、過去の40期間の最高値を更新したら仕掛ける
  • 終値が、過去の20期間の最安値を更新したら手仕舞い
ただこれだけの、トレンドに乗ってけー!という単純な手法です。

タートルズ改ブレイクアウト
  • 終値が、過去の20期間の最高値を更新したら仕掛ける (1)
  • 終値が、過去の10期間の最安値を更新したら手仕舞い (1)
  • 終値が、過去の55期間の最高値を更新したら仕掛ける (2)
  • 終値が、過去の20期間の最安値を更新したら手仕舞い (2)
(1)は利益が出た場合1回休みフィルター、(2)はフィルターなしでオーダーします。
4回までの追加オーダー(ピラミッディング)を行います。
S/Lはオーダー時のATRで計算します。

他にも市場の選定や金額などのルールがありますが、上記のタートルズ法で実装しています。

トータスビュー5プロパティ
トータスビュー5チャートH1

(インジケータは10000期間表示)
シグナルはブレイクアウトで出ている感じはしますが、スプレッドは考慮していません。
今回のインジケータでは58%という高い勝率でしたが、通常の勝率は20%前後です。
(バグがあると思われます w( ̄o ̄)w)

以前MT4インジケータで試した時には、20%の勝率でもトントンな利益率になっていました。
・・・もう一度検証してみないとダメですね。どちらがバグなのか。
(他のサイトを見ると勝率は低いのが一般的です)

なぜブレイクアウト

簡単なテクニカル・シグナルで低い勝率、かつ利益率が良いならば、少し勝率が高くなれば大きな利益率になります。

以前は移動平均線でのトレンドフィルターや、ADXなどのオシレータを使ったフィルターを入れても、20%を大きく上回ることはありませんでした。

他のオシレータでフィルターを試しても良いのですが、試行錯誤が面倒ww
ということで、機械学習でフィルターしてみては?
オーバーフィッティングにならないように、大まかにデータを区切ってやれば、ある程度使えるかもしれません。

そして!ランダムフォレストでフィルターすれば使用したオシレータの重要度が見られます!

ブレイクアウト+機械学習

勝率に関してはEAにしてバックテストすればはっきりします。
まずは(タートルズ改)ブレイクアウト手法をEAにします。
ロジックの基本はインジケータで実装していますので、そこまで時間はかからないと思います。

しかし!
ブレイクアウト、ピラミッディング、手仕舞いが正常に動作しているのか検証するデータを取るのが難しいですね。
検証しやすいデータにしないと後から見て「???」になること間違いなし!

そこから機械学習フィルターの実装ですが、こちらも学習データの選定が難しいですね。
なにごとも、データ命です( ̄- ̄;)

ブレイクアウト以外にも、いろいろなテクニカルが候補になります。
パーフェクトオーダーとか、GMMAとか順番だけで学習させれば汎化できそうなテクニカルありますねー

まだまだやることいっぱい┐( ̄。 ̄)┌ 


機械学習EA出来てはみたものの・・・

EA作成中
06 /21 2020
機械学習でEAを作ったら、いけるんじゃない?という目論見で始めましたが、無理なんじゃ?というところに来ています。
一番大きな理由がオーバーフィッティング・・・カーブフィッティングですね。

既知のデータに対して学習し、「既知のデータで推測可能な」未知のデータを予測、分類するというのが機械学習ですね。

ここが重要→「既知のデータで推測可能な」未知のデータ
FXって違うんですよねー・・・知ってたけどww

既知のデータで学習するしかないのですが、既知のデータから推測できない未知のデータはどうやっても推測できないのです。
まぁ、当たり前 ┐( ̄o ̄)┌ 

2020年1月~3月で学習し、4月~5月のデータでは少し良い感じになったとしても、2019年のデータでは全く通用しないとか、よくあるEAの動きですね。

汎化したらいいのでは?

汎化したら?と思い、いろいろ試してみましたが、汎化しすぎると機械学習する意味もないですよね。
たとえば、ADXが0.35以上はトレンドが発生しそうだからシグナルを通すとか単純なフィルタリングするレベルになってしまいます。
それ以上の学習をさせてしまうとカーブフィッティングになります。

バックテストで最適化しただけでもカーブフィッティングになるのですからね。機械学習なんてしたら完全なカーブフィッティングになることは当然でしょう。

じゃぁ機械学習って使えない?

時系列データの考慮をしたとしても、カーブフィッティングになるのは防げないのでは?と思っています。
なのでRNN、LSTMを使ったとしても「学習」で覚えてしまえば、その学習データのクセを覚えてしまうと思われます。
なので、直接的な使い方は難しいのかもしれません。

カーブフィッティングにならないような学習の方法があれば良いのですけど・・・
例えば、数値をそのまま学習するのではなく、レベルを学習するとかですね。広がりが大きい、中くらい、小さいとか、10.0ずつ区切って10分割で学習するとかが有効かもしれません。

バックテスト

学習したデータと結果はこちら

データ:BB-width,MACD,VQ,ADX
BB-width, 24.396581
MACD,     27.096298
VQ,       32.675617
ADX,       15.831504

accurate =  14.378698224852071  
real accurate =  42.99242424242424

total profit = 985.500000, 
order error= 239 / 528, 54.734848%

2020年1月~3月で学習したモデルで、2020年4月~5月で評価した結果です。
54.73%の勝率で、985PIPSの利益が見込めることになっています。

macdランダムフォレスト-バックテスト

52.88%の勝率で、588.92PIPSの利益になりました。

macdランダムフォレスト-グラフ

macdランダムフォレスト2019-グラフ

上が2020年4月~5月で、下が2019年7月~12月です。
確実に最適化、カーブフィッティングになっています。

次の手はあるのか・・・

機械学習については、まずはこの状態で置いておいて、良い手を思いつけばということろです。
実数から段階表記にして学習という手はありますが、これがダメだと本当に手がないので、他のことをやりながら、進めていくほうがダメージが少ないかもw
( ̄- ̄;)

MT5にもずいぶん慣れてきましたので、単純なシグナルで世にあるインジケータの有効性を調べてみようかなと思っています。
単純なシグナルは、MACDのシグナル線とのクロスとか、ストキャスティクスの80-20ライン越えとか、ボリンジャーバンドの2.5σ越えとかですね。
このシグナルを、このインジケータでフィルタしたら良い結果が得られるのか?とか・・・インジケータ探しをしてみようかと思います。

pythonとMT5の連携もやってみたいですね。

まだまだ夢(右肩上がりEA)の実現へ向かって突き進みますよー
Oo。。( ̄¬ ̄*)




iCustomからライブラリ化

EA作成中
06 /14 2020
インジケータからライブラリへの移植がすみました。
インジケータのコードを切り出してライブラリにするだけなので、OnTickで現在値(始値とか終値とか)の取得をして、整形すればほぼ完了でした。

iCustomでバックテストをしていた時には、テストを行った後は必ずMT5を立ち上げなおさないと、次にエラーが出てテストを連続で行えませんでした。
ライブラリ化後は何回テストしても、そのような現象にはならないです。
iCustomの不具合??

ただ、以前から出ているティックデータが取れない現象は続いています。
これは何でしょう???

新たな問題

予測結果が100%になる不具合は修正できたのですが、修正すると予測結果が40%台がMAX
(_ _|||)

うむ~~~~
学習方法を工夫してみても50%台がベスト。こんな感じです。
202004-macd-いまいち

まぁ右肩上がりと言えばそう見えますけどねー
良いような、あまり意味ないような・・・

そして他の年度でも試してみました。2019年です。
macd2019-いまいち

2019年の1月から7月までのティックデータが取れない現象が出ていますので、8月以降のバックテストですね。微妙ですねー
┐( ̄- ̄)┌ 

2020年よりも2019年の方が(どちらかと言えば)いまいちです。原因は何だろうと考えてみると、終値や移動平均値を価格そのままで学習させているからでは?という基本的な考慮漏れww
だめだなぁ、最初に考えていたのに、EA作ることにかかりっきりになると忘れてしまう。

トレンド系のインジケータからオシレータ系に全面的に移行したほうが良いとは思うのですが、それで予測確度が上がるのか?やってみないとわからないですね。

オシレータ系テクニカル

トレンド系のテクニカルはほぼチャートに表示されますので分かりやすいです。
オシレータ系のテクニカルは別窓で表示され(トレンド系でも別窓はありますが)どう見たらいいのかがテクニカルごとに違うのでややこしいですね。

今回使おうと思っているのは、この3つ。
  • Momentum
  • CCI
  • ATR
ストキャスティクス、RSI、ADX(トレンド系ですが)は試してみて、ダメでした。
(あくまでも自分が作っている機械学習ではダメだっただけで、一般的には使えるテクニカル指標です)

いまいちな結果であれば、いろいろなテクニカル指標を順次試していこうと思っています。

機械学習期間macd

こんなバックテストになれば目標達成なのですが、無理でしょうねー
(学習期間のバックテストですw)

パぺ太メモ

iCustomでのEA開発には落とし穴がいろいろありますね。
初めからライブラリで作っておけば良かったと後悔しています。・・・時間の無駄><
まさか、バックテストを連続でできないのもiCustomが原因とは思いませんでした。

ティックデータが取れない現象はまだまだ続いています。
MT5特有の現象とは思いますが、自分のEAが悪いのかMT5が悪いのかブローカーサーバーが悪いのか全く切り分けができないのが辛いです。

EAの評価ができないわけではないので、まずはバグのない右肩上がりのEAを目指しましょう。
o( ̄ー ̄)o



EA作り直し?!iCustomの罠

EA作成中
06 /05 2020
iCustomの罠というか、ただ単に自分が勘違いしていただけというか・・・
(_ _|||)

インジケータで売買シグナルをチャートに表示し、そのデータをiCustomでインジケータバッファから読み取り、オーダーをかける。
まぁ読めば普通に聞こえるし、できそうに思います。というかiCustomってそういう使い方OKでしょ?って思うのは自分だけかも?

でも、できません。いや、できるかもしれませんが、自分は諦めました。
iCustomってEAがインジケータのバッファを参照できる仕組みです。
  • EAはOnTick関数でバッファを見に行きます。
  • インジケータはOnCalculateでバッファにテクニカルを描画します。
EAがインジケータに描画を依頼するわけではなく、インジケータがバッファに描画したと報告するわけでもなく、どうやってEAはインジケータの【更新データを漏れなく】受け取れるのでしょう?

グローバル変数でインジケータの状態を書き込み、EAで監視するなどの方法もありますが、これもEAが更新をスルーする可能性が高い、基本的にEAとインジケータは同期して動けませんし、同期させるとMT5の動作が不安定になる可能性があると思います。(Mutexなどで片方を止めておくなどの方法で同期させた場合)

インジケータの描画OnCalculateのタイミング、EAのOnTickのタイミングはMT5の勝手です。(仕様とかあるかもしれませんが、ググっても同期方法がヒットしない・・・)

解決方法は?

簡単です。作り直し。(TヘT)

よく考えると、iCustomってインジケータはテクニカル表示して、EAでシグナルの判断していますよね。これが正解な使い方です。

今回作成しているのは機械学習EAなので、インジケータでも機械学習のシグナル、EAでも同様なので、インジケータで行っている計算などを全部クラスライブラリにして、includeファイルにしてしまいます。
これをインジケータで表示できるようになれば、エンジン部分は共通で、インジケータとEAは側だけ作れば良いということです。
まぁ、MT4の時にやっていた方法に戻ります。

やることは増えましたが、解決する可能性の低い方法に固執していても時間の無駄ですからね。

データが取れない、その後


データが取れない

バックテストをすると、こんな状態でした。
リアルティックが取れないよーってエラー、知らんわ!ググっても有益な情報もなく・・・
OANDAのせいかなぁ・・・と、途方に暮れていたら、「まさか?!」MT4で「n/a」になった時のように、データの齟齬が起きているのでは?と思いつき、
ティックデータを読み込んでみました。

ティック読み込み

やったー( ̄。 ̄)
バックテストでエラーが出なくなりました。

OANDAさん疑ってすみませんでした><

パぺ太メモ

さて、今週末はライブラリを作ってインジケータ、EAを動かすぞー

バックテストでのエラーも解消したし、大きな問題が起きなければ来週末にはある程度、形にできそうですねー
大きな問題・・・何か忘れている気が?
そういえば、機械学習の予測100%はバグが見つかっていない><

EAが動いて正常にデータ収集ができるようになってからまた予測させてみよう!


機械学習を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


パペ太

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