Stratégie quantitative de suivi de tendance basée sur le momentum


Date de création: 2024-01-19 15:29:35 Dernière modification: 2024-01-19 15:29:35
Copier: 2 Nombre de clics: 618
1
Suivre
1617
Abonnés

Stratégie quantitative de suivi de tendance basée sur le momentum

Aperçu

Cette stratégie est basée sur la ligne d’Achille K de la mer au niveau de la ligne solaire, combinée à une analyse de la dynamique à différents niveaux de la période, afin de déterminer dynamiquement les forces de soutien derrière le cours actuel de l’action et ainsi juger du moment de la création d’une position et d’une position.

Principe de stratégie

  1. Calculer le prix de clôture de la ligne de K de l’Asie du Sud à différents niveaux cycliques. C’est la base du calcul de la dynamique ultérieure.

  2. Les variations des cours d’ouverture et de clôture des différentes périodes historiques sont calculées sur la ligne lunaire et la ligne solaire respectivement. Cela reflète l’intensité dynamique des cours actuels par rapport aux cours historiques.

  3. On prend la moyenne de la baisse de la dynamique de la ligne lunaire et de la ligne solaire, on filtre une partie du bruit et on obtient un indicateur de dynamique de la ligne lunaire et de la ligne solaire stable.

  4. En fonction de la fluctuation de la dynamique moyenne, on peut calculer la force de soutien du marché reflétée par la dynamique du cours actuel de l’action, c’est-à-dire le prix qui supprime l’effet de la fluctuation du marché. Ce prix peut être considéré comme le seuil de dynamique du prix actuel de l’action réel.

  5. Lorsque le prix de clôture est supérieur au seuil de dynamique, il est nécessaire d’augmenter la position mensuellement. Lorsque le prix de clôture est inférieur au seuil de dynamique, la position est stoppée.

Analyse des avantages

Le plus grand avantage de cette stratégie réside dans le fait qu’elle ne suit pas simplement le cours de l’action, mais calcule les forces de support réelles en fonction de la dynamique derrière le cours de l’action, ce qui permet de construire des positions et d’arrêter les pertes. Cela permet de filtrer efficacement le bruit des conditions de choc et de bloquer les opportunités de hausse stable.

De plus, les données sur lesquelles la stratégie est basée proviennent entièrement des lignes K d’Achille. Cette ligne K particulière peut en soi réduire le problème de dépendance excessive aux cycles de liaison. La stabilité de la stratégie est donc meilleure que celle des autres lignes K.

Analyse des risques

Le plus grand risque de cette stratégie réside dans le fait que le calcul de la dynamique est basé sur les prix historiques. Si les fondamentaux de la société et les conditions de marché changent de manière significative, la représentativité des prix historiques diminue, ce qui entraîne un écart dans les décisions de prise de position et de stop-loss.

De plus, les stratégies utilisent des cycles mensuels et journaliers. Cela signifie que les stratégies ne sont pas très réalistes et ne peuvent pas réagir rapidement aux changements brusques de la situation. Cela entraîne un risque de rupture de la situation.

Pour réduire ces risques, il est possible d’envisager d’introduire des données plus fréquentes et des commentaires en temps réel sur les fondamentaux de l’entreprise, ou de les accepter et d’optimiser en combinaison avec d’autres signaux de transaction plus subjectifs.

Direction d’optimisation

Il est possible de continuer à optimiser cette stratégie dans les domaines suivants:

  1. La ligne K de la côte d’Ashi peut également être optimisée, par exemple en modifiant la distribution des poids.

  2. L’ajout de plus de données sur les différentes périodes, la construction d’un système de notation de l’énergie motrice avec des moyennes de l’indice, améliorer la stabilité.

  3. L’introduction d’une fréquence plus élevée, comme les lignes de minutes par jour, pour améliorer l’actualité de la stratégie.

  4. Le calcul de la dynamique de la contrepartie est basé sur des informations telles que les annonces de résultats, les rumeurs de restructuration et les commentaires sur les fondamentaux de l’entreprise.

  5. On peut envisager d’augmenter le nombre de jours ou de semaines de stockage et d’augmenter le nombre de jours ou de semaines de stockage sur la base de la construction mensuelle.

Résumer

Cette stratégie est globalement très stable et maîtrise efficacement les risques grâce à la traçabilité de la dynamique. Son plus grand avantage réside dans l’utilisation de la dynamique derrière le prix des actions pour déterminer la situation réelle, plutôt que de simplement suivre le prix des actions. La prochaine étape consiste à introduire des données plus fréquentes et plus informatives.

