バックテストの最適化を段階的に行なう。

懲りずに、3夜目。

lino 2010/05/27 21:10
最適化テストで労力を費やしているので、これは便利そうです。
パラメータが多いので相関性の低いパラメータを分割して最適化を実行しているのですが(Geneticは使いたくないので)、これを自動化できないでしょうか?
パラメータ1〜3を最適化→最もPFが高かった値を使ってパラメータ4〜6を最適化→以下789・・・
tester\cachesを解析する必要がありそうですが、何とか実現できないでしょうか?

EAを作りこんでゆくと、パラメータが増えてゆき、全てのパラメータに対して全数検索しようとするとトンデモナイ時間が掛かることがあります。探索範囲を減らすために、Genetic Algorithm (GA)を使うと、パラメータの持つ意味を無視して、半分ランダムに探索されて、それなりに良さそうな結果に収束したセットを求めてしまうので、ちょっと、いや〜んな感じです。
(とは言うモノの、GA 自体はそれなりに賢く役に立つのですよ..


EAを作る側の立場の人なら、lino さんのように考えるのも理解できると思います。
さて、実際のやり方ですが…


基本方針は、linoさんの考えた通りです。

(1) 最初のパラメータセットで、最適化実行
(2) レポートを解析して、最大PF となる良好パラメータを取得
(3) 良好パラメータを次のパラメータセットに上書きして、最適化実行

HTMLレポート内にパラメータが書かれているので、特にtester\cachesを解析する必要はありません。


以下、私が試した手順です。
(1) 3種類の最適化項目の異なる set ファイルを用意します。
macd_1.set

macd_2.set

macd_3.set

3ファイルを tester 以下に置きます。


(2) batch フォルダに MultiStepOptimizer.pl を置きます。

(3) MultiStepOptimizer.pl を書き換えます。

↑TestExpertParameters の行は、書き換えられるので適当で構いません。


(4) MultiStepOptimizer.pl を実行すると…

1度目の最適化で、PF=1.37 のパラメータが選択され、2度目ではPF=4.48 となり、最後の最適化では、PF=5.08 になりました。素晴らしい。笑。
(勿論、これは、ただのオーバーフィッティングです..orz


一応補足しておくと、全勝してしまった場合、PF=0 なので要注意です。PFが同一の場合は、トレード数の多いほうを採用します。この辺りの処理はPerlを勉強して、適宜修正してください。^^;

















こんな記事の後でアレですが…


実の所、私自身はあまり StrategyTester で最適化をやりません。^^;
バックテストは仮想Tick で、理想的ブローカーだからテスト結果なんて当てにならないよねっ?!という話ではなく、Tester に付属の収益に関わる評価値(利益、勝率、PF、DD..)に対する最適化は非効率だと信じているからです。
こんなことを書いてる相場書籍はほとんど無いですし、相場師が収益の最大化を求めないなんて理解できない..と思われるかもしれません。相場の変動に何かパターンがあって、それに対して売買戦略を立てて、結果、利益が積み上がる..という枠組みで考えると、売買戦略が相場にマッチしていたら、利益が得られるのですから、両者には強い相関関係がありますよね。
だから、「利益が得られる」ならば、「相場にマッチしている」とみなすことができて、収益に関わる評価値で最適化すれば良いのだ..。


…と一般的には考えられていると思いますが、「強い相関関係」は、必ずしも相関係数が1になるほど強くはない点に問題があると私は思っています。つまり、相場にマッチしていなくても勝つときは勝つし、マッチしていても負けるときは負けてしまうというサンプルが若干混ざってるということです。これを聞くと、多くの人は、「そういった偶然性を排除する為に、トレード回数を増やして統計的有意性を持たせるんじゃ!ボケー」と主張するはずです。でも、回数を増やすということは、トレード評価期間も長くなるわけで、そこにはいろんな相場の状態 (レジームと呼んでも良いですが、そこまで大げさなものではないのでプチレジ..かな?^^;)が含まれてきます。いろんな相場に対して、それなりにマッチする戦略って、個々の相場に対しては強固にマッチしそうにないと思いません?


まぁ、思う思わないは人それぞれですが、私の場合は、長期にわたって(パラメータ固定で)機能する戦略を探す方が非効率だと感じたので、如何に短期間だけ機能する戦略を素早く見つけるか?に主眼を置いています。短期間=少ないトレード回数で有意な戦略を立てようとすると、収益に関わる評価値だけではあまりに情報が少なすぎて、勝ち負けの順序や、負けの種類(エントリー後一度もプラスにならずに負けた とか、TPぎりぎりまで行って徐々に下がって負けたとか) のような、諸々の付加情報を含めた独自の評価関数を使って最適化を・・・ちょっ?朝倉さん?どうしてあなたここに・・・・ グサッ・・・ばたっ....