Stratégie d'arbitrage de moyenne mobile régularisée adaptative

Auteur:ChaoZhang est là., Date: 2023-11-16 16:20:11
Les étiquettes:

img

Résumé

Cette stratégie met en œuvre le trading d'arbitrage entre différents marchés en calculant une ligne moyenne mobile régulière adaptative.

Principe de stratégie

La stratégie définit d'abord une fonction scaleMinimax pour normaliser les séries temporelles à une plage spécifiée.

  1. Définir une fenêtre coulissante, longueur par défaut 5 jours.

  2. La valeur sig pour chaque jour est la moyenne pondérée de la valeur sig précédente et du prix de clôture actuel.

  3. Ajoutez un paramètre λ comme régularisateur pour rendre la transition sig plus lisse.

Après avoir obtenu la ligne de signal, la stratégie détermine long/short en fonction de la croix dorée/mort de la ligne de signal et du prix.

  1. Quand le SIG dépasse le prix, allez long.

  2. Quand le SIG dépasse le prix, passez court.

En outre, la stratégie ajoute le facteur lisse et la ligne d'affichage comme paramètres réglables pour augmenter la flexibilité.

Analyse des avantages

Cette stratégie présente les avantages suivants par rapport aux stratégies de moyenne mobile traditionnelles:

  1. Le mécanisme de pondération adaptative peut répondre plus rapidement aux variations de prix.

  2. Le régularisateur ajouté rend la ligne de signal plus lisse, évitant de faux signaux de fluctuations drastiques des prix.

  3. L'arbitrage intermarché peut tirer profit des différences de prix entre les marchés.

  4. Des paramètres réglables flexibles peuvent être optimisés en fonction des conditions du marché.

Risques et solutions

La stratégie comporte également certains risques:

  1. La solution consiste à régler correctement le paramètre lisse pour éviter les oscillations de la ligne de signal.

  2. L'arbitrage intermarché exige que les deux marchés aient une corrélation de prix et des tendances cohérentes.

  3. L'optimisation des paramètres nécessite suffisamment de données historiques pour le backtesting.

Directions d'optimisation

La stratégie peut également être optimisée dans les aspects suivants:

  1. Dans la sélection de paramètres, des algorithmes d'apprentissage automatique peuvent être introduits pour optimiser automatiquement les combinaisons de paramètres.

  2. Dans la génération de signaux, plus d'indicateurs peuvent être introduits pour construire des signaux de trading plus stables.

  3. Dans le contrôle des risques, le stop loss peut être réglé pour limiter la perte par transaction.

  4. Dans le cas de l'arbitrage transfrontalier, il peut être étendu à des actifs commerciaux plus fortement corrélés.

Résumé

Cette stratégie implémente le trading d'arbitrage entre les marchés en calculant de manière adaptative les moyennes mobiles. Par rapport aux stratégies de moyennes mobiles traditionnelles, elle présente les avantages de paramètres adaptatifs, de traitement fluide, d'arbitrage entre les marchés, etc. Les prochaines étapes consistent à optimiser davantage la stratégie grâce à l'apprentissage automatique, aux signaux combinés, à la gestion des risques, etc.


/*backtest
start: 2023-10-01 00:00:00
end: 2023-10-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
strategy("Crossover82%", overlay=true)

//
// Functions
//
scaleMinimax(X, p, min, max) => 
    hi = highest(X, p), lo = lowest(X, p)
    (max - min) * (X - lo)/(hi - lo) + min

rema(ts, p) => // regularized ma
    rm = 0.0, lambda = .5, a = 2 / (p + 1)
    rm := (nz(rm[1]) + a * (ts - nz(rm[1])) + lambda * (2 * nz(rm[1]) - nz(rm[2]))) / (lambda + 1)
    rm
    
//
// Inputs
//
X = input(close, title="Data source")
smooth = input(2, title="REMA smooth factor")
show_line = input(true, title="Show signal line")

//
// Main
//
p = 5
sig = rema(scaleMinimax(pow(X*p,-X) - 0.1, 100, lowest(X, 100), highest(X, 100)), smooth)

plot(show_line ? sig : na, linewidth=1)
plot(cross(sig, X) ? ohlc4 : na, style=circles, linewidth=8, color=blue, transp=50)

longCondition = crossover(sig, X)
if (longCondition)
    strategy.entry("LE", strategy.long)

shortCondition = crossunder(sig, X)
if (shortCondition)
    strategy.entry("SE", strategy.short)



Plus de