Code source de la stratégie
/*backtest
start: 2023-01-12 00:00:00
end: 2024-01-18 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © FrancoPassuello

//@version=5
strategy("Heiken Ashi ADM", overlay=true)
haClose = (open + high + low + close) / 4
// prevHaOpen = line.new(na, na, na, na, width = 1)
haOpen = (open[1] + close[1]) / 2
// line.set_xy1(prevHaOpen, bar_index[1], nz(haOpen[1]))
// line.set_xy2(prevHaOpen, bar_index, haClose[1])


[monopen, _1monopen, _2monopen, _3monopen, _4monopen, _5monopen, _6monopen] = request.security(syminfo.tickerid, "M", [haOpen, haOpen[1], haOpen[2], haOpen[3], haOpen[4], haOpen[5], haOpen[6]] , barmerge.gaps_off, barmerge.lookahead_on)
[monclose, _1monclose, _3monclose, _6monclose] = request.security(syminfo.tickerid, "M", [haClose, haClose[1], haClose[3], haClose[6]] , barmerge.gaps_off, barmerge.lookahead_on)
[dayclose1, _21dayclose, _63dayclose, _126dayclose, dayclose] = request.security(syminfo.tickerid, "1D", [haClose[1], haClose[21], haClose[63], haClose[126], haClose], barmerge.gaps_off, barmerge.lookahead_on)
[dayopen1, _21dayopen, _63dayopen, _126dayopen] = request.security(syminfo.tickerid, "1D", [haOpen[1], haOpen[21], haOpen[63], haOpen[126]], barmerge.gaps_off, barmerge.lookahead_on)


get_rate_of_return(price1, price2) =>
    return_ = (price1/price2 -1)*100
    return_

m0 = get_rate_of_return(monclose, monopen)
m1 = get_rate_of_return(_1monclose, _1monopen)
m2 = get_rate_of_return(monclose, _2monopen)
m3 = get_rate_of_return(_1monclose, _3monopen)
m4 = get_rate_of_return(monclose, _4monopen)
m5 = get_rate_of_return(monclose, _5monopen)
m6 = get_rate_of_return(_1monclose, _6monopen)
MS = (m1 + m3 + m6)/100
CS = (m0 + m2 + m5)/100

d1 = get_rate_of_return(dayclose1, _21dayopen)
d2 = get_rate_of_return(dayclose1, _63dayopen)
d3 = get_rate_of_return(dayclose1, _126dayopen)
DS = (d1 + d2 + d3)/100

//Last (DAILY)
lastd_s_avg1 = DS/3

lastd_Approximate1 = dayclose1*(1-lastd_s_avg1)

last_approx1_d21 = lastd_Approximate1 / _21dayopen-1
last_approx1_d63 = lastd_Approximate1 / _63dayopen-1
last_approx1_d126 = lastd_Approximate1 / _126dayopen-1

lastd_s_avg2 = (last_approx1_d21 + last_approx1_d63 + last_approx1_d126) / 3
lastd_approximate2 = (dayclose1)*(1-(lastd_s_avg1 + lastd_s_avg2))
lastd_price = lastd_approximate2

//plot(lastd_price,color = color.rgb(255, 255, 255, 14), title = "Last momentum threshold")

//Last

last_s_avg1 = MS/3

last_Approximate1 = _1monclose*(1-last_s_avg1)

last_approx1_m1 = last_Approximate1 / _1monopen-1
last_approx1_m3 = last_Approximate1 / _3monopen-1
last_approx1_m6 = last_Approximate1 / _6monopen-1

last_s_avg2 = (last_approx1_m1 + last_approx1_m3 + last_approx1_m6) / 3
last_approximate2 = (_1monclose)*(1-(last_s_avg1 + last_s_avg2))
last_price = last_approximate2
Scoring_price = _1monclose*(1-CS)

plot(last_price,color = color.rgb(255, 255, 255, 14), title = "Last momentum threshold")
//plot(Scoring_price,color = color.rgb(234, 0, 255, 14), title = "Last momentum threshold")

//Long based on month close and being the first trade of the month.

var int lastClosedMonth = -1
limit_longCondition = _1monclose > last_approximate2 and (lastClosedMonth == -1 or month(time) != lastClosedMonth)

// Long based on day close and being the first trade of the month.
limit_Dlongcondition = dayclose1 > lastd_approximate2 and (lastClosedMonth == -1 or month(time) != lastClosedMonth)

// Close trade based on day close

DCloseLongCondition = dayclose1<lastd_approximate2

//Old standard Trading rules
longCondition = _1monclose > Scoring_price
MCloseLongCondition = _1monclose<Scoring_price
shortCondition = CS < 0

if (longCondition)
    strategy.entry("Long", strategy.long)


if (strategy.position_size > 0 and MCloseLongCondition)
    strategy.close("Long")
    lastClosedMonth := month(time)