Stratégie de backtest dynamique multi-périodes


Date de création: 2023-11-21 17:07:17 Dernière modification: 2023-11-21 17:07:17
Copier: 1 Nombre de clics: 698
1
Suivre
1617
Abonnés

Stratégie de backtest dynamique multi-périodes

Aperçu

La stratégie utilise un mécanisme de rétroaction dynamique sur plusieurs périodes de temps pour déterminer la tendance des prix en comparant les prix les plus élevés et les plus bas de différentes périodes de temps, permettant un arbitrage à faible risque.

Principe de stratégie

La stratégie consiste à appeler la fonction de sécurité f_get_htfHighLow pour obtenir les prix nhigh et nlow de différentes périodes de temps. Plus précisément, la résolution de la période, le multiplicateur de la période HTFMultiplier, le paramètre de régression lookhead et gaps, ainsi que l’offset de décalage, sont définis par l’utilisateur.

Par exemple, si l’offset est égal à 0, on obtient le prix le plus élevé et le prix le plus bas de la ligne K actuelle; si l’offset est égal à 1, on obtient le prix le plus élevé et le prix le plus bas de la ligne K précédente. On juge la direction de la tendance en comparant les variations de prix entre les deux lignes K.

Si le prix le plus élevé augmente et le prix le plus bas augmente, il est jugé comme une tendance à la hausse; si le prix le plus élevé baisse et le prix le plus bas baisse, il est jugé comme une tendance à la baisse. Selon la direction de la tendance, longing ou shorting, pour réaliser des transactions à effet de levier.

Avantages stratégiques

  1. Utilisation d’analyses à plusieurs temps-frames pour améliorer la précision des jugements
  2. Appliquer un mécanisme de rétroaction dynamique pour éviter le repainting
  3. Aptitude à s’adapter à des combinaisons de paramètres différentes
  4. Ne prenez des positions que lorsque la tendance est claire et maîtrisez efficacement les risques

Risque stratégique

  1. Les jugements sur des périodes de temps multiples peuvent présenter un risque d’erreur.
  2. Une mauvaise configuration des paramètres de régression peut entraîner une repainting
  3. La fréquence des transactions peut être trop élevée, ce qui augmente les coûts de transaction et le risque de glissement

La solution est simple:

  1. Optimisation des paramètres de cycle de temps pour une meilleure précision de jugement
  2. Tester rigoureusement les paramètres de rétroaction et éviter le repainting
  3. Adaptation des conditions d’ouverture des positions et contrôle de la fréquence des transactions

Orientation de l’optimisation de la stratégie

  1. Ajout de modules d’apprentissage automatique pour tirer parti de l’IA pour juger des tendances
  2. Modification dynamique de position combinée à la volatilité des cours des actions
  3. L’adhésion à un mécanisme de coupe des pertes pour contrôler efficacement les risques de pertes

Résumer

Cette stratégie est une stratégie de négociation programmatique typique. En optimisant les paramètres et en étendant les fonctionnalités, la stabilité et la marge de profit de la stratégie peuvent être encore améliorées.

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

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © HeWhoMustNotBeNamed

//@version=4
strategy("HTF High/Low Repaint Strategy", overlay=true, initial_capital = 20000, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, commission_type = strategy.commission.percent, pyramiding = 1, commission_value = 0.01)

i_startTime = input(defval = timestamp("01 Jan 2010 00:00 +0000"), title = "Start Time", type = input.time)
i_endTime = input(defval = timestamp("01 Jan 2099 00:00 +0000"), title = "End Time", type = input.time)
inDateRange = true

resolution = input("3M", type=input.resolution)
HTFMultiplier = input(22, minval=1, step=1)
offset = input(0, minval=0, step=1)
lookahead = input(true)
gaps = false

