Overblog Suivre ce blog
Administration Créer mon blog
9 décembre 2008 2 09 /12 /décembre /2008 16:27

Boîtes de Darvas et Stratégies.

La stratégie employée par Darvas est une technique de breakout : achat lorsque le haut de la boîte est cassé, à cela on peut encore ajouter des filtres.  J'ai testé le système sur les actions US, celui-ci fonctionne mieux sur celles du Nasdaq que sur celles composant le Dow Jones (question de volatilité, valeur de croissance.....).  La majeure partie des gains s'effectue lors de la période 1999/2000 pour la plupart des valeurs.  Pour une première approche, il n'y a pas de slippage, ni de frais.  Le capital est de 20000, la portion investie de 10000, il n'y a pas de pyramidage.

Il y a comparaison entre les systèmes "bearish" et "bullish", ainsi qu'une variation de la validation de la cassure : par la cloture ou simplement par le high.  La condition de sortie du trade est une cassure par le bas d'une boîte.

Voici une vue de VRSN avec les EC's des différents systèmes :



Une autre vue avec OXY :



Le système 1 est le "bearish" + cloture.
Le système 2 est le "bearish" + high/low.
Le système 3 est le "bullish" + cloture.
Le système 4 est le "bullish" + high/low.

D'une façon générale, le système "bearish" est plus performant.  C'est curieux, j'aurais parié le contraire.  Je n'en ai pas analysé la raison, peut-être les sorties.  Sinon, pas de grosses différences entre les systèmes "cloture" et "high/low".  Suivant le support, c'est tantôt l'un, tantôt l'autre.

Voici les codes pour Prorealtime :

//////////////// système 1 /////////////////
if box=1 and (high>tth or low<ttl) then
    box=0
    flag=0
endif
if box=0 and flag=0 and low>low[3] and low[1]>low[3] and low[2]>low[3] then
    th=low[3]
    flag=1
endif
if flag=1 and box=0 and low<th then
    flag=0
endif
if flag=1 and box=0 and high<high[3] and high[1]<high[3] and high[2]<high[3] then
    tth=high[3]
    ttl=th
    box=1
endif
once tth=undefined
once ttl=undefined
if close>tth then
    buy 50 %CAPITAL at market thisbaronclose
endif
if close<ttl then
    sell at market thisbaronclose
endif

//////////////////// système 2 ////////////////
if box=1 and (high>tth or low<ttl) then
    box=0
    flag=0
endif
if box=0 and flag=0 and low>low[3] and low[1]>low[3] and low[2]>low[3] then
    th=low[3]
    flag=1
endif
if flag=1 and box=0 and low<th then
    flag=0
endif
if flag=1 and box=0 and high<high[3] and high[1]<high[3] and high[2]<high[3] then
    tth=high[3]
    ttl=th
    box=1
endif
once tth=undefined
once ttl=undefined
buy 50 %capital at tth stop
sell at ttl stop

////////////////// système 3 ///////////////////
if box=1 and (high>tth or low<ttl) then
    box=0
    flag=0
endif
if box=0 and flag=0 and high<high[3] and high[1]<high[3] and high[2]<high[3] then
    th=high[3]
    flag=1
endif
if flag=1 and box=0 and high>th then
    flag=0
endif
if flag=1 and box=0 and low>low[3] and low[1]>low[3] and low[2]>low[3] then
    ttl=low[3]
    tth=th
    box=1
endif
once tth=undefined
once ttl=undefined
if close>tth then
    buy 50 %CAPITAL at market thisbaronclose
endif
if close<ttl then
    sell at market thisbaronclose
endif

////////////////// système 4 ///////////////////
if box=1 and (high>tth or low<ttl) then
    box=0
    flag=0
endif
if box=0 and flag=0 and high<high[3] and high[1]<high[3] and high[2]<high[3] then
    th=high[3]
    flag=1
endif
if flag=1 and box=0 and high>th then
    flag=0
