Tendência de adaptação após a estratégia

Autora:ChaoZhang, Data: 2024-01-15 14:20:32
Tags:

img

Resumo

A estratégia de seguimento de tendência adaptativa é uma estratégia de negociação quantitativa que combina Bandas de Bollinger e indicadores de média móvel para ajustar dinamicamente o fator de força da tendência e alcançar a tendência de seguir e parar de perder. Esta estratégia usa Bandas de Bollinger para calcular a volatilidade dos preços e, assim, calcula dinamicamente uma força de tendência razoável.

Princípios de estratégia

O indicador central desta estratégia é Bollinger Bands. Bollinger Bands consiste de uma faixa média, uma faixa superior e uma faixa inferior. A faixa média é a média móvel simples de n dias, a faixa superior é a faixa média + k vezes o desvio padrão de n dias, e a faixa inferior é a faixa média - k vezes o desvio padrão de n dias. Aqui selecionamos a faixa média de 20 dias e 2 vezes o desvio padrão para construir as Bollinger Bands.

Em seguida, calculamos a largura de banda (banda superior - banda inferior) sobre a relação da banda média, referida como o fator de força. Esta relação reflete a volatilidade atual do mercado e a força da tendência.

Com um fator de força razoável, combinado com o indicador ATR, as bandas superior e inferior se movem para cima e para baixo por distância de fator de força ATR *, respectivamente, para formar um canal de tendência adaptativo.

Além disso, a estratégia também define um mecanismo de stop loss. Após a formação de uma posição longa, se o preço cair abaixo do ponto mais baixo quando a posição foi aberta, a saída stop loss; o mesmo para posições curtas.

Vantagens da estratégia

Esta estratégia tem as seguintes vantagens:

  1. Alta adaptabilidade: a forma como o fator de força é calculado permite que a estratégia ajuste dinamicamente a largura do canal com base na volatilidade do mercado, ampliando o canal em uma tendência de mercado de alta e estreitando o canal em um mercado oscilante para alcançar a auto-adaptação a diferentes tipos de mercados.

  2. Frequência de operação moderada: em comparação com as estratégias de média móvel simples, as estratégias de Bollinger Bands ajustam os canais com menos frequência, evitando abertura e fechamento desnecessariamente frequentes de posições.

  3. A ruptura dos trilhos superior e inferior pode efetivamente filtrar o ruído do mercado e garantir uma alta probabilidade de capturar a abertura das tendências.

  4. Mecanismo de stop loss. O método de stop loss embutido pode efetivamente controlar a perda única, o que é uma grande vantagem desta estratégia.

Riscos estratégicos

Esta estratégia tem também alguns riscos:

  1. O período n e o multiplicador k das Bandas de Bollinger têm uma grande influência nos resultados, exigindo testes repetidos para encontrar a combinação ideal de parâmetros.

  2. Incapacidade de rastrear tendências quando as Bandas de Bollinger divergem. Quando os preços flutuam violentamente, os trilhos das Bandas de Bollinger se expandem rapidamente, resultando na incapacidade de rastrear tendências. A estratégia precisa ser interrompida, esperando que os trilhos converjam antes de executá-la novamente.

  3. As estratégias de Bollinger Bands não são perfeitas, haverá também uma certa quantidade de falsos sinais gerados, o que requer suportar as perdas correspondentes.

  4. Método de stop loss relativamente simples. O stop loss desta estratégia considera apenas os preços mais altos e mais baixos após a abertura de uma posição, sem incorporar métodos de stop loss mais complexos baseados em volatilidade etc, que podem ser muito agressivos ou conservadores, exigindo otimização.

Orientações para a otimização da estratégia

Esta estratégia deve ser otimizada nos seguintes aspectos:

  1. Os parâmetros da estratégia podem ser otimizados para diferentes moedas e ciclos para melhorar a adaptabilidade da estratégia.

  2. Otimizar o mecanismo de stop loss. movendo stop loss, oscilando stop loss, trailing stop loss etc. pode ser introduzido para tornar o método de stop loss mais inteligente.

  3. Incorporar outros indicadores para filtrar os sinais de entrada. Indicadores como MACD, KDJ etc. podem ser adicionados para evitar sinais falsos de Bollinger Bands em mercados oscilantes lateralmente.

  4. Adicionar mecanismos de gestão de posições. Implementar métodos de gestão de rastreamento de stop profit, negociação piramidal, posição de proporção fixa, etc. para melhorar a rentabilidade das estratégias.

  5. Realizar otimização de backtest. Examinar de forma abrangente os resultados da estratégia, expandindo o prazo de backtest, ajustando parâmetros, analisando relatórios de backtest, etc., para encontrar parâmetros ideais.

Conclusão

