2010/11/29

まねぶ

まねぶとは、【まなぶ(学ぶ)】と同源で、【まねる(真似る)】とも同じ語源である。
そのため、学ぶの語源は【真似ぶ(まねぶ)】とされることも多い。語源由来辞典より
今回は、ATC2010で1位を独走中のbobsley氏のMover3MkIIを真似てみました。
【Mover3MkIIの基本情報】
【Mover3MkIIの予測フローチャート】
【模索結果】 作成したEAのテスト結果にATCTradeを使用して実際の履歴を添付してみました。
※結論から言ってしまえば、完全に一致するEAではありません。 ※ATCTradeは、設定をいじらずに使用しています。
【模索したEAの設定】 ロット調整を行わず、固定0.1Lotとしました。また、注文の中止は無視しています。 その他は、Mover3MkIIの設定を使用しました。
【模索したEAのテスト結果】 期間:2007/01/01~2010/10/31
【模索したEAで別条件を試してみた①】 一度ポジションを持つと逆シグナルが発生しても無視し、現在のポジションを維持していたので、ドテンさせたらどのような結果になるか試してみました。
【模索したEAで別条件を試してみた②】 TP/SLの割合はそのままにし、値幅に応じたTPを設定してみました。 今回は、2日足の値幅(高値-底値)のEMAを基準に使用しました。
【まとめ】 今回は、Mover3MkIIを真似ることでいろいろと勉強させて頂きましが、2008/09月~2009/11月の期間の結果に違和感を感じています。(ちなみにその期間の期待値は、-3.8でした。)データの異常があるのでしょうか?どちらにしてもMover3MkIIの結果ではありません

2010/11/18

自動売買への学術的なプロセス

自動売買への学術的なプロセスをまとめた俯瞰図(見渡すチャート)が『ファイナンスにおける人工知能応用研究会(SIG-FIN)』のサイトにありましたので紹介します。
出典: 鳥海不二夫, 特集「研究会総覧」ファイナンスにおける人工知能応用研究会 (SIG-FIN), 人工知能学会誌, Vol. 25, No. 4 (2010年7月), pp. 557-558 作成: 松井藤五郎

研究対象の中に自動売買があり、それを取り囲むように並んでいます。とりわけ、自動売買に一番近いのは『ファイナンス』ということでしょうか?
また、このサイトには、論文もいくつか掲載されています。 例えば、以下のような気になる論文も・・・ 【取引所の高速化について】から抜き取り 著者:水田 孝信(スパークス・アセット・マネジメント株式会社) ////////////////////////////////////////////////////////////////// 4 高頻度取引戦略 一般にアルゴリズムトレードという言葉は、機械 で執行戦略を行うことを指す。執行戦略とは、ある 銘柄を買うこと(売ること)は外部から与えられて おり、それをなるべく有利な価格で執行する注文を 行うことである。アルゴリズムトレードはVWAP(出 来高加重平均価格)どおりに売買するなどパッシブ な戦略も多い。一方、フラッシュトレードと呼ばれ る数ms~数s の売買間隔でリターンを稼ぐ戦略は、 まさに高頻度トレードだけでリターンを稼ごうとい うものである。フラッシュトレードは取引所が高速 化していないと実現しないものが多く、日本ではま さにこれからスタートしようとしている戦略であり、 人工知能の技術に期待される分野である。もちろん、 アルゴリズムトレードも取引所の高速化により高度 化し、それが必要になってきていることも間違いな い。リターンを取りにいく高頻度取引のうち、学術 界でも公表された手法として、Stat. Arb.(Statistical Arbitrage)というものがある。(Fernholz, 2007)これ は、時間の規格化を行うと、短い期間で測定したボ ラティリティの方が長い期間で測定したそれよりも 大きいことを利用したもので、この差をリターンと して抽出するものである。具体的にはロング側は1.5 分という短期間でウエイトを元に戻し、ショート側 は一日と長い期間でウエイトを元に戻す。ウエイト を元に戻すというのは株価が上がってウエイトが上 昇した銘柄を売り、株価が下がってウエイトが少な くなったものを買うという逆張り戦略の一種である。 つまり、短い期間であるほど逆張りが有効であると いうことを使った戦略であり、リターンの見積もり をする方法も開発されている。ウエイト調整の間隔 を短くすればするほど高い効果が期待されている。 この効果は日本の株式市場でも確認されており、米 国よりも高いリターンが得られることが知られてい る。(野村證券, 2008) /////////////////////////////////////////////////// ※上記内容は株式市場をとらえた内容だが、為替の世界でも有効な話なのでしょうか?EAの作成のヒントが隠されているかもしれませんね。
『ファイナンスにおける人工知能応用研究会(SIG-FIN)』のサイトを紹介しましたが、実は、KIKKAWAさんに教えて頂いたものです。心から感謝いたします。
【私見】 素人ながら、私も以前ニューラルネットワーク(以下NN法)もどきでEAを組んだことがありましたが、過去の市場にはフィットできてもフォワードテストで散々な結果になりました。私の私見として、『もし、教師信号が間違っていたら、間違った方向にEAを作り上げてしまう。』というものでした。例えば、この前あったような事(誤発注による暴落)をそのまま、教師信号として使用してしまったら?間違った学習をさせることにならないでしょうか?教師信号なしNN法やその他の人工知能を作成する技術があると思いますが、素人が、扱える手法ではないと感じました。