endif
if flag=1 and box=0 and low>low[3] and low[1]>low[3] and low[2]>low[3] then
    ttl=low[3]
    tth=th
    box=1
endif
once tth=undefined
once ttl=undefined
buy 50 %CAPITAL at tth stop
sell at ttl stop

Remarque : si vous voulez afficher pour contrôle, l'indicateur utilisé, il faut ajouter "return tth, ttl" à la place des instructions d'achat/vente.
Repost 0
30 août 2008 6 30 /08 /août /2008 16:33

Backtest : Premier Stochastic Oscillator (PSO) by Lee Leibfarth.

Dans le numéro d'août de S&C, Lee Leibfarth présente une variante du Stochastic : le PSO , Premier Stochastic Oscillator.  Il décrit également une stratégie basée sur cet indicateur.  Voici une vue du PSO appliqué au FCE :



Les signaux d'achat sont donnés par un croisement à la baisse de la courbe et des niveaux 0.9 ou 0.2.
Les signaux de vente, eux, par un croisement à la hausse de la courbe avec les valeurs -0.9 ou -0.2.

Et le code de l'indicateur pour Prorealtime, les paramètres par défaut sont 8,5,5 :

len=8
per=5
stoc=Stochastic[len,1](close)
nsto=0.1*(stoc-50)
ssto=exponentialaverage[per](nsto)
sssto=exponentialaverage[per](ssto)
prem=(EXP(sssto)-1)/(exp(sssto)+1)
cond1=prem<.9 and prem[1]>.9
cond2=prem<.2 and prem[1]>.2
cond3=prem>-.9 and prem[1]<-.9
cond4=prem>-.2 and prem[1]<-.2
condha=(cond1 or cond2)*-.2
condvte=(cond3 or cond4)*-.2
return prem, .9, .2, -.9, -.2,condha, condvte

Lee Leibfarth préconise un rapport R/R de 2 : soit une prise de profit éloignée du double du stoploss.  Est-ce là la clé de la profitabilité du système ?  Voici un vue de la courbe P/L pour le FCE, 3.50 eur par A/R, sans slippage, 1 contrat, stop à 1.2%, target à 2.4% :



Le rapport :



Et le code du backtest de la stratégie PSO pour Prorealtime, l'écart pour le stoploss (aa) est à introduire en variable :

bb=aa*2
REM Achat
ignored, ignored, ignored, ignored, ignored, indic1, indic2= CALL "premier stochastic"
c1 = (indic1 < 0.0)
IF c1 THEN
    BUY 1 SHARES AT MARKET THISBARONCLOSE
    pr=entryquote
    tg=pr*(1+bb)
    st=pr*(1-aa)
ENDIF
sell at st stop
sell at tg limit

REM Vente à découvert
c2 = (indic2 < 0.0)
IF c2 THEN
    SELLSHORT 1 SHARES AT MARKET THISBARONCLOSE
    prv=entryquote
    tgv=prv*(1-bb)
    stv=prv*(1+aa)
ENDIF
exitshort at stv stop
exitshort at tgv limit

