Stratégie de signaux de négociation quadratique

Auteur:ChaoZhang est là., Date: 23 février 2023
Les étiquettes:

Résumé

Cette stratégie adapte une courbe quadratique aux points hauts / bas des barres pour générer des signaux de trading lorsque le prix franchit les lignes ajustées.

La logique de la stratégie

Les principales composantes et règles sont les suivantes:

  1. Adaptation de la courbe sur les points hauts/bas en utilisant la régression quadratique.

  2. Achetez le signal lorsque le rapprochement dépasse la bande supérieure.

  3. Vendez le signal lorsque la proximité dépasse la bande inférieure.

  4. N périodes de vérification pour éviter les fausses ruptures.

  5. Pas de règles de sortie fixes, optimiser les sorties par le backtesting.

La stratégie tente d'identifier les prix clés mathématiquement et de négocier les écarts, un système d'écarts typique.

Les avantages

Comparé à d'autres systèmes de fuite, les principaux avantages sont les suivants:

  1. L'adaptation mathématique est plus objective que le jugement subjectif.

  2. Approche novatrice combinant analyse technique et modèles statistiques.

  3. La vérification à plusieurs périodes permet d'éviter les fausses ruptures.

  4. Le backtesting permet d'optimiser les sorties et la période de rétention.

  5. Facile à mettre en œuvre avec des ajustements flexibles.

  6. Mise à jour automatique du modèle sans intervention manuelle.

  7. Peut tester la robustesse des paramètres sur les produits et les délais.

  8. Potentiel d'optimisation supplémentaire avec l'apprentissage automatique.

  9. Approche totalement nouvelle avec une valeur exploratoire.

Les risques

Cependant, les risques sont les suivants:

  1. Les performances de montage dépendent du réglage des paramètres, le risque de surmontage.

  2. Les lignes montées retardent, ne peuvent pas éviter complètement les pertes.

  3. Aucune confirmation de volume, risque d'être piégé.

  4. L'arbitrage statistique est un défi pour l'alpha persistant.

  5. Période limitée de test de retour, besoin de vérifier la robustesse.

  6. L'adaptabilité à plusieurs marchés nécessite une validation.

  7. La taille fixe manque d'ajustement dynamique.

  8. Il faut une évaluation stricte des rapports bénéfice/risque.

Améliorations

Sur la base de l'analyse, les améliorations peuvent inclure:

  1. Test de la robustesse des paramètres dans tous les régimes du marché.

  2. Ajouter des indicateurs de confirmation de volume.

  3. Optimiser la logique d'entrée/sortie pour des signaux de meilleure qualité.

  4. Construire des modèles de dimensionnement de position dynamique.

  5. Incorporer des arrêts pour limiter les pertes.

  6. Optimiser les stratégies de gestion des risques.

  7. Validation du test de retour de la fenêtre tournante.

  8. Évaluer la stabilité des marchés multiples.

  9. Utiliser l'apprentissage automatique pour optimiser les modèles.

Conclusion

En résumé, cette stratégie a une certaine valeur innovante et mérite d'expérimentation. Mais la viabilité à long terme de l'arbitrage statistique reste non prouvée.


/*backtest
start: 2023-08-23 00:00:00
end: 2023-09-22 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
//
// ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ //

strategy(title = " Strategy Quadratic Semaphore ",
         shorttitle = "SQS",
         overlay = true,
         precision = 8,
         calc_on_order_fills = true,
         calc_on_every_tick = true,
         backtest_fill_limits_assumption = 0,
         default_qty_type = strategy.fixed,
         default_qty_value = 2,
         initial_capital = 10000,
         pyramiding=5,
         currency = currency.USD,
         linktoseries = true)

//
// ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ //

backTestSectionFrom = input(title = "═══════════════ From ═══════════════", defval = true, type = input.bool)

FromMonth         = input(defval = 1, title = "Month", minval = 1)
FromDay           = input(defval = 1, title = "Day", minval = 1)
FromYear          = input(defval = 2019, title = "Year", minval = 2014)

backTestSectionTo = input(title = "════════════════ To ════════════════", defval = true, type = input.bool)
ToMonth           = input(defval = 31, title = "Month", minval = 1)
ToDay             = input(defval = 12, title = "Day", minval = 1)
ToYear            = input(defval = 9999, title = "Year", minval = 2014)

Config            = input(title = "══════════════ Config ══════════════", defval = true, type = input.bool)
p = input(6)
length = input(30)
//
backTestPeriod() => (time > timestamp(FromYear, FromMonth, FromDay, 00, 00)) and (time < timestamp(ToYear, ToMonth, ToDay, 23, 59))
//
//
// ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ //

x1 = bar_index
x2 = sqrt(x1)
y = high
//
S11 = sum(x2,length) - sqrt(sum(x1,length)) / length  
S12 = sum(x1*x2,length) - (sum(x1,length) * sum(x2,length)) / length  
S22 = sum(sqrt(x2),length) - sqrt(sum(x2,length)) / length            
Sy1 = sum (y*x1,length) - (sum(y,length) * sum(x1,length)) / length   
Sy2 = sum (y*x2,length) - (sum(y,length) * sum(x2,length)) / length   
//
max1 = sma(x1,length) 
max2 = sma(x2,length)
may = sma(y,length)
b2 = ((Sy1 * S22) - (Sy2*S12))/(S22*S11 - sqrt(S12))
b3 = ((Sy2 * S11) - (Sy1 * S12))/(S22 * S11 - sqrt(S12))
b1 = may - b2*max1 - b3*max2
qr = b1 + b2*x1 + b3*x2
//
yl = low
//
Sy1l = sum(yl*x1,length) - (sum(yl,length) * sum(x1,length)) / length  
Sy2l = sum(yl*x2,length) - (sum(yl,length) * sum(x2,length)) / length  
//
mayl = sma(yl,length)
b2l = ((Sy1l * S22) - (Sy2l*S12))/(S22*S11 - sqrt(S12))
b3l = ((Sy2l * S11) - (Sy1l * S12))/(S22 * S11 - sqrt(S12))
b1l = mayl - b2l*max1 - b3l*max2
qrl = b1l + b2l*x1 + b3l*x2
//
period = round(p/2)+1
hh = qr[period]
ll = qrl[period]
countH = 0
countL = 0
buy=0
sell=0
//
for i = 1 to period-1
    if qr[i]<hh
        countH:=countH+1
    if qrl[i]>ll
        countL:=countL+1

for i = period+1 to p+1
    if qr[i]<hh
        countH:=countH+1
    if qrl[i]>ll
        countL:=countL+1

if countH==p
    pivotH = high[period]
    buy := 1
    
if countL==p
    pivotL = low[period]
    sell := 1
//    
plotshape(buy == 1 , text='💣', style=shape.arrowup, location=location.belowbar, color=#32CD32, textcolor=color.white, offset=0, transp=0,size=size.auto)
plotshape(sell == 1 , text='🔨', style=shape.arrowdown, location=location.abovebar, color=#FF0000, textcolor=color.white, offset=0, transp=0,size=size.auto)
//

if (backTestPeriod())
    strategy.entry("long", true, 1, when = buy == 1)
    strategy.entry("short", false, 1, when = sell == 1) 


Plus de