2011/09/24

初本番に向けて - 最適化の目的関数/期間、WF期間の選定方法を見直してみる



さて前回は、MT4用共通部品「ahfw」MT4障害監視システム「ahfw_hc」の機能テスト完了版リリースと、今後の予定の見直し結果について書きました。今回は、前回記事で追加した予定作業のうち、ウォークフォワード分析」での「最適化の目的関数/期間、WF期間の選定方法」を再検討した内容について書いてみたいと思います。

まずは、「ウォークフォワード分析」での課題

【課題】
----------------------------
1.ウォークフォワード分析工程での最適化期間とWF期間の求め方が曖昧
  かねてから疑問だった、ウォークフォワード分析工程」での最適化期間とWF期間の求め方
  が曖昧さ。以前やってみたやり方だとなんだか信憑性に欠けるというのか、判断するのに使った
  サンプル数が少なくて、今一歩確信が持てなかった状況。

  もう少し具体的に言うと、1通貨ペアをウォークフォワード分析する時に10年分のデータがあって、
  WF期間を1年(つまり1年毎に再最適化する)で検証をした場合、10個のパラメータセットに対する
  検証しかされない事になっちゃう。

  そして、何パターンかの期間の組合せで全体のWF効率がベストとなる期間を選んでた。
#本当はWF期間毎のWF効率もみるべきだけどバラバラすぎて参考にならない。。

  当然懸念されるのが、最適化/WF期間のパラメータ自体がカーブフィッティングしてるんじゃない
  かなと。少なくとも評価対象のサンプル数が少ない。
  #今回のトレードルールの性質上少なくなるという話もありますが。。

2.そもそも定期的な再最適化に優位性はあるのか
  そもそもなぜ定期的な再最適化をするかという事を考えて見ると、「市場変化に追従」する為。
  となると、選んだ最適化の目的関数や最適化期間/WF期間に一定の優位性が無いと、
  「市場変化に追従する」という目的から外れてしまう。
  
  つまり優位性が無ければ、定期的な再最適化自体が裏目にでて、無駄なパフォーマンス劣化
  をもたらす事になってしまう。
  
  「じゃぁ、再最適化しなきゃええやん」という考え方もあるんだけど、パラメータを決めなければ
  ならない事に変わりは無いし、「じゃあ市場変化への追従ってどうするの?」に答えが無い。
----------------------------

この課題を打破するかもしれないのが、前回紹介し、わしの心を掴んで離さない
以下のブログ記事。

  Phaiさんのブログ「FXシステムトレード研究ノート~上級者用~」で考案されてた、
  フォワードテストと再現性指数」という記事の内容。

今回応用するのは、この記事の中に出てくる以下の記載の考え方を再検討の中心にすることに。

 ●記事抜粋
  パラメータを選択してそれが将来良い成績を収めるかどうかを気にするのであれば、
   同時に、選択しなかったものも将来きちんと悪い成績であるかどうかも気にするべきだ
   と考えたのです。

そして、これを定量化したのが上記ブログ記事で「再現性指数」と命名されたR2乗。
#この「R2乗」という値を知らなかったので調べて見ると計算式は相関係数を2乗したもの。じゃあ、相関係数じゃだめなの?
 わざわざ2乗する意味は?という疑問。
 これも調べて見ると
 「決定係数は(重)相関係数Rの2乗に等しく,R2と書かれる.決定係数は,変動のうち回帰式によって説明できる割合を表わし,
  寄与率とも呼ばれる.」
 という事らしい。。


じゃあ「最適化の目的関数/期間、WF期間」を決めるのに、どう使おうとしているのか。

【最適化の目的関数/期間、WF期間を決める手順】
---------------------------
パラメータの最適化と同じ様に、最適化目的関数/期間とWF期間の組合せ全てのR2乗を求めて、
そこから一番よさげな組合せを選べばええんじゃないのかと。

そして、考えたのが以下の手順

1.最適化期間の目的関数の結果とWF期間純益の「偏差値」を求める
  前述のブログ記事と異なるのは、最適化期間で使うデータをPips数にしているのに対して、
  今回は最適化期間での「目的関数の計算結果」になるところが異なる点。

  つまり、R2乗を求めるX軸の値とY軸の値が全然別の尺度になってしまう。
  なので同じ尺度にする為にそれぞれをパラメータセット群の中での「偏差値」
  を使う事にした。
  
  結局、最適化期間で選んだパラメータセットが、WF期間で優位になればいい
  という考え方。