Em geral, a estratégia de tendência adaptativa é uma estratégia quantitativa bastante madura. Ela usa Bandas de Bollinger para capturar dinamicamente tendências, combinadas com o indicador ATR para construir um canal adaptativo para julgar tendências longas e curtas. Enquanto isso, tem um mecanismo de stop loss para controlar riscos. As vantagens desta estratégia são a frequência de operação apropriada, o tempo de entrada preciso e um bom controle de risco. No entanto, existem algumas questões que precisam de otimização em áreas como seleção de parâmetros, método de stop loss, filtragem de sinal para tornar a estratégia mais robusta e inteligente.


/*backtest
start: 2023-12-15 00:00:00
end: 2024-01-14 00:00:00
period: 4h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2
strategy("[Th] Adaptive Trend v1", shorttitle="[TH] Adaptive Trend", overlay=true)

Pd=input(2, minval=1,maxval = 100, title="Period")
Bw=input(50, minval=1,maxval = 100, title="Bandwidth")
minFactor = input(0.5, minval=0.1, maxval=1.0, step=0.1, title="Minimum Factor")
maxFactor = input(3.00, minval=0.2, maxval=5.0, step=0.1, title="Maximum Factor")
plot_trend=input(true, title="Plot trend")

plot_losscut = input(true, title="Plot losscut")

/////////////// Calculate the BB's ///////////////
basisBB = ema(close, 20)
devBB     = 2 * stdev(close, 20)
upperBB = basisBB + devBB
lowerBB = basisBB - devBB
//plot(upperBB)
//plot(lowerBB)

///////////// Trend ////////////////////////////

rawFactor = ((upperBB-lowerBB)/basisBB)*Bw
Factor = rawFactor > minFactor ? (rawFactor > maxFactor ? maxFactor : rawFactor) : minFactor

Up=hl2-(Factor*atr(Pd))
Dn=hl2+(Factor*atr(Pd))
TrendUp=close[1]>TrendUp[1]? max(Up,TrendUp[1]) : Up
TrendDown=close[1]<TrendDown[1]? min(Dn,TrendDown[1]) : Dn
TrendUpPlot=plot(plot_trend?TrendUp:na, style=line, color=green, linewidth=1)
TrendDownPlot=plot(plot_trend?TrendDown:na, style=line, color=red, linewidth=1)
Trend = close > TrendDown[1] ? 1: close< TrendUp[1]? -1: nz(Trend[1],1)
fill(TrendUpPlot,TrendDownPlot, color=Trend == 1 ? green : red, transp=80)
sig_trend_long = Trend[1] == -1 and Trend == 1
sig_trend_short = Trend[1] == 1 and Trend == -1

///////////// Loss Cut ////////////////////////////
price_cut = sig_trend_long[1] or sig_trend_short[1] or sig_reentry_long[1] or sig_reentry_short[1] ? open : price_cut[1] 
current_trend = sig_trend_long[1] ? 1 : (sig_trend_short[1] ? -1 : current_trend[1])

sig_loss_cut = sig_trend_long or sig_trend_short ? false : ( current_trend == 1 ? (price_cut > low) : (current_trend == -1 ? (price_cut < high) : false) )
has_position = sig_loss_cut ? false : ((sig_trend_long[1] or sig_trend_short[1] or sig_reentry_long[1] or sig_reentry_short[1]) ? true : has_position[1])
sig_reentry_long = not has_position and current_trend == 1 and low > price_cut
sig_reentry_short = not has_position and current_trend == -1 and high < price_cut

bgcolor(plot_losscut and ( not has_position or sig_loss_cut ) ? silver : white, transp=70)
plotshape(plot_losscut and sig_loss_cut and current_trend == 1? 1 : na, color=green, style=shape.xcross, location=location.belowbar ,size=size.tiny)
plotshape(plot_losscut and sig_loss_cut and current_trend == -1? 1 : na, color=red, style=shape.xcross, location=location.abovebar ,size=size.tiny)

LossCutPlot = plot(plot_losscut ? price_cut : na, linewidth=4, color=black, transp=60)
fill(TrendDownPlot, LossCutPlot, color=silver, transp=90)

plotshape(sig_trend_long or sig_reentry_long ? Trend : na, title="Up Entry Arrow", color=green, style=shape.triangleup, location=location.belowbar, size=size.tiny)
plotshape(sig_trend_short or sig_reentry_short ? Trend : na, title="Down Entry Arrow",color=red, style=shape.triangledown, size=size.tiny)
    
    
///////////// Strategy //////////////////////////// 
if true

    strategy.entry('long', long=strategy.long, comment='Long', when=sig_trend_long or sig_reentry_long)
    strategy.entry('short', long=strategy.short, comment='Short', when=sig_trend_short or sig_reentry_short)
    
    if(current_trend == 1)
        strategy.close('long', when=sig_loss_cut == true) 
        //strategy.exit('lc',from_entry='long', stop=price_cut)
    
    if( current_trend == -1 )
        strategy.close('short', when=sig_loss_cut == true) 
        //strategy.exit('sc',from_entry='short', stop=price_cut)


Mais.