2010/11/15

やっぱり存在するんですね!

  MT4に標準で格納されているMetaquotesのヒストリカルデータには、2006年9月頃より過去のデータに異常な上髭と下髭が存在することが知られています。参考
そのため、Metaquotesのヒストリカルデータを使用する場合は、2006年以前のヒストリカルデータでのテストは、避けてきました。
今回は、その問題が解決されているか?
MT5に格納されているMetaquotesのヒストリカルデータを確認してみました。
結果は、以下を確認ください。

↑EURUSD 5分足 2006年5月

↑USDJPY 5分足 2006年9月
同じデータを使用しているのでしょうか?やはり異常な髭が存在します。
スキャル系のEAのテストには使用できないようです。

2010/11/12

ATCTradeを修正しました。

ATCTradeを修正しましたので、ご使用されている方はどうぞ!
また、DWTHarrのMQL5仕様の作成を依頼されましたが、途中で心が折れてしまったのでインジケーター指標として表示することができませんでした。サンプルとしてコメント表示のコードを掲示しておきますので試してみてください。(オブジェクト表示なら可能だと思います。)
  1. //+------------------------------------------------------------------+  
  2. //|                                                      DWTHarr.mq5 |  
  3. //|                                          Copyright 2010, bighope |  
  4. //|                       http://expertadviser-bighope.blogspot.com/ |  
  5. //+------------------------------------------------------------------+  
  6. #property copyright "Copyright 2010, bighope"  
  7. #property link      "http://expertadviser-bighope.blogspot.com/"  
  8. #property version   "1.00"  
  9. #property indicator_separate_window  
  10. #property indicator_buffers    1  
  11. #property indicator_plots      1  
  12. #property indicator_color1    Red  
  13. input int N     =  7;//対象データ数(2のN乗)  
  14. input int HBs   =  3;//高周波カット位置  
  15. input int LBs   =  4;//低周波カット位置  
  16. input int Shift =  0;//データのシフト数  
  17. int DWTPeriod;  
  18. //---------buffers  
  19. double IDWT[];  
  20. double g[];  
  21. double gs[];  
  22.   
  23. //+------------------------------------------------------------------+  
  24. //| Custom indicator initialization function                         |  
  25. //+------------------------------------------------------------------+  
  26. int OnInit()  
  27.   {  
  28. //--- indicator buffers mapping  
  29.    SetIndexBuffer(0,IDWT,INDICATOR_DATA);  
  30.    //ArraySetAsSeries(IDWT,false);  
  31.    PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0);  
  32.    DWTPeriod = MathPow(2,N);  
  33.    ArrayResize(g,DWTPeriod);  
  34.    ArrayResize(gs,DWTPeriod);  
  35.    ZeroMemory(g);  
  36.    ZeroMemory(gs);  
  37. //---  
  38.    return(0);  
  39.   }  
  40. //+------------------------------------------------------------------+  
  41. //| Custom indicator iteration function                              |  
  42. //+------------------------------------------------------------------+  
  43. int OnCalculate(const int rates_total,//Priceバッファ数  
  44.                 const int prev_calculated,//処理バー数  
  45.                 const int begin,//重要なデータが始まる所  
  46.                 const double &price[])  
  47.   {  
  48. //---  
  49. //PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,rates_total-DWTPeriod-1);  
  50.    string text;  
  51.    int     k;  
  52.    int     DWTf,z;  
  53.    double  sum,difference;  
  54.    for(k=0;k<DWTPeriod;k++)g[k] = price[rates_total-k-Shift-1];  
  55.    DWTf = DWTPeriod/2;  
  56.    //変換  
  57.    for(z=1;z<=N;z++)  
  58.    {  
  59.       for(k=0;k<DWTf;k++)  
  60.       {  
  61.          sum        =(g[k*2]+g[k*2+1])/2;  
  62.          difference =(g[k*2]-g[k*2+1])/2;  
  63.          gs[k]      =sum;  
  64.           if((LBs>=z)&&(z>=HBs)){gs[DWTf+k] = difference;}else{gs[DWTf+k] = 0;}//フィルタリング作業  
  65.        }  
  66.       ArrayCopy(g,gs);  
  67.       if(N>z) DWTf =DWTf/2;   
  68.     }  
  69.         
  70.     //逆変換  
  71.     for(z=1; z<=N ;z++)  
  72.     {  
  73.        
  74.       for(k = 0; k < DWTf; k++)   
  75.       {  
  76.          sum         =  g[k]+g[k+DWTf];  
  77.          difference  =  g[k]-g[k+DWTf];  
  78.          gs[2*k]       = sum;  
  79.          gs[2*k+1]     = difference;  
  80.       }  
  81.       ArrayCopy(g,gs);  
  82.       if(N>z)DWTf =2*DWTf;  
  83.      }  
  84.       for(k=0;k<DWTPeriod;k++){ IDWT[rates_total- Shift-k-1] = g[k];text += DoubleToString(g[k])+"\n";}   
  85.      //  for(k=DWTPeriod;k>0;k--){ IDWT[rates_total- Shift-k] = g[k-1]; }  
  86. //--- return value of prev_calculated for next call  
  87. Comment(text);  
  88.    return(rates_total);  
  89.   }  
  90. //+------------------------------------------------------------------+  

