はい、MSSシリーズもついにGAということです。
MSST2はどうなったんだって話ですが、コードの改良などを経て現在
アメリカの
サーバー上でバックテスト中です。
さほど大きなドローダウンもなく、2006年2月から2007年4月のおよそ1年2ヶ月で300%の
利回りを達成しています。
レバは10倍で運用しています。
もうちょっとテストが進んだらまたご報告いたします。
さて。
GA(genetic algorithm)遺伝的
アルゴリズムですね。
複数の売買ルールを同時に走らせて、成績上位の
シグナルに従うMSSシリーズはコードの共通性からGAに改造できそうだな、というのはしばらく前から考えていたことなのですが、実業に手を出して赤字にあえいだり・・・ごにょごにょな間
コーディングできていなかったのです。で、
お正月の休みを利用して一気にやってしまおう・・・・と考えていながらただダラダラと正月を過ごしてしまいまして、ぐああああああああっと自己嫌悪に陥った勢いで1日でコードを書いてしまいました。
それから二日ほど
デバッグ作業についやしまして、さらに一週間ほどロジックの追加などを経て現在に至ります。
簡単に仕組みを解説しますと、今回は約100の売買ルールを設定しました。レンジブレイク・MA・RSI・ADX・ボリバン・タイムゲートなどをパラメータを変えて合計で100ほどですね。
ただし、そのすべてのシグナルの組み合わせをMSSで走らせることは到底できません。
そこでGAというわけです。
100の売買ルールはすべて買いノーポジ売りの3つのサインを出します。プログラム的には1、0、−1の数字のどれかということです。
1M12MAより上なら1、同じなら0、下なら−1とか、テクニカル指標ごとにシグナルを出します。
メモリ上には0000100−1−1−10000のように配列で表現されます。
これに対して4000のライフ(生命)を用意して、1つのライフは100のゲノム(遺伝子)を持っていて、そのひとつひとつは100のシグナルに対応しています。
ライフのゲノムは、最初1,0,−1の乱数で初期化します。
1M12MAに対応したゲノムが1の場合、1M12MAのシグナルが1であれば1×1=1となり、ゲノムが−1の場合シグナル1に対して−1を出力します。シグナルが1でもゲノムが0だと0です。
シグナル
0000100−1−1−10000
ライフ1ゲノム
0100000−11−10000
の場合、結果は
00000001−110000
となり、ますね。上下を掛けるだけです。
このようにして、すべてのシグナルとゲノムをかけ算して、さらにそれを合計します。上の例では合計は1です。
100ものシグナルに対応して、組み合わせを無視してシグナルの合計だけで売買判断をするわけですが、シグナルの組み合わせごとにさらにANDやORで評価を繰り返すこともできます。が、こうなるとかなり複雑になって、短期間では一回もシグナルがでなくなる恐れがありますので、とりあえずシンプルに合計してみました。
したがって、必ずしもすべての条件が満たされた時だけシグナルが出るわけではなく、ある場合とある場合とある場合に、整合性もなく売り買いのシグナルが出ます。一つのライフの中に複数の応答系を持つことになります。
ただし、単純にゲノムの演算結果が0より大きければ買い、小さければ売りだけですと、売買回数も増えすぎますし、組み合わせの妙というのもまったく無視されてはもったいないです。
そこで、さらにゲノムの最初の領域はシグナルに対応してない部分があり、別の演算に使われます。
ゲノム1列目から5列目はやはり1か0か−1で初期化されていますが、シグナルを掛けずに単純にゲノムの値同士足されて、それが演算結果の閾値に利用されます。
例えば、シグナルに対応したゲノムの演算値の合計が1の場合、もしも閾値が5だと、売買判断はKeepBuyを出力します。買いポジはホールドし、売りポジの場合手じまいされ、ノーポジの場合ノーポジのままです。
シグナルが閾値を超えるとBuyNowを出力するわけです。
売りポジは直ちに決済され、ノーポジの場合買いポジを取り、すでに買いポジの場合はホールドします。
また、一部のゲノムは決済指値、ロスカットなどを決定する因子になります。
100の売買ルールすべての組み合わせを検証することは無理なので、
ランダムな売買ルールの組み合わせと閾値で売買判断を行い、調子のいい組み合わせを捜すと。
そして、ここからがおもしろいのですが、一定のライフ
ポイントを持って生まれたライフは1秒ごとにライフポイントを0.03くらい失っていきます。これは初期値で設定できるのですが、現在は30日間で150Pips消費するようになっていて、すべてのライフは最初に150ライフポイントを持って生まれます。
ライフの売買判断がうまく利益を出すとそのPipsがそのままライフポイントに加算されます。損を出すとその分ライフポイントは減ります。
30日間まったく売買を行わなかったり、30日に満たず150Pipsを消費したライフは死亡して、新しいライフに生まれ変わります。
この時、新しいライフはトップのライフと2位のライフから半分づつゲノムを交換したり、たまにノイズが入ったりして、新しいゲノムセットができてくるわけです。
このようにして、100の売買ルールのすべての組み合わせをバックテストで検証することなく、ライフが死んで生まれるたびに、正しいシグナルの処理をする組み合わせが残り、やがて最適ではないかも知れないがそこそこの解が得られるようになります。
その上、その解が通用しなくなったとしても即座に別の解が用意される・・・という仕組みになるのです。
実際、コーディング中何度も短期のバックテストを行いましたが、負けが込んで破産することは一度もありません。
長くなったのでいったん止めて、次回は画像付きで解説しますね。
それでは。