Кто как расчитывает корреляцию валютных пар ? (плюсы минусы методов)

 

Добрый день всем форумчанам !

Возник вопрос в подходе расчета корреляции валютных пар, есть несколько подходов на сколько мне известно спирмен, пирсон, может еще какие есть, я расчитываю так:

 1.

double CORRELATION()

{
   double M1[]; 
   double M2[];
   ArrayResize(M1, countBarsCorr, 100);
   ArrayResize(M2, countBarsCorr, 100);
 
   for(int i = countBarsCorr - 1; i >= 0; i--) 
   { 
      M1[i] = fOHLC(R_Base, i);
      M2[i] = fOHLC(R_Hedge, i);
   }      

   double mx=0,my=0;
   double chislitel=0, znamenatel=0;
   double X=0,Y=0;

   double res=0,f;

   int i=0;
   f=countBarsCorr;
   for(i=0;i<countBarsCorr;i++){mx+=M1[i];my+=M2[i];}

   mx/=f;my/=f;

   for(i=0; i<countBarsCorr; i++)
   {
      chislitel+=(M1[i]-mx)*(M2[i]-my);
      X+=MathPow((M1[i]-mx),2);
      Y+=MathPow((M2[i]-my),2);      
   }

   chislitel/=f;
   X/=(f-1);
   Y/=(f-1);
   X=MathSqrt(X);
   Y=MathSqrt(Y);
   znamenatel=X*Y;
   res=chislitel/znamenatel;

   return(res);

}

 

еще есть метод, немного побольше кода, но значения выдает примерно теже что и этот за аналогичный период расчета и таймфрейм (разнича не более 0.01), но есть онлайн калькуляторы корреляции, (не знаю можно ли выкладывать ссылки), так вот ихние результаты отличаются от того что выдает данных подход, причем иногда очень существенно, по методу CORRELATION() за 150 баров по М5 например = 0.24, а на сайте 0.46 (корреляция 2х пар например EURGBP / GBPCHF - значения с потолка это не суть, суть в том что есть отличия  ) Причем на нескольких онлайн калькуляторах цифры одинаковы...

 Так вот вопрос к Вам, каким образом Вы расчитываете корреляцию, может быть Спермен, я его попробовал но значения получаются 145.34, 235.54  и что то подобное, может что не так сделал.

Если примеры расчета кто выложит буду признателен. Спасибо. 

 

 

 

 
Пожалуйста, вставляйте код в сообщения правильно: Правильно вставляем код на форуме
 
Karputov Vladimir:
Пожалуйста, вставляйте код в сообщения правильно: Правильно вставляем код на форуме
Спасибо, поправил.
 
lmsnn:

Добрый день всем форумчанам !

Возник вопрос в подходе расчета корреляции валютных пар, есть несколько подходов на сколько мне известно спирмен, пирсон, может еще какие есть, я расчитываю так:

 1.

 

еще есть метод, немного побольше кода, но значения выдает примерно теже что и этот за аналогичный период расчета и таймфрейм (разнича не более 0.01), но есть онлайн калькуляторы корреляции, (не знаю можно ли выкладывать ссылки), так вот ихние результаты отличаются от того что выдает данных подход, причем иногда очень существенно, по методу CORRELATION() за 150 баров по М5 например = 0.24, а на сайте 0.46 (корреляция 2х пар например EURGBP / GBPCHF - значения с потолка это не суть, суть в том что есть отличия  ) Причем на нескольких онлайн калькуляторах цифры одинаковы...

 Так вот вопрос к Вам, каким образом Вы расчитываете корреляцию, может быть Спермен, я его попробовал но значения получаются 145.34, 235.54  и что то подобное, может что не так сделал.

Если примеры расчета кто выложит буду признателен. Спасибо. 

 

 

 

Вообще сам принцип анализа на корреляции для меня сомнителен. Я использую другой метод. Хотя и его можно назвать аналогом данного. Моя методика была описана в моем блогеwww.mql5.com/ru/blogs/post/380068. К выпуску готовится индюк но он в отличии от описанного сохранил только принцип. Внешне он будет напоминать простую информационную панель.
 
lmsnn:

Добрый день всем форумчанам !

Возник вопрос в подходе расчета корреляции валютных пар, есть несколько подходов на сколько мне известно спирмен, пирсон, может еще какие есть, я расчитываю так:

 1.

 

еще есть метод, немного побольше кода, но значения выдает примерно теже что и этот за аналогичный период расчета и таймфрейм (разнича не более 0.01), но есть онлайн калькуляторы корреляции, (не знаю можно ли выкладывать ссылки), так вот ихние результаты отличаются от того что выдает данных подход, причем иногда очень существенно, по методу CORRELATION() за 150 баров по М5 например = 0.24, а на сайте 0.46 (корреляция 2х пар например EURGBP / GBPCHF - значения с потолка это не суть, суть в том что есть отличия  ) Причем на нескольких онлайн калькуляторах цифры одинаковы...

 Так вот вопрос к Вам, каким образом Вы расчитываете корреляцию, может быть Спермен, я его попробовал но значения получаются 145.34, 235.54  и что то подобное, может что не так сделал.

Если примеры расчета кто выложит буду признателен. Спасибо. 

 

 

 