2010/11/10

EAの評価基準がほしい!

昨日、ATC2010に提出したEAが、全ポジションを決済しました。
初期のトラブルと『リカバリーコードの未記入』がここまで影響するとは・・・
順位は別として、作成したEAが本来の動きを見せるか?監視していきたいと思います。

さて、話は変わりますが、『やりたい事・やってみたい事』がいくつかあるのですが、その中の一つに、『EAの評価基準作成』があります。誰が見てもわかりやすEAの評価基準ができれば、EAの評価自体が上がるのではないか?と考えたからです。
例えば、バックテストのグラフできれいな右肩上がりを見せるEAが有能なEAなのか?とか、PFが高いEAが有能なEAなのか?など、一律に評価できる評価基準を作成しようと試みました。
と!いいますか、私にはそれだけの力量がなく、ある方に『EAを一律に評価する基準を作成できませんか?』とお伺いしてみました。ある方とは、『 Meta Trader (メタトレーダー)』サイトオーナーのKIKKAWAさんです。KIKKAWAさんは、『進化ゲーム理論の数理とその応用』などを研究されている研究員の方で、研究の検証用にMeta Traderを活用されています。
私は、当初、『このEAは、◎〇点です!』のような、絶対評価が良い評価(誰もがわかりやすい評価)であると考えていました。しかし、KIKKAWAさんとメールのやりとをするうちに、以下に示すような多角形グラフのほうが、わかりやすい評価ができると教えて頂きました。
image
2週間にわたり、19回のメールのやり取りと、作成して頂いたレポートが、19ページにもなりました。パラメーターをどうすか?という課題はありますが評価基準を示す方法としてはベストな方法であるという結論になりました。
【謝辞】
課題の定義もできない私の話を親身になって検討して頂いたKIKKAWAさんに感謝します。