2.R2乗に符号をつける
  さて、R2乗の計算式は相関係数を二乗した値なので、必ず正数になってしまう。
  逆相関という嬉しくない状況で、たとえR2乗が高くてもしょうがない。
  つまり、以下の様な状況。

    
  このグラフの場合、R2乗値は0.3262というなかなかいい状況
  にも関わらず、線形近似線が右肩下がりという嬉しくない状態。
  #つまり完全に、定期的な再最適化が裏目に出てる状態
  
  なので、R2乗に元もとの相関係数の符号を付与することにした。
  これを「符号付R2乗値」と呼ぶことにした。
  #素直に相関係数を使えばいいじゃないかという話もありますが。。

3.符号付R2乗値のシャープレシオを求める
  ウォークフォワード分析の場合、1通貨ペアで1つの最適化期間とWF期間の組合せ
  でも複数の「符号付R2乗値」が得られる事に。
  
  じゃあこれを総合的に評価する為に考えたのが、「符号付R2乗値」のシャープレシオ
  を求めるという事。
  つまり、ウォークフォワードで得られた複数の「符号付R2乗値」の「平均値」を「標準偏差」
  で割った値。
  
  この「符号付R2乗値シャープレシオ」が高い、目的関数/最適化期間/WF期間
  の組合せがいいという決め方。
  
4.「符号付R2乗値シャープレシオ」のスキャン結果から堅牢ものを選ぶ
  つまり通貨ペア毎に、目的関数、最適化期間、WF期間毎に、堅牢そうな値を選ぶ。

  例えば、「符号付R2乗値シャープレシオ」の以下が高いものを優先的に選ぶ。
  正数値となった比率(母数は全目的関数・最適化期間・WF期間の全組合せ)
  正数値になった内の平均値
  全体の平均値
  
  そして、それぞれで選んだベストな値を組み合わせて、目的関数、最適化期間、WF期間
  を決める。

5.ブートストラップ法で「符号付R2乗値」が0以下でない事を確認する
  これは「テクニカル分析の迷信」という書籍に載っていた方法。
  本書籍では、トレードパフォーマンスの期待利益を推定する方法として紹介されて
  いたけど、これを「符号付R2乗値」に置き換えて使う。
  もし「符号付R2乗」が0以下である事が証明された場合は、別途考える。。。
  #ただサンプル数が10とか15とかで上手く機能するのかどうか。。
---------------------------
  
めっちゃ大雑把に考え方を言うと、定期的な最適化が裏目に出ないレベル
目的関数/最適化期間/WF期間を決めて、「市場変化への追従」に対応
していこうという考え方。

あと、さらに応用するとすると、一回決めた目的関数/最適化期間/WF期間の
の組合せの寿命が切れたことを見極める事もできるんじゃないかなぁとも。
#つまり、リアルトレードで一回WF期間を経過する度に「符号付R2乗値」が大きく外れた値になっていない事を確認する。

結局今回の手順は、あくまでも選定根拠をもっと明確にしたいという意図。










皆様の突っ込みを
お待ち申し上げております。。





そして、新たな試みの結果にワクワクしながら、「FXシステムトレード初心者奮闘記」は具体的な集計状況に進むのでした。
#デモ口座で動いてるMT4用EAから初のエラーメッセージ受信。。改善が必要かも。。

