Tendencia de la transformación de Fourier de baja frecuencia siguiendo la estrategia de la media móvil

El autor:¿ Qué pasa?, fecha: 2023-12-05 14:56:06
Las etiquetas:

img

Resumen general

Esta estrategia es una estrategia de seguimiento de tendencias que utiliza la transformación de Fourier de baja frecuencia para extraer los componentes de tendencia de baja frecuencia de la serie de precios y combina tres promedios móviles (rápidos, medios y lentos) para identificar tendencias y generar señales comerciales.

Estrategia lógica

  1. Utilice la transformación de Fourier de baja frecuencia para extraer los componentes de tendencia de baja frecuencia de la serie de precios.

  2. Utilice tres promedios móviles (rápidos, medios y lentos) para juzgar las tendencias. El MA lento tiene un período de 200, el MA medio tiene un período de 20 y el MA rápido tiene un período de 5.

  3. Cuando el MA rápido cruza por encima del MA medio y el precio está por encima del MA lento, se considera que el mercado está entrando en una tendencia al alza, vaya largo.

  4. Esta es una estrategia de seguimiento de tendencias. Una vez que se identifica una tendencia, tratará de mantener la posición el mayor tiempo posible para beneficiarse de la tendencia.

Análisis de ventajas

  1. El uso de la transformación de Fourier de baja frecuencia filtra eficazmente el ruido de alta frecuencia, haciendo que las señales de tendencia identificadas sean más confiables y estables.

  2. La adopción de los MA rápidos, medios y lentos permite evaluar eficazmente la reversión de las tendencias del mercado y evitar señales falsas.

  3. Esta estrategia tiene importantes ventajas en el seguimiento de las tendencias a medio y largo plazo: una vez que se identifica una tendencia, se continuará agregando posiciones para seguir la tendencia, obteniendo así rendimientos excedentes.

  4. Esta estrategia tiene un gran espacio de optimización de parámetros. Los usuarios pueden ajustar parámetros de acuerdo con diferentes variedades y ciclos para mejorar la adaptabilidad.

Análisis de riesgos

  1. Como estrategia de seguimiento de tendencias, esta estrategia no puede determinar y reaccionar eficazmente a las inversiones de tendencia causadas por eventos repentinos, que pueden conducir a mayores pérdidas.

  2. En los mercados oscilantes, esta estrategia generará operaciones más rentables y perdedoras, pero puede ser rentable eventualmente, requiriendo cierta resistencia psicológica.

  3. Las estrategias tradicionales de seguimiento de tendencias tienden a ser "aburridas", salir de las tendencias prematuramente es un problema que esta estrategia debe resolver.

  4. Las pruebas de eventos repentinos también se pueden incluir en las pruebas de retroceso para evaluar la resistencia al riesgo de la estrategia.

Direcciones de optimización

  1. Pruebe diferentes algoritmos de promedio móvil para adaptar más variedades y ciclos.

  2. Añadir estrategias de stop loss, salida consecutiva y otras estrategias de stop loss para controlar los riesgos.

  3. Añadir indicadores de fuerza de tendencia para evitar demasiadas transacciones en mercados de tendencia oscilante y débil.

  4. Agregue modelos de aprendizaje automático para juzgar las inversiones de tendencia, haciendo que la estrategia sea algo adaptable a eventos repentinos.

Resumen de las actividades

Esta estrategia de transformación de Fourier de baja frecuencia tiene las ventajas de filtrar el ruido, identificar tendencias y rastrear tendencias. Es adecuada para la tenencia a mediano y largo plazo. Como estrategia de seguimiento de tendencias, se enfrenta principalmente a los riesgos de inversión de tendencias y oscilación sostenida. Hay estrategias de afrontamiento para estos riesgos. En general, esta estrategia tiene un gran espacio de parámetros y un alto potencial de optimización. Es adecuada para los inversores con ciertas capacidades de desarrollo de estrategias y control de riesgos para verificar en el comercio en vivo.


/*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)

Más.