Tendance de la transformation de Fourier à basse fréquence suivant la stratégie des moyennes mobiles

Auteur:ChaoZhang est là., Date: 2023-12-05 14:56:06 Je vous en prie.
Les étiquettes:

img

Résumé

Cette stratégie est une stratégie de suivi de tendance qui utilise la transformation de Fourier à basse fréquence pour extraire les composantes de tendance à basse fréquence de la série de prix et combine trois moyennes mobiles (rapide, moyen et lent) pour identifier les tendances et générer des signaux de trading.

La logique de la stratégie

  1. Utilisez la transformation de Fourier basse fréquence pour extraire les composantes de tendance basse fréquence de la série de prix.

  2. Utilisez trois moyennes mobiles (rapide, moyen et lent) pour juger des tendances. Le MA lent a une période de 200, le MA moyen a une période de 20 et le MA rapide a une période de 5. Le MA lent filtre le bruit, le MA moyen capte les inversions de tendance et le MA rapide génère des signaux de trading.

  3. Lorsque le MA rapide dépasse le MA moyen et que le prix est supérieur au MA lent, le marché est jugé entrer dans une tendance à la hausse, aller long.

  4. Il s'agit d'une stratégie de suivi de tendance. Une fois qu'une tendance est identifiée, il tentera de maintenir la position aussi longtemps que possible pour en tirer profit.

Analyse des avantages

  1. L'utilisation de la transformation de Fourier à basse fréquence filtre efficacement le bruit à haute fréquence, rendant les signaux de tendance identifiés plus fiables et stables.

  2. L'adoption d'AM rapides, moyens et lents permet de juger efficacement de l'inversion des tendances du marché et d'éviter les faux signaux.

  3. Cette stratégie présente des avantages importants pour le suivi des tendances à moyen et long terme: une fois qu'une tendance est identifiée, elle continuera à ajouter des positions pour suivre la tendance, obtenant ainsi des rendements excédentaires.

  4. Cette stratégie a un grand espace d'optimisation des paramètres. Les utilisateurs peuvent ajuster les paramètres en fonction de différentes variétés et cycles pour améliorer l'adaptabilité.

Analyse des risques

  1. En tant que stratégie de suivi des tendances, cette stratégie ne peut déterminer et réagir efficacement aux renversements de tendance causés par des événements soudains, qui peuvent entraîner une augmentation des pertes.

  2. Dans les marchés oscillants, cette stratégie générera plus de profits et de pertes, mais elle peut toujours être rentable à terme, nécessitant une certaine endurance psychologique.

  3. Les stratégies traditionnelles de suivi des tendances ont tendance à s'affaiblir, la sortie prématurée des tendances est un problème que cette stratégie doit résoudre.

  4. Les tests d'événement soudain peuvent également être inclus dans le backtesting pour évaluer la résistance au risque de la stratégie.

Directions d'optimisation

  1. Essayez différents algorithmes de moyenne mobile pour adapter plus de variétés et de cycles.

  2. Ajouter des stratégies de stop loss, de sortie de stop loss consécutives et autres stratégies de stop loss pour contrôler les risques.

  3. Ajoutez des indicateurs de force de tendance pour éviter de trop nombreuses transactions sur des marchés à tendance oscillante ou faible.

  4. Ajoutez des modèles d'apprentissage automatique pour juger des renversements de tendance, ce qui rend la stratégie un peu adaptable aux événements soudains.

Résumé

Cette stratégie de transformation de Fourier à basse fréquence qui suit la moyenne mobile présente les avantages de filtrer le bruit, d'identifier les tendances et de suivre les tendances. Elle convient à la détention à moyen et à long terme. En tant que stratégie de suivi de tendance, elle fait principalement face aux risques d'inversion de tendance et d'oscillation soutenue. Il existe des stratégies d'adaptation à ces risques. En général, cette stratégie a un grand espace de paramètres et un potentiel d'optimisation élevé.


