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.
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:
Calcular la línea de regresión lineal de precios de n días
Calcule la media móvil simple de m días de lrLine llamada lrMA
Calcular la media móvil exponencial de m días de los precios llamados ema
Cuando el EMA cruza por encima de lrMA, se genera una señal de compra larga.
Cuando el EMA cruce por debajo de lrMA, se genera una señal de venta larga
Sólo considere señales de compra cuando el mercado está alcista
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.
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.
La estrategia se puede optimizar en varios aspectos:
Optimización de la media móvil mediante pruebas de diferentes tipos de MAs
Optimización de la línea de regresión mediante ajuste del período de cálculo
Optimización del filtro de mercado mediante pruebas de diferentes indicadores
Optimización de parámetros mediante rigurosas pruebas de retroceso
Optimización de pérdida de parada mediante la prueba de diferentes lógicas de pérdida de parada
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.
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)