FX自動売買研究記!

    - 為替相場をメタトレーダーの自作自動売買プログラムで勝ち抜く -

    仮想フォワードテスト 

    今回はフォワードテストについて考えて見ることにします。

    しばしば、
    バックテストはあくまで過去の成績でしかなく、EAの良し悪しを判断するためにはフォワードテストが欠かせない。
    と言われることが有ります。
    これは正しいのでしょうか。


    私は、

    「フォワードテストはこの上なく重要である。しかし、“フォワード”である必要ない。」

    と考えています。というのも、
    EAの信頼性を測るに当たって必要なものは
    「最適化に用いた期間以外のチャートデータ」
    であって、
    「未来向けて実際に行うテストトレード」
    である必要は無いからです。
    そのEAにとって未知のデータでありさえすれば、それでよいのです。

    必要なのは、「フォワード(未来)の」ではなく、「アンノウン(未知の)」なのです。

    例)
    2000年1月からのヒストリカルデータが手元にあると仮定た場合を考えます。
    この場合、2000年1月~本日までの期間で最適化を行った場合は、バックテストに使用できる未知の期間が全く確保できていないため翌日からのテストトレードが不可欠となります。
    しかし、2000年1月~2005年1月までの期間で最適化をとどめた場合は、それは不要です。
    なぜならば、2005年1月~2010年12月現在までのバックテストをもって、6年間の仮想フォワードテスト(アンノウンデータテスト)とする事ができるからです。
    最適化がカーブフィッティングに陥っていたとすれば、この6年分の仮想フォワードテストによって明らかなドローダウンが発生することでしょう。

    EAにとってみれば、データが未知のものであるならば、6年間のバックテストも、明日から実際に行う6年間のフォワードテストも、等価なのです。



    ここで問題になってくるのが、市販のEAです。
    この市販EAに関して言えば、この仮想フォワードテストだけでは不十分です。
    なぜならば、
    「EAにとって未知であるデータ」が存在しない可能性があるからです。

    外部変数として購入者が変更可能なもの以外に、既にコードに組み込まれたバックテスト済みの変数があるかもしれません。
    例えば、価格の急動対策と銘打って、「○○時間以内で**pips動いたときはしばらく取引を控えます」とされていたとしましょう。
    仮に作者に作為がなかったとしても、
    これは過去10年間で都合の悪い動きをしたトレードを除外する過剰最適化の一種と言えます。
    他人が作ったEAを最適化する時は、変数が全て変更可能であるかどうかを確認しておく必要があるでしょう。


    仮想フォワードに信頼がおけるという点こそが、自作EA最大のメリットなのかもしれませんね。

    ( 2010/12/05 01:08 ) Category フォワードテストの重要性 | TB(0) | CM(0)

    スプレッドによる成績の違い 

    途転EAがブローカーによって大きくパフォーマンスが異なっていた理由がわかりました。
    原因はやはりスプレッドの様です。
    スプレッドの違いによる成績の変化を調べてみたところ、この様な感じになりました。


    スプレッド 1pips
    toten_SP10


    スプレッド 2pips
    toten_SP20


    スプレッド 3pips
    toten_SP30


    顕著に成績に影響していますね・・・
    スプレッド3pipsのものの直近は、明らかにPFが1を切ってしまっています。

    ちなみに、
    AlpariNZでのスプレッドは、1.4pips、
    FXDDのスプレッドは、3pips前後です。
    両ブローカーで成績に差が出た理由はここですね。

    そして、バックテストではなく実運用をする際には、にはスプレッド3pips以上を覚悟しておくのが正解です。
    そうなるとこのEAを運用するのはは若干厳しいですね・・


    くそう。薄利多売系のEA作りってホント難しい。
    スウィング系ならここまでスプレッドを気にしなくてもよいのになぁ。
    というわけで、
    今のままでは、現実的では無いほどの超低スプレッドのブローカーでしか勝てないことがわかりました。
    やはりもう少し工夫してみることにします。あ、スプレッドフィルタも必要ですね。


    (スプレッド変更ツールはこちらからお借りしています。faiさん、いつも本当にお世話になっていますm(_ _)m)

    ( 2011/02/19 00:30 ) Category スプレッドの影響を理解する | TB(0) | CM(0)

    ヒストリカルデータについて 

    自動売買において、バックテストとフォワードの成績が同じパフォーマンスであることがとても重要です。
    フォワードになると極端に成績が落ちるEAというのは、もともとがそれだけのパフォーマンスしか無かったということだと思います。
    最適化のマジック、カーブフィッティングですね。

    バックテストの結果が最適化のマジックに掛かっていないかどうか検証するためには、
    最適化に利用したヒストリカルデータ以外のデータでシステムを検証する必要性があります(仮想フォワードテスト)。
    ここで問題になるのは、ヒストリカルデータは有限であるために発生する、
    『“10”あるヒストリカルデータの期間全てを最適化に使ってしまうと、仮想フォワードテストでのテストが出来なくなり、かと言って最適化の期間を“3”で行なってしまうと最適化自体のクオリティが低下してしまう。』
    というジレンマです。

    このトレードオフに対する対処としては、ヒストリカルデータの期間を増やすしかありません。

    ということで、僕は少なくとも10年間のヒストリカルデータが欲しいと思っています。
    できれば、実際にトレードが行えるブローカーでのヒストリカルデータを使いたいところです。
    (ブローカーのクセのようなものがヒストリカルデータに現れている可能性があるからです。経験上、窓埋めEAにおいてブローカーの差が顕著です。)

    それとまぁ、なんせメタクォーツ社(MetaQuotesSoftware)のデータは信用できません。
    MT4のヒストリカルセンターで簡単にダウンロード可能なアレです。ヒゲが大きすぎたりで、ドル円でのスキャル系EAのバックテスト結果が異常に良くなったりしました。
    自動売買を始めた当初、この結果を信じて実トレードしてしまいちょっと怖い目に合いました。


    こういった理由から僕は普段、
    FXDDの2005年以降のヒストリカルデータ
    http://global.fxdd.com/jp/mt1m-data.html
    (FXDD公式サイト)
    と、
    アルパリの2001年から2009年までのヒストリカルデータ
    http://thetrademachine.com/blog/2009/09/29/set-up-metatrader-history-data-get-90-backtesting-quality/
    (海外の個人ブログ?)
    を使って最適化と仮想フォワードテストを行っています。

    アルパリのヒストリカルデータは公式からダウンロードすることができなくなっていますが、
    上記リンク先には、以前公式でアップされていた?ヒストリカルデータがアップされています(Step1のところです)。
    詳しく検証していないため、これが正しくアルパリ公式のヒストリカルデータであると断言できないものの、
    少なくともメタクォーツ社提供のヒストリカルデータよりは正確だと思います。


    アルパリUKは、今や使えないブローカーになってしまいましたがヒストリカルデータだけは今でも使わせてもらっています。





    ( 2011/03/05 14:50 ) Category フォワードテストの重要性 | TB(0) | CM(0)

    ヒストリカルデータの差異について 

    長期間のEA運用を経て、フォワードテストがバックテスト通りにならないことを理解しました。
    その原因は、
    各時間取引量などに起因するスプレッドの違いであり、
    使用するブローカーそのものの違いであり、
    同一ブローカーであってもサーバーの違いによる提示価格の違い
    によるものです。

    それらの理由から、次のような結論を見出しました。

    「バックテストと実運用は、必ずしも同じ取引にはならない」
    「ブローカーの違いによって成績差が発生する」
    「しかしそれらは必ずしもマイナスに働くものとは限らない。運、誤差の範疇として許容すべきものである」
    「ゆえに、複数のヒストリカルデータを使用し、全てにおいて好成績を上げたEAのみを用いるべきである」

    というものです。
    バックテストに使用するヒストリカルデータは、複数の企業が提供してくれています。
    Metaquotes(ここのデータは信頼性皆無。好成績になりすぎる)、FXDD、Alpari、Forexite、などです。
    実運用とバックテストが異なること、そして業者間でスプレッドが異なることを考慮して、
    複数のブローカー、複数のヒストリカルデータでEAを検証すべきです。

    実際はそれほど大きな成績差は出ませんが、
    あるヒストリカルデータではほぼ無敵の様な成績であっても、
    あるヒストリカルデータでは、すごく優秀。といったレベルに低下することがあります。
    どの様な要因が働いているのかは定かではありませんが、
    実運用では、それらのバックテストの中で最も悪かった成績程度の利益しか得られないと覚悟しておくぐらいが
    精神衛生上正解だと思います。


    僕は念のため、
    1.アルパリ社ヒストリカルデータ、2001.1.1~2006.1.1の5年間で最適化
    2.同アルパリ社ヒストリカルデータ2006.1.1~2011.1.1の5年間で仮想フォワードテスト
    3.仮想フォワードテストをパスしたものについて、FXDD社の2005.1.10~今日までの期間で再確認
    4.FXDD社の再確認をパスしたものについて、FXDD社のデータで最適化の微調整
    5.微調整が完了したものをアルパリ社ヒストリカルデータで再確認
    というプロセスで、最適化をしています(実運用はFXDD)。

    一社での最適化ひと通りのヒストリカルデータでは、
    万が一得意な条件でのみ勝てるEAに仕上がってしまう恐れがあるからです。



    ( 2011/04/19 23:28 ) Category フォワードテストの重要性 | TB(0) | CM(1)

    リスクリワードレシオを重視する 1 

    リワード(Reward)は利益。そして、
    リスク(Risk)はその危険度ですね。
    リスクリワード比とは、直訳すれば“収益に対するリスクの割合”という事になります。

    システムを評価する際、僕は専らこのリスクリワード比を重視して最適化を行っています。

    システム評価基準としてメジャーな指標はプロフィットファクター(PF)だと思いますが、
    僕はこのプロフィットファクターをあまり重視していません。
    なぜなら、プロフィットファクターはあくまで“確定損益-確定損益比”であって、“リスク-リワード比”では無いからです。
    プロフィットファクターには、“リスク”に対する重要な要素が考慮されていません。

    それは、運用リスクを考えるに当たって極めて重要な要素である、“含み損”です。
    ストラテジテスターにおいてプロフィットファクターが計上する損益はあくまで“確定損益”を意味するため、
    実は含み損が無視されてしまうのです。

    プロフィットファクターという評価基準は含み損という潜在的リスクを考慮しないため、
    破綻寸前のナンピンを繰り返すシステムであっても、たまたま破綻せずに生き残れば超好成績EAとして評価されてしまいますし、
    逆に、リスク最小化のためあえてこまめに損切りを行う安定型EAは不当な低評価を受ける結果となります。
    含み損は資金の限度を超えてしまえば強制決済という形で確定損益化してしまいますので、
    正しいリスク評価を行うならば、含み損をきちんと計上するべきです。

    では、ストラテジテスターの結果として表される値の中で、含み損を正確に知り得るものは何でしょうか。

    例えば、最大ドローダウン(Maximal drawdown)です。
    ストラテジテスターで示される最大ドローダウンでは、含み損の状態もドローダウンとして計上してくれますので、
    この値をリスクとして計上する評価基準を用いれば、含み損の存在をしっかり意識したシステム評価が可能になります。





    リスクリワードレシオを重視する2 

    リスクリワードレシオを重視する1をふまえて、
    僕が参考にしているシステム評価基準は、Mr.Brainレシオというものです。

    Mr.BrainさんはクロスファイアFXの作者の方で、こちらのサイトにて、このMr.Brainレシオの使用を推奨されています。

    計算式は、  

      ブレインレシオ = 純利益(Total netprofit) ÷ 最大ドローダウン(Maximal drawdown) ÷ トレード期間

    となっています。
    純利益(Total netprofit) が リワード(Reward)
    最大ドローダウン(Maximal drawdown) が リスク(Risk)
    ですね。

    この評価基準の素晴らしいところは、
    期間ごとの収益期待(純利益/トレード期間)と、
    そこに内包するリスク(最大ドローダウン)が一目で分かる
    という点です。

    例えばこのEA。

    ブレインレシオは、2447(総利益)÷1756(最大ドローダウン)÷6(トレード期間)
              = 408(年間期待純利益)÷ 1756(最大ドローダウン)
              = 0.23となり、
    リスクに対する年間の利益は23パーセントであることを示します。


    次の記事では、PF(プロフィットファクター)と比較してこのブレインレシオがいかに有益か書いてみたいと思います。

    リスクリワードレシオを重視する 3 

    私がPF(プロフィットファクター)ではなくブレインレシオを重視するのは、次のような理由からです。

    まず下の2つのグラフを見て下さい。

    Batou_Counter_EURUSD_30min_L

    Togusa_USDJPY_1h_L

    一見、下のグラフのほうが好成績に見えると思います。
    実際PF(プロフィットファクター)を用いてこれを評価した場合は、
    上 PF=1.91
    下 PF=4.38
    となり、圧倒的に下のEAの方が高い評価を受けることになります。

    しかし実際は、PFで見るほど能力差はありません。
    売買回数と1トレードあたりの獲得pips幅が違うため、PFではうまく比較できていないだけなのです。

    ブレインレシオ(総利益-潜在リスク比)を見ると、
    上 ブレインレシオ= 6.33 (7838÷1124÷11年間)
    下 ブレインレシオ= 6.31 (6867÷1208÷9年間)
    となっており、
    期待される利益に対するリスク比は両者に違いがありません。


    ブレインレシオは、確定損失だけでなく潜在損失(含み損)をきちんと考慮できる点、
    そして、トレード回数が大きく異なる全く違った戦略のEAを同じ土台で評価することが出来るという点。
    この2点が非常に優秀です。

    このブレインレシオという評価基準を使えば、
    破綻寸前の含み損を持つナンピンEA(PFだけは優秀)はゴミのような評価となりますし、
    適宜損切りを行っていく地味な安定型EA(PFは平均的)が輝きを見せ始めます。


    ときどき、
    おいおい一次関数かよ!というぐらい右肩上がり一直線の損益曲線の商材EAをしばしば目にしますが、
    大抵計算してみるとブレインレシオが激低です。
    含み損が大変なことになっていますので、注意して見てみてください。
    (Maximal_Drawdownの数値を隠してグラフだけ見せている様なEAは、大体そんな感じです。気をつけて下さい)



    僕がスウィングトレードEAにこだわる理由①② 

    僕の運用しているEAはスウィングトレードタイプがほとんどです。
    そもそもスキャルピングEAを作る実力がない。というのが最大の理由ですが、
    スウィングEAにこだわる理由がこの他に3つあります。

    ① スプレッドの影響を受けにくい。
    少利多売のトレードをする場合、スプレッドの影響というのは本当に大きいです。途転EAのスプレッドによる差異参照
    例えばスプレッドが3pipsの場合、
    クローズがエントリーから100pips先であれば、スプレッドの影響は獲得利益の3%ですみますが、
    クローズを10pips先に設定したとすると、スプレッドが獲得利益の30%を占めることになってしまいます。
    稼いだ年収の30%を税金でさっ引かれる感覚です。お金貯まりません。
    わざわざこんな不利な戦いをしなくてもいいじゃないか。と僕は思うのです。


    ② ノイズが少ない
    テクニカルのみを判断の拠り所にするシステムトレードにおいて、ランダムウォークというのは天敵です。
    そして、チャートはミクロな動きになればなるほ不規則性が増大し、ランダムウォークに近づいていくと僕は考えいています。
    ですから、価格のミクロ的な乱高下をとらえ利益を得るスキャルピングをEA化するという試みは、
    ランダムウォークの中でシステムトレードの統計的優位性を唱えるという、自己矛盾的な違和感を感じるのです。

    実際、スキャルピング系のEAもいくつか作りましたが、なんとか利益を出せたのは、
    中~長期の移動平均線をフィルタにするなど、マクロ的な視点を取り入れたEAのみでした。
    短期の足でEAを作っていながら、結局は中~長期の足のスケールで大局を判断せざるを得なかったのです。
    つまり、スウィングトレードでポジションを持つ方向にポジションを貼り、ただ小刻みに利確するだけのEAが出来る結果になったわけです。
    それならば、最初から中~長期のトレンドをとらえることを前提としたスウィングトレードEAを制作し、
    手仕舞いの精度を高めることを考えた方が理にかなっていると判断しました。

    短期的視点のみで判断を行うEAを作ることが出来る人ももしかしたら世の中にはいるかもしれませんが、僕には無理でした。



    ③はまた今度書きます。

    僕がスウィングトレードEAにこだわる理由③ 

    ③ 最適化が速い

    僕にとってこれが一番重要です。
    最適化にかかる時間が長いと、いつまでたってもEAが完成しないからです。

    というのも、僕にとってEA制作は、
    大量のインジケータとパラメータの組み合わせを変え、
    最適化と仮想フォワードテストを延々と繰り返し、
    “たまた統計的有意性を持ってしまった組み合わせ”を見つける。
    という作業だからです。

    最適化 → 仮想フォワードテスト → コード修正 or 作り直し → 最適化 → 仮想フォワードテスト → コード修正 or 作り直し →・・・・・

    というループがもう延々と続くわけです。
    そのループの一過程である最適化に丸一日を使ってしまうと、一つのEAがいつまでたっても完成しません。
    ざっくり最適化したとして、できれば30分程度でコード修正に伴う成績変化を確認できるくらいが理想です。

    もちろん、5分足上で動作するEAの最適化であっても最適化期間を12分の1にすれば、
    最適化にかかる時間を1時間足と同じにすることが出来ます。
    しかし最適化期間が短くなってしまうと、その期間に発生しているトレンドにカーブフイッティングすることが避けられません。
    例えば一年間ずーっと買い相場なんてこともままありますから、その期間で最適化されたEAは恐らく買いに極めてアグレッシブになってしまうはずです。
    そうなれば、相場転換に対応できず、仮想フォワードテストでドローダウンを受ける可能性は跳ね上がります。

    EA制作ループのゴールは仮想フォワードテストで好成績を収めることですので、
    最適化期間の短縮は本末転倒な結果となります。

    というわけで、
    ・30分程度でざっくりと最適化ができる
    ・カーブフィッティングをなるべく避けるため、長期間で最適化がしたい
    この二点を満足したい僕にとって、最適化の信頼性と最適化時間のバランスが一番良いのは1時間足を使ったスウィングトレードだったんです。



    他にも最適化の高速化のために色々工夫をしています。
    またいつか書くかもしれません。

    FXDDの強制決済要件 

    自動売買システムを複利運用するにあたり、強制決済についてきちんと調べてみました。

    実は最近まで、強制決済に対して誤った認識を持っていました。
    “強制決済は有効証拠金がゼロになったときに発生する。”と思っていたのです。
    いやぁ、お恥ずかしい。
    ですから強制決済を食らう直前も、
    「随分含み損があるけど、まだ有効証拠金には余裕がある。反転まで恐らくは耐えられるだろう。」
    なんて思っていました。
    あまりにも無知でした。いやぁ、ホントお恥ずかしい。


    FXDDのHP(必要証拠金とレバレッジの関係について)に、この様な説明があります。

    必要証拠金とは発注した注文に対して担保として最低限必要な額。通称証拠金とも呼ばれます。
    強制決済になる場合は、この必要証拠金が有効証拠金と同じもしくは有効証拠金を上回った瞬間に強制決済となります。


    つまり、保有しているポジションがあまりにも多ければ、
    有効証拠金(含み損益を考慮した残高)が残っていても強制決済の要件を満たすんですね。

    必要証拠金の計算方法によれば、

    必要証拠金の算出方法はこちらです:
    数量 × ドル立てで表記したベース通貨の取引額  ÷  レバレッジ

    例1)
    3ロットのUSD/JPN成行買い注文を200:1口座で発注した場合:
    (当時USD/JPNが85.570)
    3(ロット)x 100,000 (通貨単位)÷200(レバレッジ)=$1500(必要証拠金)
    *注意:USD/JPNの場合、USDがベース通貨(通貨ペアの左にある通過)であるため、数量をレバレッジで割ったでだけで必要証拠金を計算できます。

    例2)
    1.5ロットのEUR/USD成行買い注文を200:1口座で発注した場合:
    (当時EUR/USDが1.3088)
    1.5(ロット)×100,000(通貨単位)×1.3088(ドル建てする為)÷200(レバレッジ)=$981.60(必要証拠金)


    との事です。

    なるほどなぁ。やはり余裕を持った運用をしないとダメですね。

    今回、EAの複利化を行うにあたって
    ◯強制決済の要件(有効証拠金と必要証拠金の関係)
    ◯必要証拠金の計算方法
    を確実に理解しておく必要に迫られたために、こうやって色々調べてみたわけですが・・・

    こんなことも知らずに(強制決済について勘違いをしたままで)FXをやってたなんて、
    今ではちょっと非常識だったかなぁと反省しています・・・


    ( 2011/07/31 15:52 ) Category ブローカーを知る | TB(0) | CM(0)
    プロフィール

    asahi_fx

    Author:asahi_fx
    日々のEA開発記録を綴っています。

    忙しい時は全然更新できませんが、
    進展がある度に少しづつ書いていこうと思います。



    運用中のEA


    Batou_EURUSD_1h_L
    Batou_AUDUSD_1h_L
    Batou_Counter_EURUSD_1h_L
    Batou_Counter_EURUSD_30min_L
    Ishikawa_EURUSD_1h_L
    Ishikawa_AUDUSD_1h_L
    Ishikawa_EURGBP_30min_L
    Ishikawa_USDJPY_1h_S
    Ishikawa_USDJPY_30min_S
    Togusa_USDJPY_1h_L
    Togusa_USDJPY_1h_S
    Togusa_USDJPY_5min_S
    Togusa_EURCHF_1h_S
    Togusa_EURCHF_5min_S
    Borma_USDJPY_15min
    Borma_EURUSD_15min
    Borma_GBPUSD_15min
    Paz_WPR_gradient_USDJPY_15min
    Pza_heikin_EURUSD_1h