Prudence !  Il faut bien faire attention si le stop et le target sont touchés sur la même barre, Prorealtime prend parfois le cas le plus favorable (dans l'ordre test sur open, puis close puis high et enfin low).  Ici, avec ce système, il faudrait un range de 3.6% pour avoir cette possibilité.  Après une rapide vérification, je n'ai pas trouvé ce genre de bougie mais prudence, si on réduit la valeur de la variable avec la fonction optimisation.

D'après les développeurs, cette stratégie peut être associée avec d'autres signaux.  Des filtres pour le trend ou/et le timing ?  On peut aussi imaginer un écart variant en fonction de l'ATR.

Repost 0
12 février 2008 2 12 /02 /février /2008 18:46

Trading Strategy Using Ehlers Filter.

 

Dans le fichier TSWorld05, téléchargeable sur le site de J. Ehlers, celui-ci présente et compare 8 filtres non-linéaires (ou moyennes mobiles adaptatives) :

 - KAMA (Kaufman Adaptative Moving Average).

 - VIDYA (Variable Index Dynamic Average).

 - MAMA (MESA Adaptative Moving Average).

 - Ehlers Filter.

 - Median Filter.

 - Median-MA Difference Filter.

 - FRAMA (Fractal Adaptative Moving Average).

 - Nonlinear Laguerre Filter.

 

L'auteur construit à partir de ces moyennes non-linéaires, une stratégie de trading fort simple.  Je reprends ici l'exemple de système donné par J. Ehlers dans son fichier.  Voici tout d'abord une vue d'un graphique (AMD) avec le "Ehlers Filter" (len=15) :

 

hk47.gif

 

Et le code pour Prorealtime, il faut introduire len (longueur du filtre) en variable :

 

rem len entre 5 et 25, conseillé entre 16 et 25
pr=MedianPrice
if barindex>1    then
    smooth=(pr+2*pr[1]+2*pr[2]+pr[3])/6
    dist=0
    for j= 1 to len-1 do
        dist=dist+SQUARE(smooth-smooth[j])
    next
    sumcoef=0
    num=0
    for i=0 to len-1 do
        sumcoef=sumcoef+dist[i]
        num=num+dist[i]*smooth[i]
    next
    filt=num/sumcoef  
endif
return filt

 

Ensuite, J. Ehlers applique à cette courbe une enveloppe fonction de la volatilité afin ,dit-il, de filtrer les périodes de range.  Dès que la courbe sort de l'enveloppe, un signal est donné.  Le système est de type SAR, on est tout le temps dans le marché.  Voici une vue de l'indicateur avec son enveloppe :

 

hk48.gif

 

Voici le code, on peut faire varier la largeur de l'enveloppe en introduisant le coefficient (frac) en variable :

 

rem len entre 5 et 25, conseillé entre 16 et 25
rem frac entre 2 et 15
pr=MedianPrice
if barindex>1    then
    smooth=(pr+2*pr[1]+2*pr[2]+pr[3])/6
    dist=0
    for j= 1 to len-1 do
        dist=dist+SQUARE(smooth-smooth[j])
    next
    sumcoef=0
    num=0
    for i=0 to len-1 do
        sumcoef=sumcoef+dist[i]
        num=num+dist[i]*smooth[i]
    next
    filt=num/sumcoef
   
    rng=0.1*Range+0.9*rng[1]
    val1=filt[1]+rng/frac
    val2=filt[1]-rng/frac
endif
return filt,val1,val2

 

Et le code pour la version en historigramme :

 

rem len entre 5 et 25, conseillé entre 16 et 25
rem frac entre 2 et 15
pr=MedianPrice
if barindex>1    then
    smooth=(pr+2*pr[1]+2*pr[2]+pr[3])/6
    dist=0
    for j= 1 to len-1 do
        dist=dist+SQUARE(smooth-smooth[j])
    next
    sumcoef=0
    num=0
    for i=0 to len-1 do
        sumcoef=sumcoef+dist[i]
        num=num+dist[i]*smooth[i]
    next
    filt=num/sumcoef
   
    rng=0.1*Range+0.9*rng[1]
    val1=filt[1]+rng/frac
    val2=filt[1]-rng/frac
endif
if filt crosses over val1 then
    flag=1
elsif filt crosses under val2 then
    flag=-1
endif
return flag

 

J'ai donc construit un système basé sur l'indicateur en historigramme.  Ehlers conseille d'ajouter un stop pour que la stratégie soit complète, je ne l'ai pas fait.  Tel système de trading peut , d'après l'auteur, être basé sur n'importe lequel des 8 filtres qu'il présente dans son fichier.  Voilà une vue du système sur AMD, optimisé et sans stop.

 

hk49.gif

 

Et pour être complet, le code en version "indicateur backtest", il faut entrer aa (len) et bb (frac) en variables à optimiser.  Attention, vu la construction du filtre, les tests peuvent prendre du temps !

 

REM Achat
indicator1 = CALL "ehlers filter historigramme"[aa, bb]
c1 = (indicator1 > 0.0)
IF c1 THEN
    BUY 10000 CASH AT MARKET THISBARONCLOSE
ENDIF
REM Vente
c2 = (indicator1 < 0.0)
IF c2 THEN
    SELL  AT MARKET THISBARONCLOSE
ENDIF
REM Vente à découvert
c3 = (indicator1 < 0.0)
IF c3 THEN
    SELLSHORT 10000 CASH AT MARKET THISBARONCLOSE
ENDIF
REM Rachat
c4 = (indicator1 > 0.0)
IF c4 THEN
    EXITSHORT  AT MARKET THISBARONCLOSE
ENDIF

 

 

Repost 0
12 février 2008 2 12 /02 /février /2008 18:39

Comment tester une stratégie sur un ensemble de valeurs ?

 

Une des lacunes du logiciel Prorealtime est de ne pas pouvoir tester les stratégies de trading sur un portefeuille d'actions.  Il faut à chaque fois relancer le backtest en changeant le support pour ainsi appliquer le système de trading aux titres un par un.  Avec une stratégie simple, je vais montrer comment on peut améliorer la chose.

 

La stratégie : achat lors du croisement A+ (de type fort) de la moyenne 7 simple avec la moyenne mobile 20 simple.  On prend position à la cloture de la barre si celle-ci est inférieure à 75% de la Bollinger Bandwdth et le high < à 85%, l'objectif est la Bollinger supérieure et le stop une cloture sous la moyenne 20 simple.  Cette stratégie sert juste d'exemple, rien ne dit qu'elle est gagnante, attention !

 

Le code :

 

REM Achat

indic1 = Average[7](close)
c1 = (indic1>indic1[1] and indic1[1]>indic1[2])
indic2=std[20](close)
indic3 = Average[20](close)
c2 = (indic3>indic3[1] and indic3[1]>indic3[2])
c10=(indic1 crosses over indic3)
indic5 = indic3+indic2
c3 = (close <= indic5 and close > indic3)
indic6 = BollingerUp[20](close)
c4 = (high <= ((indic6-indic5)*0.4)+indic5)
c11=(close>open)
IF c1 AND c2 AND c3 AND c4 and c10 and c11 THEN
    BUY 20000 CASH AT MARKET THISBARONCLOSE
ENDIF

REM Vente
sell at indic6 limit
c5 = (close<indic3)
IF c5 THEN
    SELL  AT MARKET THISBARONCLOSE
ENDIF

 

Une vue d'un trade sur  DELL, M7 haussière (en jaune), M20 haussière (en blanc), close<75% bbw (en ciel)  :

 

hk43.gif

 

L'astuce consiste à construire un indicateur qui fera office de backtest.  Voici le code de l'indicateur pour le backtest pris en exemple, on voit bien que les 2 courbes sont identiques.

 

hk44.gif

 

REM Achat
once cap=100000
indic1 = Average[7](close)
c1 = (indic1>indic1[1] and indic1[1]>indic1[2])
indic2=std[20](close)
indic3 = Average[20](close)
c2 = (indic3>indic3[1] and indic3[1]>indic3[2])
c10=(indic1 crosses over indic3)
indic5 = indic3+indic2
c3 = (close <= indic5 and close > indic3)
indic6 = BollingerUp[20](close)
c4 = (high <= ((indic6-indic5)*0.4)+indic5)
c11=(close>open)
IF c1 AND c2 AND c3 AND c4 and c10 and c11 THEN
    nbr=round (20000/close)
    cap=cap-(nbr*close)-5
    flag=1
ENDIF

REM Vente
if high>=indic6[1] and flag=1 then
    flag=0
    cap=cap+(nbr*indic6[1])-5
endif
IF close<indic3 and flag=1 tHEN
    flag=0
    cap=cap+(nbr*close)-5
endif
if flag=1 then
    capital=cap+(nbr*close)
else
    capital=cap
endif
return capital

 

Maintenant, je peux appliquer cet indicateur (comme critère) sur un screener.  De nouveau, on se retrouve confronté aux limites du logiciel : seules 30 valeurs sont affichées (je dois donc procéder en plusieures fois), le screener étant limité aux  254 derniéres barres, les résultats du backtest concernent ce même intervalle de temps.

 

Une vue du screener (on retrouve bien les données pour DELL, en 15ième position) :

 

hk45.gif

 

Une derniére astuce : si je souhaite connaître les signaux pour une certaine période comprise dans les 254 dernières barres, on peut faire un tri avec une boucle.  Ici, un exemple sur les 10 dernières barres (toujours avec la même stratégie) :

 

REM exemple de screener avec boucle
for i=0 to 9
    indic1 = Average[7](close)
    c1 = (indic1>indic1[1] and indic1[1]>indic1[2])
    indic2=std[20](close)
    indic3 = Average[20](close)
    c2 = (indic3>indic3[1] and indic3[1]>indic3[2])
    c10=(indic1 crosses over indic3)
    indic5 = indic3+indic2
    c3 = (close <= indic5 and close > indic3)
    indic6 = BollingerUp[20](close)
    c4 = (high <= ((indic6-indic5)*0.4)+indic5)
    c11=(close>open)
    IF c1 AND c2 AND c3 AND c4 and c10 and c11 THEN
        flag=1
    else
        flag=0
    ENDIF
         
    c15=(flag=1)
    criteria = volume
    c2=(volume>1000000)
    SCREENER[c15[i] and c2[i]] (criteria AS "volumei")
next

 

L'écran me retourne les valeurs avec un signal sur les 10 dernières barres (ça dure assez longtemps mais ça marche).  On voit que pour cette stratégie, il y en a eu très peu. 

 

hk46.gif

 

Repost 0
12 février 2008 2 12 /02 /février /2008 18:25

Backtest : existe-t-il une corrélation entre les bougies semaines et jours ?

 

La question a été posée, par exemple : pour une semaine positive, quelle chance (?) d'avoir un lundi positif également ?

 

Voici une vue du CAC avec l'indicateur, l'historigramme indique la corrélation.  Sur l'historique affiché, on a un taux de 46,222% après une semaine rouge et un taux de 43,719% après une semaine verte.

 

hk42.gif

 

Et le code de l'indicateur pour Prorealtime :

 

once ouv=open
dw=DayOfWeek
if dw<dw[1] then
    ouv1=ouv
    ouv=open
    clot=close[1]
    flag=1
else
    flag=0
endif
if clot>ouv1 and flag=1 then
    sem=1
    cc=cc+1
else
    if clot<ouv1 and flag=1 then
        sem=-1
        hh=hh+1
    else
        sem=0
    endif
endif
if flag=1 then
    cor=sem
else
    cor=0
endif
if cor=1 and close>open then
    aa=10
    bb=bb+1
endif
if cor=-1and close<open then
    aa=-10
    gg=gg+1
endif
if cor=0 then
    aa=0
endif

return  aa,(bb/cc)*100,(gg/hh)*100

 

Edit 8/12, 17h00 : afin de comparer avec les données de chrism, voici les résultats du test avec Prorealtime :

 

Le test est fait sur la première barre qui suit la semaine (donc le mardi, par exemple si le lundi est férié). 

 

Depuis le 1/1/1988 : semaine haussière => 1er jour vert à 50,439%,  semaine baissière => 1er jour vert à 55.414%.

Depuis le 1/1/2000 : semaine haussière => 1er jour vert à 46.606%,  semaine baissière => 1er jour vert à 55,959%.

Depuis le 1/1/2002 : semaine haussière => 1er jour vert à 46.377%,  semaine baissière => 1er jour vert à 54.386%. (résultats déjà donnés)

Repost 0
12 février 2008 2 12 /02 /février /2008 18:04

Copie d'un article publié originalement le 10/10/07 sur l'ancien Blog.

Black Monday : Prorealtime réécrit l'histoire !

 

Je souhaitais à j-9, parler de cette journée et pour bien me remémorer la séance, je vais faire un tour sur le graphe de Prorealtime.  Quelle ne fut pas ma surprise de voir que la chute de 508 points (22.7%) c'était transformée en baisse de 248 points (11.4%) soit la moitié !  Ce sont les vendeurs de l'époque, qui doivent être contents, ils perdent nettement moins !

 

La preuve par l'image :

 

hk40.gif

 

Et maintenant, le bon graphe :

 

hk41.gif

 

Ca fait un peu "jeu des 7 erreurs".

 

Comme de quoi, toujours vérifier ses données pour un backtest, une analyse ou un article.

 

PS : le screener sur US ne fonctionne pas pour l'instant non plus, c'est pas leur journée !

Repost 0
12 février 2008 2 12 /02 /février /2008 17:51

Exemple de l'utilisation de l'indicateur d'avantage sur Prorealtime.

 

Dans les conclusions du rapport GERARDIN de 2002, on peut lire que "la formulation du critère T1 peut être réduite à la proposition suivante : la volatilité est petite depuis 3-4 périodes et elle vient d'augmenter de 20-30% au moins".

 

Comme je ne sais pas ce qu'est une volatilité petite, je teste uniquement le critère d'augmentation  que je fixe à 30% pour cet exemple.  Néanmoins, visuellement, on peut constater que pour  avoir une augmentation de 30%, la volatilité doit être relativement basse.  On peut constater également que le signal d'augmentation de 30% intervient souvent après le T1 (en T2 ou T3).

 

Voici ce que donne l'écran pour 23 signaux avec le max d'historiques :

 

hk39.gif

On a les 3 derniers signaux et au final un rapport de : 3.942/2.2854=1.7249

 

On peut conclure que le signal brut en daily sur le CAC devrait être profitable.  Reste à tester sur d'autres valeurs, à ajouter les conditions de sorties (stop et takeprofit), faire varier les conditions du test (nombre de bougies après le signal, valeur de l'ATR, niveau du %) et affiner les conditions d'entrées.