f_secureSecurity_on_on(_symbol, _res, _src, _offset) => security(_symbol, _res, _src[_offset], lookahead = barmerge.lookahead_on, gaps=barmerge.gaps_on)
f_secureSecurity_on_off(_symbol, _res, _src, _offset) => security(_symbol, _res, _src[_offset], lookahead = barmerge.lookahead_on, gaps=barmerge.gaps_off)
f_secureSecurity_off_on(_symbol, _res, _src, _offset) => security(_symbol, _res, _src[_offset], lookahead = barmerge.lookahead_off, gaps=barmerge.gaps_on)
f_secureSecurity_off_off(_symbol, _res, _src, _offset) => security(_symbol, _res, _src[_offset], lookahead = barmerge.lookahead_off, gaps=barmerge.gaps_off)

f_multiple_resolution(HTFMultiplier) => 
    target_Res_In_Min = timeframe.multiplier * HTFMultiplier * (
      timeframe.isseconds   ? 1. / 60. :
      timeframe.isminutes   ? 1. :
      timeframe.isdaily     ? 1440. :
      timeframe.isweekly    ? 7. * 24. * 60. :
      timeframe.ismonthly   ? 30.417 * 24. * 60. : na)

    target_Res_In_Min     <= 0.0417       ? "1S"  :
      target_Res_In_Min   <= 0.167        ? "5S"  :
      target_Res_In_Min   <= 0.376        ? "15S" :
      target_Res_In_Min   <= 0.751        ? "30S" :
      target_Res_In_Min   <= 1440         ? tostring(round(target_Res_In_Min)) :
      tostring(round(min(target_Res_In_Min / 1440, 365))) + "D"

f_get_htfHighLow(resolution, HTFMultiplier, lookahead, gaps, offset)=>
    derivedResolution = resolution == ""?f_multiple_resolution(HTFMultiplier):resolution
    nhigh_on_on = f_secureSecurity_on_on(syminfo.tickerid, derivedResolution, high, offset) 
    nlow_on_on = f_secureSecurity_on_on(syminfo.tickerid, derivedResolution, low, offset)
    
    nhigh_on_off = f_secureSecurity_on_off(syminfo.tickerid, derivedResolution, high, offset) 
    nlow_on_off = f_secureSecurity_on_off(syminfo.tickerid, derivedResolution, low, offset)
    
    nhigh_off_on = f_secureSecurity_off_on(syminfo.tickerid, derivedResolution, high, offset) 
    nlow_off_on = f_secureSecurity_off_on(syminfo.tickerid, derivedResolution, low, offset)
    
    nhigh_off_off = f_secureSecurity_off_off(syminfo.tickerid, derivedResolution, high, offset) 
    nlow_off_off = f_secureSecurity_off_off(syminfo.tickerid, derivedResolution, low, offset)
    
    nhigh = lookahead and gaps ? nhigh_on_on :
             lookahead and not gaps ? nhigh_on_off :
             not lookahead and gaps ? nhigh_off_on :
             not lookahead and not gaps ? nhigh_off_off : na
    nlow = lookahead and gaps ? nlow_on_on :
             lookahead and not gaps ? nlow_on_off :
             not lookahead and gaps ? nlow_off_on :
             not lookahead and not gaps ? nlow_off_off : na
    [nhigh, nlow]
    
[nhigh, nlow] = f_get_htfHighLow(resolution, HTFMultiplier, lookahead, gaps, offset)
[nhighlast, nlowlast] = f_get_htfHighLow(resolution, HTFMultiplier, lookahead, gaps, offset+1)
plot(nhigh , title="HTF High",style=plot.style_circles, color=color.green, linewidth=1) 
plot(nlow , title="HTF Low",style=plot.style_circles, color=color.red, linewidth=1)

buyCondition = nhigh > nhighlast and nlow > nlowlast
sellCondition = nhigh < nhighlast and nlow < nlowlast

strategy.entry("Buy", strategy.long, when= buyCondition and inDateRange, oca_name="oca_buy")
strategy.entry("Sell", strategy.short, when= sellCondition and inDateRange, oca_name="oca_sell")