FXボーグ | テクニカル実験室

テクニカル分析を使った自動売買プログラムの開発に挑戦!

スポンサーリンク

回帰チャネルの期間最適化。

ひとまずサポート・レジスタンスが表示できたので、今度はトレンドラインに取り掛かっています。まずは回帰チャネルの期間最適化を行なってみました。

f:id:fxborg:20161206081623p:plain

  1. ・青チャネル・・・30ー120期間を5バー間隔で回帰チャネルを表示
  2. ・黄チャネル・・・平均絶対誤差が最小の回帰チャネルを表示

H&Sのショルダー(右肩)

H&Sの右肩はトレンドラインを割ったかどうかで判定しようと考えています。そのために最新のトレンドではなく最高値をつけたときのトレンドラインを表示します。

具体的にはSnRインジケータのトップとボトムが現れたら、その時点の最適な回帰チャネルを表示します。最適化には平均絶対誤差を使用しています。

f:id:fxborg:20161206110551p:plain

こんな感じです。

f:id:fxborg:20161206081623p:plainトップが現れたときに最適な回帰チャネルを表示しています。

最小二乗法の計算

回帰チャネルの計算コストはそこまで高くないのですが、さすがに20回となると負荷が心配なので傾きと切片はまとめて計算しています。
(残差和の計算はうまい方法が思いつかないので別々に行ないました。)

▼最小二乗法

/***
 * 最小二乗法で単回帰(複数期間対応)
 * src  ... 時系列データ
 * fits ... 計算結果をセットする配列
 * x0   ... 計算を開始するバー
 * min  ... 最小の期間
 * max  ... 最大の期間
 * span ... 期間の間隔
 */
void lm(const double &src[],double &fits[][4],int x0,int min,int max,int span)
  {
   //--- 変数を初期化
   double Xsum=0.0;
   double Ysum=0.0;
   double XYsum=0.0;
   double X2sum=0.0;
   double Y2sum=0.0;
   //---期間の数
   int sz=0;
   //--- 最大期間までカウントアップします。
   for(double x=0;x<max;x++)
     {
      //--- 計算開始位置から過去向きに進んできます。
      double y=src[x0-(int)x];
      //--- 最小二乗法の計算
      XYsum+=x*y;
      Xsum+=x;
      Ysum+=y;
      X2sum+=x*x;
      Y2sum+=y*y;
      //--- 対象期間以外はスキップします。
      if(x+1.0<min)continue;
      double n=(x+1.0);

      if((int(n)%span)==0)
        {
         //--- 計算結果配列を用意
         int rsv = 1+(max-min)/span;
         ArrayResize(fits,sz,rsv);
         //--- 傾き、切片、決定係数を計算
         double div=(n*X2sum-Xsum*Xsum);
         if(div!=0)
           {
            //--- 傾きと切片
            double b=(n*XYsum-Xsum*Ysum)/div; //傾き
            double a=(X2sum*Ysum-XYsum*Xsum)/div; //切片
            //--- 決定係数
            double X22=Xsum*Xsum;
            double Y22=Ysum*Ysum;
            double dv=sqrt((n*X2sum-X22)*(n*Y2sum-Y22));
            double r =(dv==0)? 0:(n*XYsum-Xsum*Ysum)/dv;
            //--- 結果をセット
            ArrayResize(fits,sz+1,rsv);
            fits[sz][0]=x;
            fits[sz][1]=a;
            fits[sz][2]=b;
            fits[sz][3]=r*r;
            sz++;
           }
        }
     }
  }

期間最適化

 期間の最適化には平均絶対誤差を使用しています。こんな感じです。

f:id:fxborg:20161206081739p:plain

(その1)

f:id:fxborg:20161206081849p:plain

(その2)

誤差で最適化しているのでうしても短い期間が優先されちゃいますね。もう一工夫したいところです。

最後に

今回は回帰チャネルの期間最適化を行なっていました。計算負荷も大丈夫そうなので、今後は期間最適化の条件を改善していきたいと思います。

こちらからどうぞ
Indicators/SnR_TL_v1_0.mq5