Estrategia de negociación de media móvil de regresión lineal

El autor:¿ Qué pasa?, Fecha: 2023-10-25 10:58:02
Las etiquetas:

img

Resumen general

La estrategia de negociación del promedio móvil de regresión lineal genera señales de compra y venta basadas en los cruces entre una línea de regresión lineal y el promedio móvil del precio de las acciones.

Estrategia lógica

La estrategia primero calcula una línea de regresión lineal de n días y una media móvil de m días del precio de las acciones.

Cuando el promedio móvil cruza por encima de la línea de regresión, señala el fortalecimiento del impulso al alza y genera una señal de compra.

Específicamente, la estrategia sigue estos pasos para determinar las señales comerciales:

  1. Calcular la línea de regresión lineal de precios de n días

  2. Calcule la media móvil simple de m días de lrLine llamada lrMA

  3. Calcular la media móvil exponencial de m días de los precios llamados ema

  4. Cuando el EMA cruza por encima de lrMA, se genera una señal de compra larga.

  5. Cuando el EMA cruce por debajo de lrMA, se genera una señal de venta larga

  6. Sólo considere señales de compra cuando el mercado está alcista

  7. Ejecutar operaciones basadas en las señales

Mediante el uso de cruce entre la regresión y las medias móviles para determinar las entradas, la estrategia puede filtrar eficazmente las roturas falsas e identificar las reversiones para comprar bajo y vender alto.

Ventajas

  • Combina el análisis de tendencia y regresión para la identificación precisa de señales
  • La línea de regresión es simple de calcular e implementar
  • Utiliza el filtro de mercado para evitar operaciones desfavorables
  • Parámetros personalizables para ajustar la estrategia
  • Se consigue comprar bajo y vender alto para obtener ganancias

Los riesgos

  • Los cruces frecuentes durante la volatilidad pueden generar falsas señales
  • Los filtros de mercado inexactos conducen a entradas incorrectas
  • El mal ajuste de los parámetros afecta el rendimiento de la estrategia
  • La alta frecuencia de negociación conduce a mayores costes

Los parámetros deben ajustarse para aumentar los períodos de media móvil y línea de regresión y reducir la frecuencia de operaciones. Se deben implementar pérdidas de parada razonables para controlar los riesgos. Los filtros de mercado pueden mejorarse para mejorar la precisión.

Mejoras

La estrategia se puede optimizar en varios aspectos:

  1. Optimización de la media móvil mediante pruebas de diferentes tipos de MAs

  2. Optimización de la línea de regresión mediante ajuste del período de cálculo

  3. Optimización del filtro de mercado mediante pruebas de diferentes indicadores

  4. Optimización de parámetros mediante rigurosas pruebas de retroceso

  5. Optimización de pérdida de parada mediante la prueba de diferentes lógicas de pérdida de parada

  6. Optimización de los costes mediante el ajuste de la frecuencia del comercio en función de los costes

Estas optimizaciones pueden mejorar aún más la estabilidad y la rentabilidad de la estrategia.

Conclusión

La estrategia de MA de Regresión Lineal integra las fortalezas del análisis de tendencias y la regresión lineal para la identificación efectiva de la reversión y la compra de precios bajos. La estrategia sencilla es adecuada para la selección de acciones en horizontes de mediano a largo plazo. Con el ajuste de parámetros y el control de riesgos, la estrategia puede lograr una estabilidad aún mayor. Proporciona un marco técnico viable para el análisis de mercado.


/*backtest
start: 2022-10-18 00:00:00
end: 2023-10-24 00:00:00
period: 1d
basePeriod: 1h
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/
// © lazy_capitalist

//@version=5
strategy('Linear Regression MA', overlay=true, initial_capital=10000)
datesGroup = "Date Info"
startMonth = input.int(defval = 1,    title = "Start Month",  minval = 1, maxval = 12,  group=datesGroup)
startDay   = input.int(defval = 1,    title = "Start Day",    minval = 1, maxval = 31,  group=datesGroup)
startYear  = input.int(defval = 2022, title = "Start Year",   minval = 1970,            group=datesGroup)

averagesGroup = "Averages"
lrLineInput     = input.int(title="Linear Regression Line",   defval=55, minval = 1, group=averagesGroup)
lrMAInput       = input.int(title="Linear Regression MA",     defval=55, minval = 1, group=averagesGroup)
emaInput        = input.int(title="EMA Length",               defval=55, minval = 1, group=averagesGroup)


tradesGroup = "Execute Trades"
executeLongInput    = input.bool(title="Execute Long Trades",       defval=true)
executeShortInput   = input.bool(title="Execute Short Trades",      defval=true)
executeStopLoss     = input.bool(title="Execute Stop Loss",         defval=true)

fourHrSMAExpr       = ta.sma(close, 200)
fourHrMA            = request.security(symbol=syminfo.tickerid, timeframe="240", expression=fourHrSMAExpr)

bullish             = close > fourHrMA ? true : false


maxProfitInput              = input.float(  title="Max Profit (%)",         defval=10.0,    minval=0.0)   * 0.01
stopLossPercentageInput     = input.float(  title="Stop Loss (%)",          defval=1.75,    minval=0.0)   * 0.01

start       = timestamp(startYear, startMonth, startDay, 00, 00)            // backtest start  window
window()    => time >= start ? true : false                              // create function "within window of time"
showDate    = input(defval = true, title = "Show Date Range")

lrLine = ta.linreg(close, lrLineInput, 0)
lrMA   = ta.sma(lrLine, lrMAInput)
ema     = ta.ema(close, emaInput)

longEntry   = ema   < lrMA
longExit    = lrMA  < ema

shortEntry  = lrMA  < ema
shortExit   = ema   < lrMA


maxProfitLong   = strategy.opentrades.entry_price(0) * (1 + maxProfitInput)
maxProfitShort  = strategy.opentrades.entry_price(0) * (1 - maxProfitInput)

stopLossPriceShort  = strategy.position_avg_price * (1 + stopLossPercentageInput)
stopLossPriceLong   = strategy.position_avg_price * (1 - stopLossPercentageInput)

if(executeLongInput and bullish)
    strategy.entry( id="long_entry", direction=strategy.long,   when=longEntry and window(),    qty=10,  comment="long_entry")
    strategy.close( id="long_entry", when=longExit,     comment="long_exit")
    // strategy.close( id="long_entry", when=maxProfitLong <= close, comment="long_exit_mp")
    
if(executeShortInput and not bullish)
    strategy.entry( id="short_entry", direction=strategy.short,   when=shortEntry and window(),    qty=10,  comment="short_entry")
    strategy.close( id="short_entry", when=shortExit,     comment="short_exit")
    // strategy.close( id="short_entry", when=maxProfitShort <= close, comment="short_exit_mp")

if(strategy.position_size > 0 and executeStopLoss)
    strategy.exit(  id="long_entry",        stop=stopLossPriceLong,             comment="exit_long_SL")
    strategy.exit(  id="short_entry",       stop=stopLossPriceShort,            comment="exit_short_SL")
    
// plot(series=lrLine,     color=color.green)
plot(series=lrMA,       color=color.red)
plot(series=ema,        color=color.blue)


Más.