Estratégia de negociação de média móvel de regressão linear

Autora:ChaoZhang, Data: 2023-10-25 10:58:02
Tags:

img

Resumo

A estratégia de negociação de média móvel de regressão linear gera sinais de compra e venda com base nos cruzamentos entre uma linha de regressão linear e a média móvel do preço das ações.

Estratégia lógica

A estratégia primeiro calcula uma linha de regressão linear de n dias e uma média móvel de m dias do preço das ações.

Quando a média móvel cruza acima da linha de regressão, ela sinaliza o fortalecimento do ímpeto de alta e gera um sinal de compra.

Especificamente, a estratégia segue as seguintes etapas para determinar os sinais comerciais:

  1. Calcular a linha de regressão linear de n dias de preços

  2. Calcular a média móvel simples de m dias da lrLine chamada lrMA

  3. Calcule a média móvel exponencial de m dias dos preços chamados ema

  4. Quando o EMA cruzar acima do IRMA, gerar sinal de compra longEntry

  5. Quando o EMA cruzar abaixo do IRMA, gerar sinal de venda longExit

  6. Só considere os sinais de compra quando o mercado estiver em alta

  7. Execução de operações com base nos sinais

Usando cruzamento entre regressão e médias móveis para determinar entradas, a estratégia pode efetivamente filtrar falhas e identificar reversões para comprar baixo e vender alto.

Vantagens

  • Combina tendência e análise de regressão para identificação precisa do sinal
  • A linha de regressão é simples de calcular e implementar
  • Utiliza filtros de mercado para evitar transacções desfavoráveis
  • Parâmetros personalizáveis para ajustar a estratégia
  • Consegue comprar baixo e vender alto para lucro

Riscos

  • Os crossovers frequentes durante a volatilidade podem gerar falsos sinais
  • Filtros de mercado imprecisos levam a entradas em tempos errados
  • Mal ajuste dos parâmetros afeta o desempenho da estratégia
  • A alta frequência de negociação leva a custos mais elevados

Os parâmetros devem ser ajustados para aumentar os períodos de média móvel e linha de regressão e reduzir a frequência de negociação. Stop-loss razoáveis devem ser implementados para controlar os riscos. Os filtros de mercado podem ser aprimorados para melhorar a precisão.

Melhorias

A estratégia pode ser otimizada em vários aspectos:

  1. Optimização da média móvel através do ensaio de diferentes tipos de MAs

  2. Optimização da linha de regressão por ajustamento do período de cálculo

  3. Optimização do filtro de mercado através do teste de diferentes indicadores

  4. Optimização de parâmetros através de backtesting rigoroso

  5. Optimização do stop loss através do teste de diferentes lógicas de stop loss

  6. Optimização dos custos através do ajustamento da frequência do comércio com base nos custos

Estas otimizações podem melhorar ainda mais a estabilidade e a rentabilidade da estratégia.

Conclusão

A estratégia de MA de regressão linear integra os pontos fortes da análise de tendências e da regressão linear para a identificação efetiva de reversão e compra de baixa venda alta. A estratégia direta é adequada para escolha de ações em horizontes de médio a longo prazo. Com ajuste de parâmetros e controle de risco, a estratégia pode alcançar uma estabilidade ainda maior.


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


Mais.