Repost 0
11 février 2008 1 11 /02 /février /2008 20:46

Programmer sur la plateforme Prorealtime un indicateur pour le backtest.

 

C'est quoi avoir un avantage ?

 

Curtis Faith donne son point de vue : ici.

 

Voici un indicateur qui retourne le MFE et le MAE de la derniére opération divisé par l'ATR10. (1)

L'indicateur retourne également la somme des (1) divisée par le nombre d'opérations.

 

Pour connaître votre avantage, il faut faire le rapport entre les 2 sommes : h2/j et l2/j.

 

A vous d'encoder vos conditions d'entrées.

 

Vous pouvez modifier la période de l'ATR, le nombre de bougies pris en compte.

 

 

once h2=0
once l2=0
once j=0
i=i+1
//Rem : mettre les conditions d'entrées
//if xxxxxxxxxxxxx then
//   condition=-1 (pour la vente à découvert)
//else
//    if xxxxxxxxxxxxx then
//        condition=1 (pour l'achat)
//   else
//       condition=0 (on reste hors marché)
//    endif
//endif

// Rem : le calcul se fait sur la close de la bougie qui déclenche le signal

// Rem : on teste pour une période de 25 bougies

if condition<>0 and flag=0 then
    flag=1
    i=0
    entry=close
    h1=close
    l1=close
    w=AverageTrueRange[10](close)
    if condition=-1 then
        dic=-1
    else
        dic=1
    endif
else
endif
if flag=1and i>0 then
    if i<=25  then
        h1=max(h1,high)
        l1=min(l1,low)
    else
        flag=0
        mfe=h1-entry
        mae=entry-l1
        j=j+1
        if dic=-1 then
            k=mfe
            mfe=mae
            mae=k
        else
        endif
        mfe1=mfe/w
        mae1=mae/w
        h2=(h2+mfe1)
        l2=(l2+mae1)
       
    endif
endif
return mfe1,mae1,h2/j,l2/j,condition

Repost 0