#はじめに
##FXシステムトレードで学習期間をスライドさせた場合
ryo_gridさんの「FXシステムトレードのプログラムをいくつか作ってみて分かった課題とその解決法について」を受けて、学習期間をスライドさせた場合、どのような結果が出るかを試してみました。
##課題
市場は常に変化しており1つのアルゴでは対応しきれない(ように思えた)
##考えられる対応策は3つ(うまくいくかは不明)
・機械学習なアルゴであれば、市場の変化に応じて再学習を続けていく
・バックテストしようとすると計算量が膨大になるので試せていない。
この点については、全部一から再学習するのではなく、学習期間のウィンドウをスライドさせて
追加学習及び過去の学習内容の忘却ができるようなアルゴリズムがあるとよさげ。
ただ、実運用では適当なタイミングでまるっと再学習でもさほど問題にはならないだろう。
#テスト内容
「学習期間のウィンドウをスライドさせて追加学習及び過去の学習内容の忘却」、「適当なタイミングでまるっと再学習」でどのようになるか。
#実行方法
・環境は、Metatrader4、ブローカーはAlpari
・プログラムは先日、MQL4.comに投稿した、Simple Single Layer Perceptron EA
https://github.com/Kei-Sanada/Slime_Mold_RSI
・バックテスト期間は2017/07/03~2017/09/01の9週間。
・対象はEUR/USD、5分足
・テストAはテスト期間前の2週間6/19~6/30で学習(最適化)したパラメータのまま。
テストBはスライド方式。
07/03~7/7は、2週間前の6/19~6/30で学習(最適化)したパラメータで。
次の7/10~7/14は、その2週前の06/26~7/7で学習(最適化)したもの、
と学習期間をスライドさせていきます。
・最適化は、Metatrader4のOptimizationを用いて。
初期証拠金は$10,000 取引単位は10,000通貨 スプレッドは10
パラメータは、豊嶋 久道氏の「新MT4対応 FXメタトレーダープログラミング入門」の
「売買システムの評価方法」にある「(リカバリーファクター)-( プロフィットファクター)」の差が最大のものを選択。
補足:Simple Single Layer Perceptron EAには、「(リカバリーファクター)-( プロフィットファクター)」の差を出力する機能は実装していません。
#結果
・Metatrader4のバックテスト機能ですが、テスト期間の最終日の23:59時点で保持しているポジションは、23:59でクローズされます。
・07/03~07/07はテストA、B共に学習期間が同じ6/19~6/30のため同じ結果です。
Total net profit $
期間 | テストA | テストB | 差(B-A) |
---|---|---|---|
07/03-07/07 | 36.84 | 36.84 | 0 |
07/10-07/14 | -38.62 | -58.16 | -19.54 |
07/17-07/21 | 23.74 | 0.28 | -23.46 |
07/24-07/28 | -143.60 | 14.52 | 158.12 |
07/31-08/04 | 57.00 | -0.40 | -57.4 |
08/07-08/11 | 51.54 | -115.90 | -167.44 |
08/14-08/18 | -37.18 | 17.10 | 54.28 |
08/21-08/25 | 47.70 | -40.56 | -88.26 |
08/28-09/01 | -9.90 | 182.16 | 192.06 |
平均 | -1.386666667 | 3.986666667 | 5.373333333 |
#検定
期間 | テストA | テストB | 差(B-A) |
---|---|---|---|
07/10-07/14 | -38.62 | -58.16 | -19.54 |
07/17-07/21 | 23.74 | 0.28 | -23.46 |
07/24-07/28 | -143.60 | 14.52 | 158.12 |
07/31-08/04 | 57.00 | -0.40 | -57.4 |
08/07-08/11 | 51.54 | -115.90 | -167.44 |
08/14-08/18 | -37.18 | 17.10 | 54.28 |
08/21-08/25 | 47.70 | -40.56 | -88.26 |
08/28-09/01 | -9.90 | 182.16 | 192.06 |
平均 | -6.165 | -0.12 | 6.045 |
・帰無仮説$H_0$として「学習期間のウィンドウをスライドさせても利益は増えない」($\mu_d$=0)とします。
・今回は利益が増えたかのみを考えるので片側検定、自由度「8-1=7」
Excel2010の分析ツール、「t検定:一対の標本による平均の検定」を用いた結果、帰無仮説は棄却されず有意差は認められませんでした。
(P(T<=t) 片側 = 0.446350035, p>.05)
補足:「検定」については、ご指導、ご指摘いただけると幸いです。
#考察
・今回は、学習期間が固定でも、スライドさせても変わらないという結果になりました。
為替の動きが一方向に継続している時期なら、また違った結果が出たかもしれません。(ex.ドル安が2ヶ月間続いている、など)
・プログラム Simple Single Layer Perceptron EA、データ(5分足)、学習期間(2週間)が適切なのかということもあります。
#追加(2017/09/06~)
2017/09/06
せっかくですので、学習期間を10年と約2年半と長くしてみたものを動かしてみます。
myfxbook.comというサイトから、Alpari社のVirtual Reality ContestにSimple Single Layer Perceptron EAで参加している様子が以下のリンクから参照できます。
Alpari Virtual Reality Contest 2017 Round3
トレード対象はEURUSD、USDCHF。
EURUSDで、1時間足、学習期間は2007/08/01~2017/08/30と10年間
USDCHFは、1時間足、学習期間は2015/01/15~2017/08/30と約2年半
*なお、2017/09/06 10:40時点でEURUSD、USDCHRのポジションは有りません。
Alpari Virtual Reality Contestについては以下をご覧ください。
https://alpari.com/en/contest/virtual_reality/
Alpari Virtual Reality Contest Round3は2017/09/30まで。
上の設定ではポジションを取るまでの時間、ポジションを保有する時間が長い場合(1~2週間)があるので、2017年9月末までに何回ポジション取るか分かりません。
2017/09/11
EURUSDは引き続きポジションは持っていませんが、USDCHFは10回取引をしています。
Alpari Virtual Reality Contest 2017 Round3を開いて真ん中あたりにあるTrading Activityのタブ、Historyを開くと取引の履歴が参照できます。
*2017/09/04以前のポジションがありますが、これはSimple Single Layer Perceptron EAの動作確認のため、動かしていた時のポジションです。
USDCHFのチャートで見ると以下のようになります。
緑色がLong、赤色がShortです。
2017/09/17
引き続き、EURUSDはポジション無し。ただし、来週Shortからポジションを持ちそうでです。
USDCHFのチャート
緑色がLong、赤色がShortです。
赤で印をした箇所は、9/11(月)15:00 0.94979のShortを9/15(金)02:00 0.96173まで抱え込んで119pipsと大きく負けた期間です。
Alpari Virtual Reality Contest 2017 Round3が9月末までなので、損切りをするようにプログラムを変えたいとも思いましたが、まずはプログラムは変えず、このままでいきます。
ただし、ロットサイズについて、USDCHFは25万通貨、EURUSDは5万通貨としていたのですが、EURUSDを11万通貨に変更します。(気持ちの問題ですが、出来ればプラスで終えたい)
ロットサイズについては「ラリー・ウィリアムズの短期売買法 【改定第2版】」にある 、ケリーの公式で計算したロットサイズの半分としていましたが、EURUSDは元のロットサイズにします。
2017/09/19
9/18(月)20:00にEURUSDを1.19339でShort。1時間後、クローズして、1.19372でLong。
2017/09/21
FOMC、日銀政策金利発表、ドラギECB総裁の発言などありますが、特に設定は変えていません。
2017/09/22
口座がプラスに。
Plus Rating(利益の増加率ランキング)で参加者4,104人中1,188位。
2017/09/30
最終的に$677.96(0.68%)プラスで終了。
Plus Rating(利益の増加率ランキング)で1,168位。
以下、利益の推移のグラフ。赤丸がEURUSD、USDCHFでトレードを開始した9/6です。
学習データはEURUSDが10年間、USDCHFが約2年半なので、EURUSDの方が安定的に利益をだすかと考えていました。結果としてEURUSDが110pipsのプラス、USDCHFが1,246pipsと、この期間においてはUSDCHFの方が良い結果でした。
#気づいた点
既に「学習期間をスライドさせた場合の考察」という本題から外れていますが・・・
1.コンテストで上位に入ろうと考えた場合、単一の通貨、単一のアルゴリズムで参加するよりも、複数通貨、複数アルゴリズム、小ロットで最初参加して、調子が良いもののロット数を増やすとか調整した方が良さそう。
2.トレードするアルゴリズムと、調子が良い/悪いを判断するアルゴリズム、どの通貨、どのアルゴリズムに、何ロット割り当てるかの判断をするアルゴリズムが必要そう。
3.9/21のFOMC、日銀政策金利発表、ドラギECB総裁の発言などイベントの時、「ロット数を減らす、トレード自体を止める」、もしくは「過去のイベント込みのデータで学習しているので平常運転」のいずれが良いのか判断はつかなかった。
1、2はあくまで感覚ですが、その方が良いだろうな、という感じを受けたのですが、3については経験が浅い、また、イベントが為替に与える影響がよく分からないこともあって、この方が良さそう、という感覚がつかめませんでした。
#その後
Alpari Virtual Reality Contest 2017 Round4(2017/10/16~12月末まで)も参加してみます。
2017/10/31
とりあえず、参戦。
[Alpari Virtual Reality Contest 2017 Round4]
(https://www.myfxbook.com/members/Kei_Sanada/alpari-virtual-reality-contest-2017/2309243)
2018/01/05
特に良いところも無く154回の取引、-$157.63。(-0.16%)で終了。
そもそも、上記の1、2に着手できませんでした。
気づいた点
・VPSが一回落ちた。
何かしら死活監視の仕組みが必要
・トレードしていた通貨が途中から取引できなくなった。
USDXMNを取引していたのですが、コンテスト途中から取引の対象外になった様子。
会社の規約も把握する必要があります。
2018/03/06
Alpari Virtual Reality Contest 2018 Round1 に参戦しました。
1/28に登録。USD/CHFでSimple Single Layer Perceptron EAを3つと、その亜種1つで取引。
3/1までポジションを取らず。
3/1にようやくShortから。
現時点で参加4,846人中、1087位。
Alpari Virtual Reality Contest 2018 Round1
・ポジションを取った早々、VPSが再起動
・証拠金の計算を間違えて、Lotを多く設定していたため、証拠金不足でShortの発注をしそびれる。
2018/03/15
10%プラス、参加5,245人中、565位。
2018/03/31
最終的に9.33 %プラスで688位。
ただし、ドローダウンが13%もあったので、あまり良い結果とは言えません。
後半は日記のようになってしまいましたが、本投稿への更新はここまでとします。
参考:MT4の記事に興味がある人たちの居住国
MQL4.comに投稿した、Simple Single Layer Perceptron EAの末尾に本投稿へのリンクを2018/01/29からつけていました。
Qiitaの投稿、Google Analyticsで分析できるので、Google Analyticsで見た、上記のリンクからこちらの投稿にたどり着いたと思われる方々の居住国です。
サンプル数が少ないですが、意外にバラバラだなという印象です。もう少し、偏りがでるかな、と考えていました。
国名 | ユーザー数 |
---|---|
Indonesia | 3 |
Brazil | 2 |
China | 2 |
France | 2 |
Malaysia | 2 |
United States | 2 |
Spain | 1 |
Italy | 1 |
South Korea | 1 |
Morocco | 1 |
Mexico | 1 |
Ukraine | 1 |