/*backtest
start: 2023-11-27 00:00:00
end: 2023-11-29 02:00:00
period: 1m
basePeriod: 1m
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/
// © 03.freeman

//@version=4
strategy("FTSMA", overlay=true )
src=input(close,"Source")
slowMA=input(200,"Slow MA period")
mediumMA=input(20,"Mid MA period")
fastMA=input(5,"Fast MA period")
plotSMA=input(true,"Use MA")
sin1=input(1,"First sinusoid",minval=1)
sin2=input(2,"Second sinusoid",minval=1)
sin3=input(3,"Third sinusoid",minval=1)
smoothinput = input('EMA', title = "MA Type", options =['EMA', 'SMA', 'ALMA','FRAMA','RMA', 'SWMA', 'VWMA','WMA','LinearRegression'])
linearReg=input(false, "Use linear regression?")
linregLenght=input(13, "Linear regression lenght")
linregOffset=input(0, "Linear regression offset")

//------FRAMA ma---------
ma(src, len) =>
    float result = 0
    int len1 = len/2
    frama_SC=200
    frama_FC=1
    e = 2.7182818284590452353602874713527
    w = log(2/(frama_SC+1)) / log(e) // Natural logarithm (ln(2/(SC+1))) workaround
    H1 = highest(high,len1)
    L1 = lowest(low,len1)
    N1 = (H1-L1)/len1
    H2_ = highest(high,len1)
    H2 = H2_[len1]
    L2_ = lowest(low,len1)
    L2 = L2_[len1]
    N2 = (H2-L2)/len1
    H3 = highest(high,len)
    L3 = lowest(low,len)
    N3 = (H3-L3)/len
    dimen1 = (log(N1+N2)-log(N3))/log(2)
    dimen = iff(N1>0 and N2>0 and N3>0,dimen1,nz(dimen1[1]))
    alpha1 = exp(w*(dimen-1))
    oldalpha = alpha1>1?1:(alpha1<0.01?0.01:alpha1)
    oldN = (2-oldalpha)/oldalpha
    N = (((frama_SC-frama_FC)*(oldN-1))/(frama_SC-1))+frama_FC
    alpha_ = 2/(N+1)
    alpha = alpha_<2/(frama_SC+1)?2/(frama_SC+1):(alpha_>1?1:alpha_)
    frama = 0.0
    frama :=(1-alpha)*nz(frama[1]) + alpha*src
    result := frama
    result

// ----------MA calculation - ChartArt and modified by 03.freeman-------------
calc_ma(src,l) => 
    _ma = smoothinput=='SMA'?sma(src, l):smoothinput=='EMA'?ema(src, l):smoothinput=='WMA'?wma(src, l):smoothinput=='LinearRegression'?linreg(src, l,0):smoothinput=='VWMA'?vwma(src,l):smoothinput=='RMA'?rma(src, l):smoothinput=='ALMA'?alma(src,l,0.85,6):smoothinput=='SWMA'?swma(src):smoothinput=='FRAMA'?ma(sma(src,1),l):na
    
//----------------------------------------------


//pi = acos(-1)
// Approximation of Pi in _n terms --- thanks to e2e4mfck
f_pi(_n) =>
    _a = 1. / (4. * _n + 2)
    _b = 1. / (6. * _n + 3)
    _pi = 0.
    for _i = _n - 1 to 0
        _a := 1 / (4. * _i + 2) - _a / 4.
        _b := 1 / (6. * _i + 3) - _b / 9.
    _pi := (4. * _a) + (4. * _b) - _pi
pi=f_pi(20)

//---Thanks to xyse----https://www.tradingview.com/script/UTPOoabQ-Low-Frequency-Fourier-Transform/
//Declaration of user-defined variables
N = input(defval=64, title="Lookback Period", type=input.integer, minval=2, maxval=600, confirm=false, step=1, options=[2,4,8,16,32,64,128,256,512,1024,2048,4096])

//Real part of the Frequency Domain Representation
ReX(k) =>
    sum = 0.0
    for i=0 to N-1
        sum := sum + src[i]*cos(2*pi*k*i/N)
    return = sum
    
//Imaginary part of the Frequency Domain Representation
ImX(k) =>
    sum = 0.0
    for i=0 to N-1
        sum := sum + src[i]*sin(2*pi*k*i/N)
    return = -sum

//Get sinusoidal amplitude from frequency domain  
ReX_(k) =>
    case = 0.0
    if(k!=0 and k!=N/2)
        case := 2*ReX(k)/N
    if(k==0)
        case := ReX(k)/N
    if(k==N/2)
        case := ReX(k)/N
    return = case
    
 //Get sinusoidal amplitude from frequency domain  
ImX_(k) =>
    return = -2*ImX(k)/N
    
//Get full Fourier Transform
x(i, N) =>
    sum1 = 0.0
    sum2 = 0.0
    for k=0 to N/2
        sum1 := sum1 + ReX_(k)*cos(2*pi*k*i/N)
    for k=0 to N/2
        sum2 := sum2 + ImX_(k)*sin(2*pi*k*i/N)
    return = sum1+sum2
    
//Get single constituent sinusoid
sx(i, k) =>
    sum1 = ReX_(k)*cos(2*pi*k*i/N)
    sum2 = ImX_(k)*sin(2*pi*k*i/N)
    return = sum1+sum2
//Calculations for strategy
SLOWMA = plotSMA?calc_ma(close+sx(0,sin1),slowMA):close+sx(0,sin1)
MEDMA = plotSMA?calc_ma(close+sx(0,sin2),mediumMA):close+sx(0,sin2)
FASTMA = plotSMA?calc_ma(close+sx(0,sin3),fastMA):close+sx(0,sin3)

SLOWMA := linearReg?linreg(SLOWMA,linregLenght,linregOffset):SLOWMA
MEDMA := linearReg?linreg(MEDMA,linregLenght,linregOffset):MEDMA
FASTMA := linearReg?linreg(FASTMA,linregLenght,linregOffset):FASTMA

//Plot 3 Low-Freq Sinusoids
plot(SLOWMA, color=color.green)
plot(MEDMA, color=color.red)
plot(FASTMA, color=color.blue)

//  Strategy: (Thanks to JayRogers)
// === STRATEGY RELATED INPUTS ===
// the risk management inputs
inpTakeProfit   = input(defval = 0, title = "Take Profit Points", minval = 0)
inpStopLoss     = input(defval = 0, title = "Stop Loss Points", minval = 0)
inpTrailStop    = input(defval = 0, title = "Trailing Stop Loss Points", minval = 0)
inpTrailOffset  = input(defval = 0, title = "Trailing Stop Loss Offset Points", minval = 0)

// === RISK MANAGEMENT VALUE PREP ===
// if an input is less than 1, assuming not wanted so we assign 'na' value to disable it.
useTakeProfit   = inpTakeProfit  >= 1 ? inpTakeProfit  : na
useStopLoss     = inpStopLoss    >= 1 ? inpStopLoss    : na
useTrailStop    = inpTrailStop   >= 1 ? inpTrailStop   : na
useTrailOffset  = inpTrailOffset >= 1 ? inpTrailOffset : na

longCondition = FASTMA>MEDMA and close > SLOWMA             //crossover(FASTMA, MEDMA) and close > SLOWMA
if (longCondition)
    strategy.entry("Long Entry", strategy.long)

shortCondition = FASTMA<MEDMA and close < SLOWMA            //crossunder(FASTMA, MEDMA) and close < SLOWMA
if (shortCondition)
    strategy.entry("Short Entry", strategy.short)

// === STRATEGY RISK MANAGEMENT EXECUTION ===
// finally, make use of all the earlier values we got prepped
strategy.exit("Exit Buy", from_entry = "Long Entry", profit = useTakeProfit, loss = useStopLoss, trail_points = useTrailStop, trail_offset = useTrailOffset)
strategy.exit("Exit Sell", from_entry = "Short Entry", profit = useTakeProfit, loss = useStopLoss, trail_points = useTrailStop, trail_offset = useTrailOffset)

Plus de