2009年01月31日

ライフ69いくらなんでも・・・・

これはないでしょう・・・・・

狙ってプログラムしてもこんなカーブフィッティングはそうそうできるもんじゃありません・・・

ライフ69おまえはいったい・・・

chart080326-4.gif

ちなみに黒が売り、赤が買いです。
偶然ってすごいですねぇとしか言いようがありません。
たぶんデータも壊れてて上下に長すぎ、価格が変動しないのでうまいぐあいに移動平均がど真ん中を突き刺していて、ライフ69はそれをシグナルに売り買いを繰り返しているようです。

ちなみに、資金は5日で1.8倍に増えました。

TesterGraph2.gif

いままでで、最高のパフォーマンスですが、前回よりいじったのは子孫の遺伝子のコピーのされ具合に若干の修正を入れたくらい・・・・

と思って注文をよく見たら発注しているのは売りがライフ325買いがライフ69でした。


恐ろしい子!


あ・・・思い出した。上位のライフがポジッてるとき含み損を抱えて長期居座って売買のチャンスを潰さないように、含み損をライフポイントに反映するようにしたので、下位のライフがポジるチャンスがわすかに上がったのがパフォーマンス改善の効果につながったようです。

ちなみに、前回書いた通り、この先、正確には2006年10月5日14時8分あたりからライフ69とその子孫が対応できない値動きに変化するので、彼らはこの後死滅する予定です。

ただ、現在のライフの数値と遺伝情報はそのままファイルに保存して、アメリカで動いてるリアルタイムのフォワードテストにいきなり投入することもできます。
そうですね、一定時間ごとにライフとゲノムをファイルに書き出すようにすればいちいちテストを止めなくてもそれができますね。
posted by (;D)笑男 ◆LeBIz0ZWfs at 01:15| Comment(0) | TrackBack(0) | 日記 | このブログの読者になる | 更新情報をチェックする

2009年01月30日

更にMSSGA

MSST2のその後ですが、バックテストの結果2年ほどは調子がいいのですが、調子が悪くなると大きくドローダウンしてしまいました。
タネを明かせば、仕掛けは完全に時間制御にのみ頼っていて、INの時間を15分おきに24時間分、OUTの時間を15分おきに24時間分それぞれ売りと買いですべての組み合わせで売買を行い、成績のよいINOUT時間と売り買いの別をランキングしてデモトレードしていたのでした。これはある自動売買プログラム選手権の2位か、3位にランキングしていたシステムが履歴からその手法がバレてしまい、多くの人々に利益をもたらした件を再現するプログラムだったのです。
たぶん、筋の介入タイミングなんかがキャッチされると効果があるのだろうと想像つきますので、価格帯と時間帯で詳しく調べていけば今後も有効かもしれませんね。

さて、MSSGAの続報です。
まず、収益グラフから見て頂きましょうか。これです。

graf.jpg

はい、すごいですね。
もちろん、一番いいところを切り取ってますから過剰に期待してはいけませんが、一番瞞されたのはわたしです。
なにしろ、2006年のユーロドル10月1日からのバックテストで最初の5日間こういうことになってしまったからです。何のチューニングもしていない初っぱなで、いきなりです。

そりゃ、びっくりしますわ。

最初のころはこんな売買をしています。

c1.jpg

まぁ、ヘタというか、同値撤退が多いですね。
これはわたしが作ったシステムの特性ですが、最初にランダムに生成されたライフもある程度のライフポイントを持っていて、最初のうちは損失が少ないライフが上位にランキングされてしまうからです。同値撤退繰り返していれば確かに損失は少ないです。
やがて、必ず大なり小なりのドローダウンに見舞われ意味不明の売買を繰り返すライフが大量に死亡します。わたしはこの時期を大絶滅と呼んでいます。
そして、カンブリア期のように多彩なライフが現れては消え、徐々に収益曲線は上昇しはじめます。わたしはこの時期を生命爆発と呼んでいます。
これはユーロドルのいろんな時期で動かしてみてもいい生命が生まれる全長としてよく見られる現象なんです。

やがて、継続して利益を出すライフが順次台頭してきて、そして伝説のライフ69が誕生します。

69.jpg

チャートの上段に表示される文字表示はライフのライフポイントランキングです。一番左に69というライフが1455というライフポイントを稼いで一位に来ていますね。最初に与えられるライフポイントが500なのを差し引いても実に1000Pipsを稼いでいることになります。PFは2前後です。すごいですね。こんなのが偶然出てくるんですから。

