Estrategia de ruptura del canal de media móvil adaptativa

El autor:¿ Qué pasa?, Fecha: 2023-11-02 15:05:56
Las etiquetas:

img

Resumen general

La estrategia de ruptura de canal de promedio móvil adaptativo es una estrategia de ruptura de tendencia basada en el promedio móvil adaptativo (AMA) y un rango de canal adaptativo para generar señales comerciales.

Principio de la estrategia

El indicador central de esta estrategia es el Adaptive Moving Average (AMA), que se utiliza para capturar la tendencia del precio.

El valor de las emisiones de gases de efecto invernadero es el valor de las emisiones de gases de efecto invernadero.

donde P (t) es el precio actual y α (t) es la constante de suavizado entre 0 y 1. α (t) se ajusta dinámicamente de acuerdo con ciertas reglas para controlar la sensibilidad de la AMA a los cambios de precio.

Las emisiones de gases de efecto invernadero se calcularán en función de las emisiones de gases de efecto invernadero.

Por lo tanto, a medida que aumentan las fluctuaciones de precios, α ((t) aumentará para hacer que el AMA sea más sensible; cuando las fluctuaciones disminuyen, α ((t) disminuirá para hacer que el AMA sea más suave.

Basada en el AMA, la estrategia construye un rango de canal adaptativo para detectar señales de ruptura de precios.

En la parte superior: H (t) = (1 + β*H (t-1)) * AMA (t)

En la parte inferior: L (t) = (1 - β*L (t-1)) * AMA (t)

Por último, la estrategia genera transacciones basadas en las rupturas de precios de los niveles del canal:

  • Entra largo cuando el precio se rompe por encima del nivel superior.

  • Entrar corto cuando el precio se rompe por debajo del nivel inferior.

  • De lo contrario, mantente en el piso.

Análisis de ventajas

Las ventajas de esta estrategia incluyen:

  1. El AMA es más flexible para capturar las tendencias de precios en comparación con las medias móviles simples, especialmente en mercados volátiles.

  2. El canal adaptativo puede ajustar dinámicamente su ancho, expandiéndose cuando la tendencia no está clara y estrechándose cuando surge una tendencia.

  3. Las señales de ruptura de precios pueden capturar oportunamente la tendencia comienza con tasas de ganancia más altas.

  4. La lógica es simple y clara, fácil de entender y automatizar para el comercio cuantitativo.

Análisis de riesgos

Los riesgos de esta estrategia incluyen:

  1. Los parámetros de AMA incorrectos pueden pasar por alto las tendencias de los precios o generar señales falsas.

  2. Los parámetros del canal adaptativo como β necesitan una puesta a punto cuidadosa, de lo contrario puede ocurrir demasiado whipsaw o tendencias perdidas.

  3. Las rupturas de precios son susceptibles a falsas rupturas, lo que requiere más filtros.

  4. La estrategia no incluye mecanismos de gestión de riesgos ni de stop loss.

Direcciones de optimización

La estrategia se puede optimizar mediante:

  1. Mejorar el cálculo α para hacer que el AMA sea más sensible.

  2. Añadir más confirmación después de los primeros brotes para evitar señales falsas.

  3. Aplicar filtros como volumen o volatilidad para validar la validez de la ruptura.

  4. Incorporación de un stop loss para bloquear las ganancias y controlar el riesgo.

  5. Optimización del tamaño de las posiciones para diferentes clases de activos.

Conclusión

En resumen, la Estrategia de ruptura de canal de promedio móvil adaptativo es una estrategia de ruptura de tendencia simple y práctica. Utiliza el AMA flexible para rastrear las tendencias de precios y un canal adaptativo para detectar señales de ruptura. La estrategia tiene algunas ventajas, pero también riesgos potenciales.


/*backtest
start: 2022-10-26 00:00:00
end: 2023-11-01 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4

// CryptoStatistical - 2019
// AMA Strategy Channel Breakout Strategy from E. Durenard - Professional Automated Trading 
// https://www.amazon.com/Professional-Automated-Trading-Theory-Practice/dp/1118129857

strategy(title="[CS] AMA Strategy - Channel Break Out", shorttitle="AMA_ChannelBreakout_Strategy", initial_capital = 1000, overlay=true, pyramiding = 0, calc_on_every_tick=false, calc_on_order_fills=false, commission_type= strategy.commission.percent, commission_value = 0.08, currency=currency.USD)
testStartYear = input(2019, "Backtest Start Year")
testStartMonth = input(6, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0)

testStopYear = input(2019, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,0,0)

testPeriodBackground = input(title="Color Background?", type=input.bool, defval=true)
testPeriodBackgroundColor = testPeriodBackground and (time >= testPeriodStart) and (time <= testPeriodStop) ? #00FF00 : na
bgcolor(testPeriodBackgroundColor, transp=95)

testPeriod() =>  true

price = input(title='Price Source:', type=input.source, defval=close)

ama = price
hb = price
lb = price

// Static model parameters
minfactor = 0.
maxfactor = 1.
deviation_max = 1.
deviation_min = 1.
beta_hb = 1.
beta_lb = 1.
snr = 1.

normalized_atan= 0.
alpha = 0.5
// Suggested snr-factor from .5 upto 3.1 by .3 to find best parameter
snrfactor = input(title='SNR Factor:', type=input.float, minval=0.6, maxval=3.3, step=0.3, defval=2.1)

// Sensitivity Lookback search for the best perdiod from 5 to 20
lookback = input(title='Sensitivity Lookback:', type=input.integer, defval=5)

// Suggested Beta from .5 below 4.5 by .3, usually in the range 1.2, 1.5
beta = input(title='Beta:', type=input.float, minval=0.6, maxval=4.5, step=0.3, defval=2.1)

offsetlabel = input(title='Offset Label:', type=input.float, minval=0.001, maxval=0.03, step=0.001, defval=0.001)

// pi/2
pi2 = 1.5707963267948966

// Zero-lag resampled moving average (Durschner nwma)
f_nwma(_src, _period) =>
    fast = _period/2
    lambda = _period/fast
    alpha = lambda * (_period - 1)/(_period - lambda)
    average1 = wma(_src,_period)
    average2 = wma(average1,fast)
    nwma = (1+alpha)*average1 - alpha*average2

ama := alpha[1]*price + (1-alpha[1])*nz(ama[1])

deviation_max := alpha[1]*max((price[0] - price[1])/price[1],0) + (1-alpha[1])*nz(deviation_max[1])
deviation_min := -alpha[1]*min((price[0] - price[1])/price[1],0) + (1-alpha[1])*nz(deviation_min[1])

beta_hb := beta*deviation_max
beta_lb := beta*deviation_min
hb := (1 + beta_hb[1])*ama
lb := (1 - beta_lb[1])*ama

snr := if price > hb
    ((price - ama[1])/ama[1])/beta_lb
else
    if price < lb
        -((price - ama[1])/ama[1])/beta_hb
    else
        0

normalized_atan := (atan(snrfactor*snr) + pi2)/(2*pi2)
alpha := f_nwma(minfactor + (maxfactor - minfactor)*normalized_atan, lookback)

plot(ama, color=color.black)
plot(hb, color=color.green)
plot(lb, color=color.red)

// Buy Condition Var
bc = false
// Sell Condition Var
sc = false
d = color.black

// Buy Condition
if(price > hb)
    bc := true
    d := color.green

// Sell Condition
if(price < lb)
    sc := true
    d := color.red

if(testPeriod())
    strategy.entry("Long", strategy.long, when = bc)
    strategy.entry("Short", strategy.short, when = sc)

alertcondition(bc, title='BuyCondition', message='Buy')
alertcondition(sc, title='SellCondition', message='Sell')

plotshape(title='Buy', series=bc ? price * (1 - offsetlabel) : na, text='A1B', style=shape.labelup, location=location.absolute, color=d, textcolor=color.white, offset=0)
plotshape(title='Sell', series=sc ? price  * (1 + offsetlabel) : na, text='A1S', style=shape.labeldown, location=location.absolute, color=d, textcolor=color.white, offset=0)

Más.