ブログトップ 記事一覧 ログイン 無料ブログ開設

とあるMetaTraderの備忘秘録 このページをアンテナに追加 RSSフィード

チャートは悟りの具にあらず、迷いの具なり。

2010-07-27

勝てるロジックを自動生成する?!

今日は、もしも、悪徳商材会社が私を雇ったらどうなるか?という星新一にありそうな空想話。。

(この記事はフィクションであり実在の人物・団体とは一切関係ありません。内容は鵜呑みにされない方が賢明です。。それが、あなたの為だから。)



その会社のビジネスモデルはこんな感じ。

(1) 毎年、ダミー会社を立上げ

(2) 過去のデータで(だけ)勝てるロジックを考案

(3) EA化して、華麗な資産増加グラフと共に限定販売

(4) 売れなくなったらダミー会社解散

購買層のメインターゲットは、システムトレードを知らない純真無垢な20代かな。毎年、世界で数億人、日本で100万人が成人となり社会に参入してくるので、その中のわずか 0.05% が興味を持ってくれれば、十分な カモ 金の卵になるのです。EA(ExpertAdvisor)として自動売買にしなくても、裁量トレードのロジックとして売り出しても成り立つと思います。


このビジネスの肝は、毎年更新/蓄積されてゆくヒストリカルデータに対して、直近の過去(だけ)に有効なロジックを如何に効率よく見つけ出せるか?に掛かっています。商品のバリエーションを増やす為には、5分足から日足までいろんな時間足用に異なるシステムを作るのが理想です。現実的には1つのロジックのパラメータフィッティングだけで十分に目的は達成できると思うのですが、それをすると、「B社のEAはA社のパクリだっ!」と、某掲示板で騒ぎ立てる人が出てくるので厄介です。

