Stratégie de suivi des tendances basée sur le filtre Kalman

Auteur:ChaoZhang est là.
Les étiquettes:

img

Résumé

Principe de stratégie

La logique de base de cette stratégie comprend principalement les étapes suivantes:

  1. Calculer la moyenne mobile simple (SMA) du prix d'une minute comme moyenne mobile initiale;

  2. Calculer l'angle de tangence de la moyenne mobile lissée;

  3. Définir la période paramétrique et additionner statistiquement les angles tangents dans la période;

  4. Générer un signal d'achat lorsque la somme des angles tangents dans la période est supérieure à 360 degrés; générer un signal de vente lorsque celui-ci est inférieur à -360 degrés.

Avec cette conception, lorsque le prix montre une tendance à la hausse ou à la baisse, l'angle de tangence de la moyenne mobile s'accumule progressivement.

Dans cette stratégie, la SMA du prix peut être considérée comme la mesure de l'état. Affecté par le bruit du marché, le filtre Kalman estimera de manière récursive la véritable tendance des prix, réduira considérablement l'impact du bruit, rendra le calcul de la moyenne mobile ultérieure plus fiable et produira ainsi des signaux de trading plus stables et précis.

Analyse des avantages

  1. Le filtrage Kalman filtre efficacement de nombreux faux signaux causés par des fluctuations aléatoires en estimant et en éliminant le bruit de manière adaptative, ce qui rend les signaux de trading générés plus fiables.

  2. Paramètres réglables flexibles: les paramètres réglables comprennent la longueur de la moyenne mobile, les paramètres du filtre Kalman et le cycle statistique, qui peuvent s'adapter de manière flexible à différents environnements de marché.

  3. Facile à mettre en œuvre et à étendre. L'algorithme de base de cette stratégie est assez concis et facile à mettre en œuvre et à tester. Il offre également une marge d'expansion, comme l'introduction d'algorithmes d'apprentissage automatique pour optimiser automatiquement les paramètres.

Analyse des risques

Les principaux risques de cette stratégie comprennent également:

  1. Risque d'inversion de tendance. Cette stratégie se concentre sur le suivi de la tendance. En cas d'inversion de tendance brusque, cela entraînera de plus grandes pertes. Cela peut être atténué en raccourcissant de manière appropriée le cycle statistique pour réduire les pertes par transaction.

  2. Risque d'optimisation excessive. Une optimisation excessive des données historiques peut également entraîner des paramètres inefficaces. La validité hors échantillon doit être contrôlée.

Directions d'optimisation

  1. Optimisation automatique des paramètres. Les algorithmes d'optimisation par apprentissage automatique peuvent réaliser une optimisation automatique des paramètres pour éviter les risques d'optimisation excessive.

  2. Améliorer l'évaluation de l'efficacité: introduire davantage de mesures adaptées au risque pour évaluer l'efficacité et la stabilité des stratégies afin d'obtenir une conclusion plus complète et plus précise.

  3. Si elle est efficace, elle peut être considérée comme étendue à plus de produits. À moyen et long terme, elle accumule des échantillons plus riches et facilite l'optimisation des paramètres croisés.

Conclusion


/*backtest
start: 2024-01-17 00:00:00
end: 2024-01-24 00:00:00
period: 15m
basePeriod: 5m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
//@library=math
strategy("策略360°(测试)", overlay=true)

// 定义1分钟均线
ma1 = request.security(syminfo.tickerid, "1", ta.sma(close, 1)) // 在这里使用了 math.sma() 函数
//plot(ma1, color=color.yellow, title="原始均线")

// 定义卡尔曼滤波函数,参考了[1](https://www.tradingview.com/pine-script-docs/en/v5/language/Methods.html)和[2](https://www.tradingview.com/pine-script-docs/en/v5/language/Operators.html)的代码
kalman(x, g) => 
    kf = 0.0 
    dk = x - nz(kf[1], x) // 在这里使用了 nz() 函数
    smooth = nz(kf[1], x) + dk * math.sqrt(g * 2) // 在这里使用了 math.sqrt() 函数
    velo = 0.0 
    velo := nz(velo[1], 0) + g * dk // 在这里使用了 nz() 函数
    kf := smooth + velo 
    kf 

// 定义卡尔曼滤波后的均线
ma2 = kalman(ma1, 0.01) 
plot(ma2, color=color.blue, title="卡尔曼滤波后的均线")

// 定义切线角
angle = math.todegrees(math.atan(ma2 - ma2[1])) // 在这里使用了 math.degrees() 和 math.atan() 函数

// 定义累加的切线角
cum_angle = 0.0
cum_angle := nz(cum_angle[1], 0) + angle // 在这里使用了 nz() 函数

// 定义30分钟周期
period = 30 // 您可以根据您的需要修改这个参数

// 定义周期内的切线角总和
sum_angle = 0.0
sum_angle := math.sum(angle, period) // 在这里使用了 math.sum() 函数,把周期内的切线角总和改成简单地把 5 个切线角相加

// 定义买入和卖出条件
buy = sum_angle > 360// 在这里使用了 math.radians() 函数
sell = sum_angle < -360

// 执行买入和卖出操作
strategy.entry("Long", strategy.long, when=buy)
strategy.close("Short", when=buy)
strategy.entry("Short", strategy.short, when=sell)
strategy.close("Long", when=sell)

// 绘制曲线图
plot(sum_angle, color=color.green, title="周期内的切线角总和")
plot(angle, color=color.red, title="切线角") // 这是我为您添加的代码,用于显示实时计算的切线角


Plus de