Bonjour,
Suite à une vidéo de TrendFrance vue sur Youtube j’ai souhaité essayer d’appliquer le critère de Kelly à mon money management sur une stratégie qui prends des positions long et short.
J’ai réussi sans problème si j’applique le Kelly indistinctement à mes prises de postions long et short. Mais cela ce complique lorsque je veux appliquer un critère de Kelly pour mes postions long et un critère de Kelly différent pour mes postions short. Sorti de la période d’étude : période pendant laquelle j’analyse la stratégie pour déterminer le critère de Kelly avant de l’appliquer, je n’ai plus de prises de positions.
On est sur l’EUR/USD en m30, je vous joins le code, si quelqu’un voit ce qui cloche…
Defparam cumulateorders = false
Once NbGainLong=0
Once NbGainShort=0
Once NBLong=0
Once NBShort=0
Capital=10000
TauxCouverture=3.33
// Variable Période d'étude avant activativation Kelly
PEtude=10
// Comptage du nombre de positions longues/courtes
T=barindex-tradeindex=0
IF LongOnMarket AND T Then
NBLong=NBLong+1
ENDIF
IF ShortOnMarket AND T Then
NBShort=NBShort+1
ENDIF
//Calculs du Rapport détaillé + Période d'étude
LongWin=Strategyprofit>Strategyprofit[1] AND LongOnMarket[1]
LongLoose=Strategyprofit<Strategyprofit[1] AND LongOnMarket[1]
ShortWin=Strategyprofit>Strategyprofit[1] AND ShortOnMarket[1]
ShortLoose=Strategyprofit<Strategyprofit[1] AND ShortOnMarket[1]
IF NBLong<=PEtude Then
nL=10
IF LongWin Then
GainLong=GainLong+Strategyprofit-Strategyprofit[1]
NbGainLong=NbGainLong+1
pLongWin=NbGainLong/NBLong
RatioLong=ABS(GainLong/PertesLong)
ENDIF
IF LongLoose Then
PertesLong=PertesLong+Strategyprofit-Strategyprofit[1]
pLongWin=NbGainLong/NBLong
RatioLong=ABS(GainLong/PertesLong)
ENDIF
ENDIF
IF NBShort<=PEtude Then
nS=10
IF ShortWin Then
GainShort=GainShort+Strategyprofit-Strategyprofit[1]
NbGainShort=NbGainShort+1
pShortWin=NbGainShort/NBShort
RatioShort=ABS(GainShort/PertesShort)
ENDIF
IF ShortLoose Then
PertesShort=PertesShort+Strategyprofit-Strategyprofit[1]
pShortWin=NbGainShort/NBShort
RatioShort=ABS(GainShort/PertesShort)
ENDIF
ENDIF
// Période Kelly
IF NBLong>PEtude Then
KellyLong=(pLongWin-(1-pLongWin)/RatioLong)
nL=(Capital/(Capital*TauxCouverture)*KellyLong)
nL=round(nL)
IF LongWin Then
GainLong=GainLong+Strategyprofit-Strategyprofit[1]
NbGainLong=NbGainLong+1
pLongWin=NbGainLong/NBLong
RatioLong=ABS(GainLong/PertesLong)
KellyLong=(pLongWin-(1-pLongWin)/RatioLong)
nL=(Capital/(Capital*TauxCouverture)*KellyLong)
nL=round(nL)
IF KellyLong <=0 Then
nL=1
ENDIF
ENDIF
IF LongLoose Then
PertesLong=PertesLong+Strategyprofit-Strategyprofit[1]
pLongWin=NbGainLong/NBLong
RatioLong=ABS(GainLong/PertesLong)
KellyLong=(pLongWin-(1-pLongWin)/RatioLong)
nL=(Capital/(Capital*TauxCouverture)*KellyLong)
nL=round(nL)
IF KellyLong <=0 Then
nL=1
ENDIF
ENDIF
ENDIF
IF NbShort>PEtude Then
pShortWin=NbGainShort/NBShort
RatioShort=ABS(GainShort/PertesShort)
KellyShort=(pShortWin-(1-pShortWin)/RatioShort)
nS=(Capital/(Capital*TauxCouverture)*KellyShort)
nS=round(nL)
IF KellyShort <=0 Then
nS=1
ENDIF
IF ShortWin Then
GainShort=GainShort+Strategyprofit-Strategyprofit[1]
NbGainShort=NbGainShort+1
ENDIF
IF ShortLoose Then
PertesShort=PertesShort+Strategyprofit-Strategyprofit[1]
ENDIF
ENDIF
// Variables Stratégie
MM=20
D=1.5
MML=60
MMC=7
BollInf = Average[MM](close)-D*std[MM](close)
BollSup = Average[MM](close)+D*std[MM](close)
// ACHAT
ca1 = close > average[MML](close)
ca2 = average[MMC](close) > average[MML](close)
ca3 = low < BollInf
IF ca1 and ca2 and ca3 THEN
buy nL shares at market
ENDIF
cv1 = close > BollSup
IF cv1 THEN
sell at market
ENDIF
// SHORT
ca1s = close < average[MML](close)
ca2s = close > BollSup
IF ca1s and ca2s THEN
sellshort nS shares at market
ENDIF
cv1s = close < BollInf
if cv1s THEN
EXITSHORT at market
ENDIF
Si il n’y a pas de position qui s’ouvre c’est sans doute parce que les variables calculées nS et nL ont une valeur non correcte pour une taille de position acceptable. Il faudrait commencer par les GRAPH, puis remonter toutes les variables de la même manière pour vérifier où le calcul se bloque. Il s’agit sans aucun doute d’un mauvais copier/coller renommage de variables quand tu as voulu séparer les 2 Kelly criterion.
Merci de votre réponse Nicolas.
J’ai fais les GRAPH de toutes les variables qui me permettent de calculer le Kelly criterion et tout semble varier correctement pendant la période d’étude. Après la période d’étude mes variables nS (nombre de lots à acheter en short) et nL (nombre de lot à acheter en long) passent à 0 alors que mes variables KellyShort et KellyLong ont bien une valeur normale et que les autres variables qui permettent de déterminer le nombre de lots à acheter ou vendre sont normales aussi.
C’est comme si il y avait un problème dès que NBShort>PEtude ou NBLong>PEtude. De plus cela ne se produit pas au même moment (sur la même barre) puisque la stratégie peut prendre plusieurs positions short ou long d’affilée et finir sa période d’étude des positions longues avant les short ou l’inverse.
J’ai fait assez peu de copié/collé dans la rédaction de cette stratégie, cela m’étonnerai que ça vienne de là. Il y a par contre à un endroit nS=round(nL). Il faut corriger par nS=round(nS).
De plus ce qui est vraiment étonnant c’est qu’il puisse y avoir une (ou plusieurs) erreur qui fait planter les 2 conditions d’entrée en position dès qu’on sort de PEtude.
Si nS et nL passent à 0 à un certain moment durant le backtest, c’est parce qu’on leurs affectent cette valeur. Essaie de supprimer les round pouvoir les valeurs réelles, c’est peut être cette instruction qui arrondi un chiffre très petit à cette valeur.