(A社は去年解散させた会社なので、「それ、パクリじゃなくて、背後でロジック作っている人が同じだから..」なんて書き込みは出来ないですし。。笑



そんな会社の、(インチキ)ロジック量産の仕事を請け負った私が何を行うのか?が今日のお題です…。






(スクロールする前に、あなたならどうするか?思考実験すると味わい深いですよん^^)






























解法はいろいろあると思うのですが、私なら手っ取り早いところで、Adaptrade Builderを使います。このソフトは、過去のヒストリカルデータを与えると、その期間に勝てるロジックを自動生成してしまうのです(!)

原理は、遺伝的アルゴリズム(Genetic Algorithm、GA)の一種になります。GA と言えば、MetaTrader の Genetic Optimization をご存知かと思います。売買ロジックに使われる移動平均等の複数のパラメータを効率良く最適化するのに使われています。パラメータ最適化の仕組みを大雑把に説明すると

(1) パラメータをランダムに振ったグループを用意

(2) そのグループの中で、成績の良いパラメータセットを選択。

(3) 選択したパラメータセットを元に (1)〜(2)を繰り返す。

こんな感じです。ランダムに振る際に、大きくランダムに変えるか、少しだけ変えるかという変化をもたせることもできますし、成績の良いパラメータセットを複数選んで、パラメータの組合せを入替えてみることもできます。(突然変異と、交叉に相当します。)


この GA を、パラメータの枠を超えて ロジックレベルで適用したのが Adaptrade Builder で、この手法を一般に 遺伝的プログラミング(Genetic Programing , GP) と呼びます。

ランダムにインジケータを組み合わせてトレードシステムを生成し、良さそうなシステムが 例えば 移動平均4本を使うシステム であれば、移動平均を1本減らして、RSI に置き換えるとか、さらに移動平均を追加する...といったソースコードの書き換えを延々と繰り返して、優秀なシステムへ進化させてしまうと言えばイメージが掴めるでしょうか。。

(本当はもっと複雑な仕組みで探索をしているはずですが、ここは概念を理解してもらうために簡便に書いてます。



実際に動かしてみたのが下図です。(14日間のデモ版が無償で試せます)

f:id:fai_fx:20100726163753p:image

実行前に設定するのは、右側の Settings欄のみで、MT4からExportしたCSVデータを取り込み、優秀なトレードシステムの評価の為のウェイト値を入力します。"優秀なシステム" の定義は人それぞれなので、何を重視するかお好みに指定できるのです。図では、利益と回数を最重要視して、次にPFを重視しています。


ビルドを開始すると、設定条件下でロジックの生成と評価が繰り返されて、そのうちのベスト20システムをリアルタイムに画面で確認できます。左上に、個体番号34のシステムの成績グラフと、自動生成されたTradeStation用ソースコードを表示しています。

トレード回数 570 回で、PF 1.3 ですが、まずまずの右肩上がりなので良い感じです。

(...嘘です。いろんな意味でまだ嘘なんだけど....このソフトは本当に凄い。^^;;;



「海外では、こんな風にプログラミングを知らない人でも、簡単な設定だけで過去に勝てたシステムが量産できるんですよ〜」

...と、その会社の社長に力説したら、翌日、クビになりました。

だって、本当にプログラマを雇っておく必要性が無くなったのですから。笑。 (おわり

ふみふみ 2010/07/27 00:58 こわいよ。Adaptrade Builder こわいよ。

FFFOOOFFFOOO 2010/07/27 03:58 Faiさん こんばんは。

いったいどこからこんなものを見つけてくるんですか?(笑)
しかし需要があるから開発して売っているんですよねー。
これもバーチャルディーラーのようにMQ社が関与していなければ
いいんですがー。(^_^;)

Mark68000Mark68000 2010/07/27 05:27 以前自前で作った多変量解析を使うGPで日経225を解析して
みたのですが、ヒストリカルデータはうまく説明する(利益がでる)
けどバージンデータでは、だめでした。テストデータの抽出のやり
かたとかいろいろ工夫すれば、使えるものになると考えてもみたけど
所詮カーブフィッティングなんですね。

桂茶桂茶 2010/07/27 06:50 落ちが最高!

takechantakechan 2010/07/27 11:15 テクニカル指標を使用したシステムの場合、カーブフィッティングに陥っているかどうかは、自分自身でもわからないことが多いのでやっかいですね。

ただ、カーブフィッティングに陥っている場合は、たいていはフォワードテスト直後から損益曲線が乱れる傾向があるみたいで、そういう意味では、フォワードテストは大事なような気がします。

でも、あくまでも「ような気がします」です。

kartzkartz 2010/07/27 12:11 > Mark68000さん
単に GPを適用するだけだと過剰に最適化されるのがオチです (私も経験済みw)。ですが、ウォークフォワードテストや、統計分析 (信頼区間や検定など)、変数削減、偶然性測定、価格ゆらぎ等に対する弾力性測定、その他秘密事項wなどを組み込んだ開発ワークベンチにまで持って行くとだいぶ使えるようになります (なりました)。GA/GP の探索能力自体はあまり問題ではありません。GA/GP は EA開発時の定型作業を自動化する技術のひとつに過ぎませんから。

Adaptrade Builder には一部の統計分析と変数削減機能があるようですが、WFTできない・評価関数がユーザー定義できない等の欠点があるので、個人的には、2500ドルの価値があるとは思えませんね。

takechantakechan 2010/07/27 14:53 kartzさんの言われる内容と少しズレるかも知れませんが。

VLRSIというテクニカル指標があります。頭のVLというのは、variable length の略で、「期間可変式」くらいの意味です。
通常のRSIは、計算期間が、12とか14とか固定されていますが、VLRSIは、標準偏差を利用して計算期間を可変式にしたもので、カーブフィッティングを少しでも回避しようという工夫なわけです。

同じような工夫は、移動平均線やブレイクアウト等にも応用できるわけで、私も実際EAを使って実験していますが、比較的うまくいくこともあるみたいです。

テクニカル分析やシストレに対するkartzさんの前向きな姿勢は、読んでいて勇気をもらいます。

saru999saru999 2010/07/27 20:12 毎日、私の予想もしない記事があって楽しみに拝読しています。
しかし、今日のは寒気がしました。おそろしやAdaptrade Builder!
猛暑の夏にはぴったりの記事かも(笑

BEGINBEGIN 2010/07/27 21:21 面白かった!
faiさんは、年俸いくらくらいなら雇えるんでしょうね・・・??

kocakoca 2010/07/27 23:04 こんなソフトがあるとは・・・すごいですね。

この悪徳商材会社、実在しても意外にうまくいっちゃいそうですよね。
セールスがうまければ、入門者以外もターゲットになりえますし。
EA収集癖のある私とか。

あぁ怖い。

takutaku 2010/07/28 00:09 faiさん、こんばんは。
すみませんちょっと前の記事の「時刻別平均変動幅グラフ」の時にアップしてくださった「ARHourLevel」の事で教えて頂きたいのですが、トレンドかレンジかの判断に大変参考にさせて頂いているのですが、iCustomで呼び出してEAのフィルタとして使いたいのですが、「TodayBuffer」の最新値部分に表示されている「ARBuffer」はいくつ前の値と言うことになるのでしょうか?表示させる時間足によりシフトされている部分が長くなったり短くなったりするので時間足よって違うと思うのですが。。。せっかく中身を公開してくださっているのに申し訳ありませんが教えて頂けますか、よろしくお願いします。

MINMINMINMIN 2010/07/28 01:09 面白いんだけど、こんな記事書いたら「その会社のビジネスモデル」をやっちゃう人が出て来るでしょうが〜〜〜!

でも、逆にだまされる人も減りそうですがね。
でもやっぱりコレクターは買っちゃうんですかね。

自作EAのパラメータ最適化にも使えるんですかね〜。
MT4の最適化はちょっと遅くてまいっちんぐ。

かくさんかくさん 2010/07/29 11:47 相変わらず面白い記事の連発ですね、毎日更新が楽しみです
一つ質問なのですが前回ブログにあった。
TIIとKUMOのインジゲーターを合体させて
作成していたのですが
知識足らずで表示すると黒い線が残ってしまいます
//+------------------------------------------------------------------+
//| !KUMO-test.mq4 |
//| Copyright (c) 2009, Fai Software Corp. |
//| http://d.hatena.ne.jp/fai_fx/ |
//+------------------------------------------------------------------+
#property copyright "Copyright (c) 2009, Fai Software Corp."
#property link "http://d.hatena.ne.jp/fai_fx/"

#property indicator_chart_window
#property indicator_buffers 6

//---- input parameters

extern int ShortShift = 0;
extern int LongShift =1;
extern int Major_Period = 10;
extern int Major_MaMode = 1;
extern int Major_PriceMode = 0;
extern int Minor_Period = 5;

extern int MAMethod=MODE_EMA;
extern int MAPrice =PRICE_TYPICAL;
//---- buffers
double ExtMapBuffer1[],ExtMapBuffer2[],ExtMapBuffer3[],ExtMapBuffer4[];
double BufBuy[];
double BufSell[];

int KumoShift=0,KumoRef3=0,KumoRef4=0;
//+------------------------------------------------------------------+
int init()
{
SetIndexStyle(0,DRAW_LINE);
SetIndexBuffer(0,ExtMapBuffer1);
SetIndexShift(0,ShortShift);

SetIndexStyle(1,DRAW_LINE);
SetIndexBuffer(1,ExtMapBuffer2);
SetIndexShift(1,LongShift);

KumoShift = MathMin(ShortShift,LongShift);

SetIndexStyle(2,DRAW_HISTOGRAM);
SetIndexBuffer(2,ExtMapBuffer3);
SetIndexShift(2,KumoShift);


SetIndexStyle(3,DRAW_HISTOGRAM);
SetIndexBuffer(3,ExtMapBuffer4);
SetIndexShift(3,KumoShift);

if(ShortShift > LongShift) KumoRef3 = ShortShift-LongShift;
if(ShortShift < LongShift) KumoRef4 = LongShift-ShortShift;

SetIndexBuffer(4, BufBuy);
SetIndexBuffer(5, BufSell);

SetIndexStyle(4, DRAW_ARROW, STYLE_SOLID, 1, Blue);
SetIndexArrow(4,233);

//指標スタイルの設定(Sellシグナル)
SetIndexStyle(5, DRAW_ARROW, STYLE_SOLID, 1, Red);
SetIndexArrow(5,234);
return(0);
}
//+------------------------------------------------------------------+
int start()
{
int counted_bars=IndicatorCounted();
if (counted_bars<0) return(-1);
int limit=Bars-counted_bars-1;
if(limit > Bars - MathMax(KumoRef3,KumoRef4)) limit = Bars -MathMax(KumoRef3,KumoRef4);
for(int i=limit;i>=0;i--){
ExtMapBuffer1[i] = iCustom(NULL, 0, "TII_RLH",Major_Period,Major_MaMode,Major_PriceMode,Minor_Period,0,i);
ExtMapBuffer2[i] = iCustom(NULL, 0, "TII_RLH",Major_Period,Major_MaMode,Major_PriceMode,Minor_Period,0,i);
ExtMapBuffer3[i] = ExtMapBuffer1[i+KumoRef3];
ExtMapBuffer4[i] = ExtMapBuffer2[i+KumoRef4];
}
for(i=limit-1; i>=0; i--)
{
//Buyシグナル
BufBuy[i] = EMPTY_VALUE;
if(ExtMapBuffer3[i+2] <= ExtMapBuffer4[i+2] && ExtMapBuffer3[i+1] > ExtMapBuffer4[i+1]) BufBuy[i] = Open[i];

//Sellシグナル
BufSell[i] = EMPTY_VALUE;
if(ExtMapBuffer3[i+2] >= ExtMapBuffer4[i+2] && ExtMapBuffer3[i+1] < ExtMapBuffer4[i+1]) BufSell[i] = Open[i];
}
return(0);
}
//+------------------------------------------------------------------+


上記がソースなのですがどのようにしたら黒い線消せるのでしょうか?
何か良いアドバイスいただけませんでしょうか
何卒よろしくお願いいたします。
ついでにメールとアラートもおねがいできませんでしょうか?
知識不足ですみません。

かくさんかくさん 2010/07/29 18:59 すみません自力で解決できました
ありがとうございます
過去のブログに全部載ってましたありがとうございます

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/fai_fx/20100727/1280156638