Poursuite de mes investigations sur la TFish. Wikipédia donne l’expression mathématique de cette transformée de Fisher qui se réduit donc à prendre l’arctangente hyperbolique de l’indicateur x
y = 0.5 ln( (1 + x)/(1 – x) ) = atanh(x)
en le limitant entre -1 et 1 (sans les atteindre car la division par zéro et le ln(0) risquent de faire sauter les plombs sur certaines installations vétustes !). Donc tout indicateur ou prix devra être centré et recalé avant de lui appliquer la TFish (c’est le nom que je lui donne pour essayer de l’apprivoiser et parce que pour moi, TF c’est pour Fourier). Dessous, c’est l’algorithme donné par Ehlers dans son livre Cybernetic Analysis for Stocks and Futures (2004), p.7. C’est en EasyLanguage. Je ne sais pas ce que c’est mais c’est très compréhensible … Enfin, si Ehlers n’avait pas imbriqué plusieurs traitements dans une instruction en le transformant en HardLanguage (c’est pas cool John !). Alors pour y comprendre quelque chose, je l’ai désimbriqué et commenté (% commentaires …).
% Inputs
Price((H+L)/2); % Price = (H+L)/2 est la valeur médiane
Len(10); % Len = 10 est la longueur du canal utilisé pour cadrer la TFish
% Limite du canal de longueur Len
MaxH = Highest(Price, Len); % max de Price sur les Len dernières valeurs
MinL = Lowest(Price, Len); % min de Price sur les Len dernières valeurs
% Normalisation de Price pour qu’il évolue entre -1 et 1 dans le canal
Price_norm = 2*(Price - MinL)/(MaxH - MinL) – 1;
% Lissage par EMA de Price_norm avant la TFish
Alpha1 = 0.5 ; % coefficient alpha de la EMA
X = (1 – Alpha1)*X[1] + Alpha1*Price_norm; % X valeur lissée de Price_norm
% Backstop pour que X ne sortent pas du canal (sinon, gare aux plombs …)
If X > 0.9999 then X = 0.9999;
If X < -0.9999 then X = -0.9999;
% la TFish
Y = 0.5*Log((1 + X)/(1 - X));
% Fish (variable de sortie) est la valeur lissée de Y par EMA
Alpha2 = 0.5 ; % coefficient alpha de la EMA
Fish = (1 – Alpha2)*Fish[1] + Alpha2*Y;
% Outputs
Plot1(Fish, “Fisher”);
Plot2(Fish[1], “Trigger”)
Remarque : Un coefficient de lissage alpha de 0.5 correspond à une période de 3. Sans doute plus tard, dans son article (pdf sur mesasoftware.com) il passe Alpha1 à 0.33 pour lisser davantage, soit sur une période de 5 (pourquoi ??).
Pour essayer de comprendre le comportement de notre TFish, j’utilise un signal sinusoïdal d’amplitude arbitraire de 1.3. Il est naturellement centré et je lui applique un coefficient d’échelle en le divisant par 1.3 ( max(abs(x)) ) et en le multipliant par 0.999 pour qu’il n’atteigne pas la valeur unitaire xs = x/max(abs(x))*0.999. Je lui applique la TFish y = atanh(xs).
y et xs (x recalé) sont représentés sur la Fig. 1, la Fig. 2 montre les distributions calculées à l’aide histogrammes (j’ai pris plus de valeurs que sur la Fig. 1 pour une meilleure détermination). Bon, jusqu’à maintenant ça tient ses promesses : les valeurs extrêmes sont amplifiées et la distribution devient gaussienne.
Mais j’ai voulu bruiter la sinusoïde avec un bruit blanc (gaussien) avec un rapport signal sur bruit d’environ 19 dB. J’applique le même traitement que précédemment (le coefficient d’échelle n’est plus le même à cause du bruit ajouté) et j’ai tout cassé … (voir Fig. 3 et 4).
NB. : Dans l’algo de Ehler, on comprend mieux la nécessité de bien ajuster le canal de variation de Price et de sa mise à l’échelle. On voit aussi pourquoi il est indispensable de lisser le signal avant la TFish, mais pas trop car on retarde la décision.
Bon, reste à le tester … ce qui peut de prendre un peu de temps.
y = 0.5 ln( (1 + x)/(1 – x) ) = atanh(x)
en le limitant entre -1 et 1 (sans les atteindre car la division par zéro et le ln(0) risquent de faire sauter les plombs sur certaines installations vétustes !). Donc tout indicateur ou prix devra être centré et recalé avant de lui appliquer la TFish (c’est le nom que je lui donne pour essayer de l’apprivoiser et parce que pour moi, TF c’est pour Fourier). Dessous, c’est l’algorithme donné par Ehlers dans son livre Cybernetic Analysis for Stocks and Futures (2004), p.7. C’est en EasyLanguage. Je ne sais pas ce que c’est mais c’est très compréhensible … Enfin, si Ehlers n’avait pas imbriqué plusieurs traitements dans une instruction en le transformant en HardLanguage (c’est pas cool John !). Alors pour y comprendre quelque chose, je l’ai désimbriqué et commenté (% commentaires …).
% Inputs
Price((H+L)/2); % Price = (H+L)/2 est la valeur médiane
Len(10); % Len = 10 est la longueur du canal utilisé pour cadrer la TFish
% Limite du canal de longueur Len
MaxH = Highest(Price, Len); % max de Price sur les Len dernières valeurs
MinL = Lowest(Price, Len); % min de Price sur les Len dernières valeurs
% Normalisation de Price pour qu’il évolue entre -1 et 1 dans le canal
Price_norm = 2*(Price - MinL)/(MaxH - MinL) – 1;
% Lissage par EMA de Price_norm avant la TFish
Alpha1 = 0.5 ; % coefficient alpha de la EMA
X = (1 – Alpha1)*X[1] + Alpha1*Price_norm; % X valeur lissée de Price_norm
% Backstop pour que X ne sortent pas du canal (sinon, gare aux plombs …)
If X > 0.9999 then X = 0.9999;
If X < -0.9999 then X = -0.9999;
% la TFish
Y = 0.5*Log((1 + X)/(1 - X));
% Fish (variable de sortie) est la valeur lissée de Y par EMA
Alpha2 = 0.5 ; % coefficient alpha de la EMA
Fish = (1 – Alpha2)*Fish[1] + Alpha2*Y;
% Outputs
Plot1(Fish, “Fisher”);
Plot2(Fish[1], “Trigger”)
Remarque : Un coefficient de lissage alpha de 0.5 correspond à une période de 3. Sans doute plus tard, dans son article (pdf sur mesasoftware.com) il passe Alpha1 à 0.33 pour lisser davantage, soit sur une période de 5 (pourquoi ??).
Pour essayer de comprendre le comportement de notre TFish, j’utilise un signal sinusoïdal d’amplitude arbitraire de 1.3. Il est naturellement centré et je lui applique un coefficient d’échelle en le divisant par 1.3 ( max(abs(x)) ) et en le multipliant par 0.999 pour qu’il n’atteigne pas la valeur unitaire xs = x/max(abs(x))*0.999. Je lui applique la TFish y = atanh(xs).
y et xs (x recalé) sont représentés sur la Fig. 1, la Fig. 2 montre les distributions calculées à l’aide histogrammes (j’ai pris plus de valeurs que sur la Fig. 1 pour une meilleure détermination). Bon, jusqu’à maintenant ça tient ses promesses : les valeurs extrêmes sont amplifiées et la distribution devient gaussienne.
Mais j’ai voulu bruiter la sinusoïde avec un bruit blanc (gaussien) avec un rapport signal sur bruit d’environ 19 dB. J’applique le même traitement que précédemment (le coefficient d’échelle n’est plus le même à cause du bruit ajouté) et j’ai tout cassé … (voir Fig. 3 et 4).
NB. : Dans l’algo de Ehler, on comprend mieux la nécessité de bien ajuster le canal de variation de Price et de sa mise à l’échelle. On voit aussi pourquoi il est indispensable de lisser le signal avant la TFish, mais pas trop car on retarde la décision.
Bon, reste à le tester … ce qui peut de prendre un peu de temps.
Commentaire