4 件のコメント:

  1. kartz 【旧ブログから転記】2013/05/07 18:33

    お久しぶりです。
    誰も突っ込まないので、ちょっとだけw

    2つのケースに対する、上図のような散布図があるとします。
    点の数は 100個としましょう。このとき、2つの散布図から求めた2つの相関係数(R)
    の間に統計的に有意な差があるためには (危険率は 5%とします)、
    大雑把な計算で、両相関係数間に 0.23 程度の差 (Rd) が必要となります。
    # 両係数の値に依存しますので、厳密には 0.23 といった定数にはなりませんが。

    したがって、下の3つのケースでは、R^2 はそこそこ違っているように見えても、
    統計的には 3つとも同じということになります。

    データ数 100
    ケース1: R^2 = 0.36 (R ≒ 0.6)
    ケース2: R^2 = 0.21 (R ≒ 0.46)
    ケース3: R^2 = 0.14 (R ≒ 0.37) # 0.6 - 0.37 = 0.23 (Rd)

    点の数を増やせば、つまり、パラメータの組み合わせ数を増やせば、上記 Rd は
    小さくなりますが、本質は変わっていないので解決にはなりません。。。

    【旧ブログから転記】
    ※ このコメントは、旧ブログで頂いたコメントを、ブログ筆者が転記したものです。

    返信削除
  2. kartz様

    ご無沙汰です!突っ込みありがとうございます!

    ご指摘頂いのは、堅牢な最適化期間とWF期間、最適化目的関数を選択するのに、今回の手順が解決(もしくは改善)にならないのではないか、って事であってますでしょうか?

    確かに、最適化スキャン数を30→100に増加させた事によって堅牢性の向上にはならないと思います。

    ただ今回のケースの場合、従来の手法だと1回のフォワードテストで評価されるのは1つのパラメータセットだけになります。
    この場合、異なる期間を比較するので、市場状況の変化(つまり評価対象期間の違い)によって、たまたまいいパラメータを選択したのかどうかがわからないと考えました。

    なので今回の手順は、1回のフォワードテストでR2による評価を行う事で、偶然性をある程度排除できるのではないか、という発想です。

    要約すると、1回のフォワードテストで、1つのパラメータセットだけを評価するよりも、複数のパラメータを総合的に評価することで、市場変化の影響をある程度抑えれて、評価結果の堅牢性が高まると考えました。

    もしかして、この発想そのものがズレてます?

    > 統計的に有意な差があるためには

    ここで言う、「統計的に有意な差」はt-検定による評価方法でしょうか?
    もし他の判定方法であれば、教えて欲しいです!

    いずれにせよ、今回コメント頂いた例で言うと、R2が0.23を上回っていないと、エッジがあるとは言えないという事ですよね。。

    【旧ブログから転記】
    ※ このコメントは、旧ブログのコメントを、ブログ筆者が転記したものです。

    返信削除
  3. kartz 【旧ブログから転記】2013/05/07 18:35

    手法の趣旨は理解しているつもりです。
    私が言いたかったのは、この手法で使われる R、R^2 の値にはかなり
    ブレがありそうなので、下手すると数字遊びになってしまうかも…、
    ということです。ダメ元の軽い気持ちで試してらっしゃるだけなら、
    別にいいのですが…。

    記事中の手順4「スキャン結果から堅牢なものを選ぶ」の段階で、データは
    すべて in-sample 化してしまっていますので、別途、この手法自体の
    out-of-sample テスト (フォワードテスト) が必要になるでしょうが、
    それに触れられていなかった点も気になりました。

    まあ、既に実験を始めてらっしゃることですし、結果報告をお待ちして
    います。

    >「統計的に有意な差」はt-検定による評価方法でしょうか?

    t検定は、2群の平均値に有意な差があるかどうかを調べる検定です。
    2群の相関係数に有意な差があるかどうかは、相関係数のZ変換値が
    正規分布に乗る性質を利用した検定を使います。例えばコレ↓です。
    http://www.koka.ac.jp/morigiwa/sjs/correlation_difference.htm
    http://www.i-juse.co.jp/statistics/xdata/faq-11665.pdf

    相関係数の差ではなく、1つの相関係数の信頼区間を求めたければ、
    差と同様の理論でコレ↓になります。
    http://aoki2.si.gunma-u.ac.jp/lecture/Corr/corr3.html

    【旧ブログから転記】
    ※ このコメントは、旧ブログのコメントを、ブログ筆者が転記したものです。

    返信削除
  4. kartz様

    返信ありがとうございます!

    > R、R^2 の値にはかなりブレがありそうなので、下手すると数字遊びになってしまうかも
    > まあ、既に実験を始めてらっしゃることですし、結果報告をお待ちしています。

    アタリです。。。

    次回ブログのネタばれですが、実際やってみると、符号付R2がゼロ以上であったことを証明できる程度の結果で、とても符号付R2を有意なレベルになる値にすることはできませんでした。
    #期間毎に見ると、マイナス値になるWF期間もでてきます。。

    なので、定期的な再最適化が裏目に出ない(つまり、逆相関にならない)程度にとどめるレベルが精一杯でした。

    なので、そもそも定期的な再最適化自体にエッジがあるのかどうかすらわからない状況です。
    #もしかしたら、期間のスキャンレンジ/ステップとか目的関数に問題がある可能性もありますが。

    ただ定期的な再最適化をする前提だと、前回の選定手順より堅牢性の判断基準としてはまだ「マシ」というレベルとして捉えています。
    #実際、前回よりもパフォーマンスは落ちていたので、前回の手法の方がカーブフィッティングしていた可能性が高いんだと思います。

    > out-of-sample テスト (フォワードテスト) が必要

    確かにそうですね!
    このコメントを頂いて追加でしてみたいと思ったのが、10年分のデータのうち、8年分で今回の手順で最適化目的関数/期間、WF期間を求めて、一旦とりうる符号付R2信頼区間を求めて、残り2年分の符号付R2が、求めた信頼区間内に収まるかどうかを見てみるというのを試して見たいと思います。

    次回ブログ記事では間に合わないので、流れ上別途という事にはなりますが。。。

    「統計的に有意な差」のリンク紹介ありがとうございます!勉強します!

    いつもありがとうございます。。。


    【旧ブログから転記】
    ※ このコメントは、旧ブログのコメントを、ブログ筆者が転記したものです。

    返信削除