2行目から3行目は、この時点で上位2つのライフの売買シグナルにしたがって実際の売買を行っているので、その2つのライフのゲノム(遺伝子)が表示されています。最初の数文字が決済指し値(テイクプロフィット)と損切り指し値(ロスカット)を決定する遺伝子で途中に−1がありますので、8Pipsくらいのプロフィットを取るようになってます。
次のGTが閾値で5つ目までの数値の合計がシグナルの閾値になります。5つ目までで2つ1があるので、ライフ69はシグナルの合計が3にならないと売りも買いもしません。次がレンジブレイクで1分足12本の高値安値をブレイクしたら−1なので逆張りです。
MAは移動平均で、やはり1分足12本の移動平均を超えたら買い、くぐったら売りのサインを出します。RSIは5分足24本のRSI値70と30に対して順張り、ADXでは1時間足に対して逆張り、そしてボリンジャーの1分足24本のDIに対して逆張り、同じく30分足に対して順張り・・・・

こんな組み合わせです。はっきり言って、なにがしたいんだかわかりませんが、そんな69の売買はこうなります。

c2.jpg

移動平均とレンジブレイクの逆張りでポジションを取り、決済指し値の6Pipsで決済しているようですね。そして、シグナルが消えるまでそれを繰り返すのでツボにはまるとこんなに見事な結果になるのです。

また、3列目のライフ325を見てみるとライフ69にそっくりなのがわかります。ライフ325はライフ69の子孫なんですね。
このように、優秀な売買手法を獲得した遺伝子は保存され、バリエーションを増やしていくわけです。

ユーロドルに限れば、長寿命となるライフのほとんどはスキャルピングで、しかも、トレンドに逆向きのリバ取り手法が多く見られます。

このライフ69もおよそ10日でその寿命を終え、やがてながく混迷の時代がやってきます。この時期の画像は退屈なのでのせませんが、収益曲線は緩やかに下る感じですが、ドローダウンはそれほど大きくありません。

だいたい、毎日このあたりに来るとテストも1日以上経過して、テスト中に書き直したコードの結果を見るためにあえて同じ条件で再びテストを繰り返しています。

とは言っても、例えばランキング上位に居たライフが売り買いを実際に指示するフラグを立てたままランキングが下がった場合にそれでも売買をシグナルするのかどうか、とか、一度死んだライフを生成するために何割をmama(上位)の遺伝子のコピーにするか、どの程度ランダムなノイズを入れるか、といったチューニングであって、売買結果を意図したチューニングは一切していません。

同時にアメリカサーバーはMSST2の残念な結果を受けて、今はMSSGAのフォワードテストに入っていますが、テスト3日目で現在は若干のドローダウン、ちょうどタンパク質のスープの中でランダムな触媒反応が起こっているような時期です。

MSSGAは決して安定した収益曲線を継続させるものではないかも知れませんが、その都度つどでおもしろい手法のパターンを見せてくれるのが見ていて飽きません。

100のシグナルの部分は誰でもチューニングできるようにカスタムインジケータの配列を使ったソースコードを公開して、ベースプログラムの遺伝的アルゴリズムのみをEAとして配布してみんなで結果を共有してみたらおもしろいかも知れません。

また、ブログネタとしてもリアルタイムのフォワードテストで生まれるライフの売買手法はその都度で発表していきたいと思います。

そろそろブログ村に登録すべきかも知れませんねー。

それでは。
posted by (;D)笑男 ◆LeBIz0ZWfs at 22:19| Comment(0) | TrackBack(0) | 日記 | このブログの読者になる | 更新情報をチェックする

2009年01月24日

その名もMSSGA

はい、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の売買ルールのすべての組み合わせをバックテストで検証することなく、ライフが死んで生まれるたびに、正しいシグナルの処理をする組み合わせが残り、やがて最適ではないかも知れないがそこそこの解が得られるようになります。
その上、その解が通用しなくなったとしても即座に別の解が用意される・・・という仕組みになるのです。
実際、コーディング中何度も短期のバックテストを行いましたが、負けが込んで破産することは一度もありません。

長くなったのでいったん止めて、次回は画像付きで解説しますね。

それでは。
posted by (;D)笑男 ◆LeBIz0ZWfs at 00:19| Comment(2) | TrackBack(0) | 日記 | このブログの読者になる | 更新情報をチェックする

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。


×

この広告は1年以上新しい記事の投稿がないブログに表示されております。