Corrélation
#1
Posté 04 février 2012 - 00:18
Je connais cette page : http://www.forextick...-01-correlation
mais je voudrais si possible l'inclure dans un programme assez complexe donc j'aurai besoin d'une méthode pour pouvoir le calculer, comme ça je pourrais créer des instructions conditionnelles en fonction des résultats.
#2
Posté 04 février 2012 - 00:40
Condor the Quant trader, le 04 février 2012 - 00:18 , dit :
Je connais cette page : http://www.forextick...-01-correlation
mais je voudrais si possible l'inclure dans un programme assez complexe donc j'aurai besoin d'une méthode pour pouvoir le calculer, comme ça je pourrais créer des instructions conditionnelles en fonction des résultats.
la question m'étonne de la part d'un quant.
1) calcul de la covariance
c'est à dire de la variance.... c'est pareil sauf qu'au lieu d'élever au carré on remplace par le produit des écarts de la paire 1 et de la paire 2 ( dans le cas ou la paire 1=paire2 on a la variance)
bref
http://www.aiaccess....coefficient.htm
tu auras la formule exacte de la variance, de la covariance et du coefficient de corrélation.
#3
Posté 04 février 2012 - 12:02
#4
Posté 04 février 2012 - 12:49
Condor the Quant trader, le 04 février 2012 - 12:02 , dit :
Dès que l'on veut avoir une approche quantitative ( Quant) on en passe forcément par les formules statistiques élémentaires ( au départ). Il est important de les comprendre avant de les appliquer. je me demande d'ailleurs comment on peut appliquer des trucs qu'on ne comprend pas.
C'est là que beaucoup se trompent et confondent l'aspect informatique, développement, écriture de code et l'approche quantitative qui est avant tout mathématique, statistique. Approche de la mesure et modélisation des erreurs. Et cela se fait sur le papier avant d'avoir posé une seule ligne de code.
d'ailleurs des logiciels comme Mathlab ou R vous seront d'une plus grande utilité que le MQL. Excell est aussi un très bon outil.
Pour concevoir il faut disposer des outils conceptuels. Pour ceux qui veulent faire du trading algorithmique, L'AT est ce qui leur fera perdre le plus de temps. Pour tout dire c'est incompatible. Hors polémique, ce ne sont pas les mêmes mondes.
ou alors on se dirige vers la reconnaissance de forme par IA et choses dans le genre. mais on n'échappera pas même en ce domaine à un certain niveau de mathématiques. Car on mesure toujours des variances, des auto corrélations d'erreurs ( résidus) c'est toujours et encore les mêmes outils mathématiques et statistiques.J'en passe.
Bien des incompréhensions résultent de cette confusion.
Les développeurs se disent, moi je connais l'informatique ( du moins le bout qu'ils connaissent) j'ai pas besoin des maths ni de qui que ce soit. Je dispose de l'avantage décisif car je code.
Les matheux eux se disent moi je connais les maths et je sais calculer et modéliser les erreurs blabla. C'est moi qui ais l'avantage décisif. les informaticiens c'est de la daube. comme disait l'autre " je décide ils exécutent"
j'conceptualise!j'ventile!.... etc
on arrête la liste. mais dans le cas qui nous occupe tout le monde a besoin de tout le monde.
car il faut
1) les outils conceptuels d'analyse
2) les outils conceptuels de mise en oeuvre
l'un sans l'autre est sans issue comme aurait pu dire le grand Serge.
Bon week end à toi
je ne suis pas un gros matheux mais je suis assez pédagogue pour expliquer et clarifier les outils de base ( vraiment élémentaire)
Si je peux t'être utile en ce domaine. N'hésite pas.
#5
Posté 05 février 2012 - 14:25
#6
Posté 06 février 2012 - 15:59
Pour la covariance je pense avoir trouvé le bon calcul, mais il en est tout autre chose de la variance.
J'ai fais ceci pour la covariance :
string pairA = "EURUSD"; string pairB = "GBPUSD"; double pairX[], pairY[]; ArrayCopySeries(pairX, MODE_CLOSE, pairA); ArrayCopySeries(pairY, MODE_CLOSE, pairB); double PairAClose = iClose(pairA, 0, 0); double PairBClose = iClose(pairA, 0, 0); double cov = (PairAClose - ArrayRange(pairX, 0))*(PairBClose - ArrayRange(pairY, 0));
Pour la variance serait-ce simplement ceci ?
double varA = MathPow((PairAclose - ArrayRange(pairX, 0)), 2); double varB = MathPow((PairBclose - ArrayRange(pairY, 0)), 2);
Et donc au final pour obtenir le coefficient de corrélation :
double correl = cov/MathSqrt(varA*varB);
Après un petit test je sais que c'est faux
Donc il y a sûrement quelque chose que je ne comprends pas.
Ce message a été modifié par Condor the Quant trader - 06 février 2012 - 16:04 .
#7
Posté 06 février 2012 - 16:50
Condor the Quant trader, le 06 février 2012 - 15:59 , dit :
Pour la covariance je pense avoir trouvé le bon calcul, mais il en est tout autre chose de la variance.
J'ai fais ceci pour la covariance :
string pairA = "EURUSD"; string pairB = "GBPUSD"; double pairX[], pairY[]; ArrayCopySeries(pairX, MODE_CLOSE, pairA); ArrayCopySeries(pairY, MODE_CLOSE, pairB); double PairAClose = iClose(pairA, 0, 0); double PairBClose = iClose(pairA, 0, 0); double cov = (PairAClose - ArrayRange(pairX, 0))*(PairBClose - ArrayRange(pairY, 0));
Pour la variance serait-ce simplement ceci ?
double varA = MathPow((PairAclose - ArrayRange(pairX, 0)), 2); double varB = MathPow((PairBclose - ArrayRange(pairY, 0)), 2);
Et donc au final pour obtenir le coefficient de corrélation :
double correl = cov/MathSqrt(varA*varB);
Après un petit test je sais que c'est faux
Donc il y a sûrement quelque chose que je ne comprends pas.
je ne comprends pas le mql
mais la variance en langage commun
c'est:
la moyenne
du carré
des écarts à la moyenne
c'est donc la somme sur x périodes des écarts entre la valeur courante de X et la moyenne mobile de X . Ces valeurs sont élevées au carré et divisées par le nombre de périodes.
cela donne
(xi- x barre)au carré divisé par Xpériodes
x barre c'est la moyenne des xi ou ta moyenne mobile
pour la cov c'est pareil sauf que
(xi-Xbarre)( yi-y barre)
tu retrouves ta formule de variance qui devient un cas particulier de la cov en remplaçant yi-ybarre par xi-xbarre et tu retrouves ton carré.
ce qui fait que tu peux ne programmer qu'un seul indic de variance covariance
ta formule de corrélation est exacte
Ce message a été modifié par Ulysse - 06 février 2012 - 16:53 .
#8
Posté 06 février 2012 - 16:51
//+------------------------------------------------------------------+
//| correlation.mq4 |
//| ENG.A`ED|
//| aed_al_nairab@hotmail.com |
//+------------------------------------------------------------------+
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 DeepSkyBlue
//---- input parameters
extern string currency_1="EURUSD";
extern string currency_2="EURGBP";
extern int iPeriod=20;
//---- buffers
double correl[];
double hl[];
double h2[];
double hl_2[];
double h2_2[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//---- indicators
IndicatorBuffers(1);
SetIndexStyle(0,DRAW_LINE);
SetIndexBuffer(0,correl);
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
int limit;
double u,l;
int counted_bars=IndicatorCounted();
if(counted_bars<0) counted_bars=0;
if(counted_bars>0) counted_bars--;
limit=500-counted_bars;
//----
for(int c = limit-iPeriod ;c >= 0 ;c--)
{
for(int m = limit-iPeriod ;m >= 0 ;m--)
{
hl[m]=iClose(currency_1,0,m)-iMA(currency_1,0,iPeriod,0,MODE_SMA,PRICE_CLOSE,m);
h2[m]=iClose(currency_2,0,m)-iMA(currency_2,0,iPeriod,0,MODE_SMA,PRICE_CLOSE,m);
hl_2[m]=MathPow(hl[m],2);
h2_2[m]=MathPow(h2[m],2);
}
u=0;l=0;
for(int i = iPeriod-1 ;i >= 0 ;i--)
{
u=hl[c+i]* h2[c+i]+u;
l=hl_2[c+i]*h2_2[c+i]+l;
}
correl[c]=u/MathSqrt(l);
Comment("correlation ","\n",currency_1,"&",currency_2,correl);
}
//----
return(0);
}
//+------------------------------------------------------------------+ou
//+------------------------------------------------------------------+
//| Correlation_v1.mq4 |
//| Copyright © 2006, TrendLaboratory Ltd. |
//| http://finance.groups.yahoo.com/group/TrendLaboratory |
//| E-mail: igorad2004@list.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, TrendLaboratory Ltd."
#property link "http://finance.groups.yahoo.com/group/TrendLaboratory"
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 DeepSkyBlue
#property indicator_maximum 2.00
#property indicator_minimum -2.00
//---- input parameters
extern string Symbol1="USDCHFm";
extern string Symbol2="EURUSDm";
extern int cPeriod=20;
//---- buffers
double Correlation[];
double DiffBuffer1[];
double DiffBuffer2[];
double PowDiff1[];
double PowDiff2[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//---- indicators
IndicatorBuffers(5);
SetIndexStyle(0,DRAW_HISTOGRAM);
SetIndexBuffer(0,Correlation);
SetIndexBuffer(1,DiffBuffer1);
SetIndexBuffer(2,DiffBuffer2);
SetIndexBuffer(3,PowDiff1);
SetIndexBuffer(4,PowDiff2);
//----
string short_name="Correlation("+Symbol1+","+Symbol2+","+cPeriod+")";
IndicatorShortName(short_name);
SetIndexLabel(0,short_name);
SetIndexDrawBegin(0,2*cPeriod);
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
int shift,limit,counted_bars=IndicatorCounted();
if ( counted_bars < 0 ) return(-1);
if ( counted_bars ==0 ) limit=Bars-cPeriod-1;
if ( counted_bars < 1 )
for(int i=1;i<2*cPeriod;i++) Correlation[Bars-i]=0;
if(counted_bars>0) limit=Bars-counted_bars;
limit--;
for( shift=limit; shift>=0; shift--)
{
//----
DiffBuffer1[shift]=iClose(Symbol1,0,shift)-iMA(Symbol1,0,cPeriod,0,MODE_SMA,PRICE_CLOSE,shift);
DiffBuffer2[shift]=iClose(Symbol2,0,shift)-iMA(Symbol2,0,cPeriod,0,MODE_SMA,PRICE_CLOSE,shift);
PowDiff1[shift]=MathPow(DiffBuffer1[shift],2);
PowDiff2[shift]=MathPow(DiffBuffer2[shift],2);
double u=0,l=0,s=0;
for( i = cPeriod-1 ;i >= 0 ;i--)
{
u += DiffBuffer1[shift+i]*DiffBuffer2[shift+i];
l += PowDiff1[shift+i];
s += PowDiff2[shift+i];
}
if(l*s >0) Correlation[shift]=u/MathSqrt(l*s);
}
//----
return(0);
}
//+------------------------------------------------------------------+
#9
Posté 06 février 2012 - 22:24
2) Pour les scripts existants, s'ils avaient été dans les répertoires mt_yahoo ou indicators je les aurais trouvé
#10
Posté 09 février 2012 - 13:10

Aide