Вы немного не с того бока подошли к теме корреляции. Методы определения корреляционной зависимости и соответственно расчёта коэффициента корреляции зависят в первую очередь от постановки задачи. Вам нужно для начала выбрать, по каким статистическим параметрам хотите определить наличие или отсутствие корреляции.
Я как-то встречал в сети рекламу советников, в которых торговая система построена на астрологически-астрономических показателях.Так надо понимать, что создатели этих торговых систем смогли вычислить корреляцию между расположением небесных тел и движением рыночных цен ... Скорей всего, метод применяемый для определения корреляции в этом случае, отличается от метода расчёта, где ставится задача поиска корреляции по статистическим данным к примеру, частота котирования по инструменту в зависимости от времени по Гринвичу...
Из  собственной практики - как критерий для исследования использую направление движения цены, при расчёте пользуюсь формулой Фехнера.
 

Alexander LasyginVladimir Suschenko спасибо за комментарии, собственно мне нужен метод для хэджевого советника, для понимания характера движения ПП или корзины. Может быть есть варианты расчета чего либо(корреляции или нет) для того чтобы понимать какам образом ведут себя пары относительно друг друга ? Метод нужен как фильтр, чтобы отбрасывать не имеющие ничего общего связи.

 
 
Server Muradasilov:
Эти данные за какой расчетный период (год, месяц, или может быть за 2011 год расчитанный по Н1)? Меня интересует медод (подход) расчета для получения данных о коррелированности 2х или более пар, за тот период который мне нужен, и из тех данных которые я собрал сам. Другими словами метод анализа данных на предмет наличия в них связей, а не готовая табличка непонятно как расчитанная и из каких данных.
 

lmsnn:

Возможно Вам подойдёт этот индикатор.
Считает коэффициент ранговой корреляции Спирмена между двумя инструментами.
Функцию я взял отсюда.

//+------------------------------------------------------------------+
//|                                    Spearman-rank-correlation.mq4 |
//|                              Copyright © 2005-2015, Igor Korepin |
//|                             https://www.mql5.com/ru/users/xupypr |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005-2015, Igor Korepin"
#property link      "https://www.mql5.com/ru/users/xupypr"
#property strict
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 SteelBlue
#property indicator_minimum -1.1
#property indicator_maximum 1.1
#property indicator_level1 -1
#property indicator_level2 1
input ushort Cor_Period=12;     //Spearman's Rank Correlation Period
input ushort Cal_Bars=100;      //Calculated Bars
input string Symbol_2="EURUSD"; //Second Symbol
double Buffer[];
double V1[],V2[];
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
   SetIndexBuffer(0,Buffer);
   SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,2);
   SetIndexLabel(0,"Coefficient");
   ArrayResize(V1,Cor_Period);
   ArrayResize(V2,Cor_Period);
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   int begin;
   if(prev_calculated==0) begin=Cal_Bars-1;
   else
   {
    begin=rates_total-prev_calculated;
    if(begin>Cal_Bars-1) begin=Cal_Bars-1;
   }
   for(int b=begin;b>=0;b--)
     {
      CopyClose(_Symbol,0,b,Cor_Period,V1);
      CopyClose(Symbol_2,0,b,Cor_Period,V2);
      if(GetLastError()==4066) return(0);
      Buffer[b]=GetSpearmanRankCorr(V1,V2);
     }
   return(rates_total);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int GetRank(double &vector[],double &rank[])
  {
   double tmp,vtmp[][2];
   int i,count,res=0,period=ArraySize(vector);
   ArrayResize(rank,period);
   ArrayResize(vtmp,period);
   for(i=0;i<period;i++)
     {
      vtmp[i][0]=vector[i];
      vtmp[i][1]=i;
     }
   ArraySort(vtmp);
   for(i=0;i<period;i++)
     {
      count=0;
      while(i<period-1)
        {
         if(vtmp[i][0]!=vtmp[i+1][0]) break;
         count++;
         i++;
        }
      tmp=i;
      if(count>0)
        {
         tmp-=count/2.0;
         res+=count*(count+1)*(count+2);
        }
      while(count>=0)
        {
         vtmp[i-count][0]=vtmp[i-count][1];
         vtmp[i-count][1]=tmp;
         count--;
        }
     }
   ArraySort(vtmp);
   for(i=0;i<period;i++) rank[i]=vtmp[i][1];
   return(res);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double GetSpearmanRankCorr(double &vector1[],double &vector2[])
  {
   double res=0;
   double rank1[],rank2[];
   int a1,a2,n=ArraySize(vector1);
   a1=GetRank(vector1,rank1);
   a2=GetRank(vector2,rank2);
   for(ushort i=0;i<n;i++) res+=MathPow(rank1[i]-rank2[i],2);
   n=n*(n*n-1);
   if((a1==0) && (a2==0)) res=1-6*res/n;
   else
     {
      if((n-a1)==0 || (n-a2)==0) res=0.0;
      else res=(n-(a1+a2)/2.0-6*res)/MathSqrt((double)(n-a1)*(double)(n-a2));
     }
   return(res);
  }
//+------------------------------------------------------------------+
Коэффициент ранговой корреляции Спирмена - MQL4 форум
  • www.mql5.com
Коэффициент ранговой корреляции Спирмена - MQL4 форум
Файлы:
 
Igor Korepin:

Возможно Вам подойдёт этот индикатор.
Считает коэффициент ранговой корреляции Спирмена между двумя инструментами.
Функцию я взял отсюда.

Спасибо, воткнул в советник все работает, в отличии от пирсона  при одинаковых параметрах выдает немного отличные от него результаты. А Cor_Period это сколько брать баров для расчета одного значения ? 
 
lmsnn:
....в отличии от пирсона  при одинаковых параметрах выдает немного отличные от него результаты....

Не удивительно, это всё таки ранговая корреляция
Причина обращения: