Estratégia quantitativa baseada em pontos pivô

Autora:ChaoZhang, Data: 2024-02-20 14:22:13
Tags:

img

Resumo

A ideia central desta estratégia é usar pontos pivô para negociação quantitativa. Ele procura altos e baixos importantes e faz negociações de reversão quando os preços atravessam esses níveis-chave.

Estratégia lógica

A estratégia define primeiro as funções pivotHighSig() e pivotLowSig() para localizar pontos altos e baixos.

Especificamente, para os altos de balanço, ele procura múltiplos altos mais altos à esquerda e múltiplos altos mais baixos à direita.

Após localizar os altos e baixos do swing, a estratégia seleciona pontos de pivô a partir desses pontos de pivô, ou seja, pontos importantes dos pivôs.

Por fim, os negócios de reversão são realizados quando os preços atravessam os pontos pivô dos pivôs.

Vantagens

Esta estratégia quantitativa baseada em pontos pivot tem as seguintes vantagens:

  1. Aproveita os níveis de suporte e resistência no mercado onde muitas vezes ocorrem reviravoltas
  2. Identifica pontos altos e baixos importantes para a negociação bilateral
  3. Pontos pivô são pontos extremos excepcionais e quebrar através deles dá sinais fortes
  4. Usando pontos de pivô de pivôs torna o sinal ainda mais confiável

Riscos e soluções

Há também alguns riscos com esta estratégia:

  1. A solução é ajustar os parâmetros de faixa esquerda/direita para identificar os pontos pivot com mais precisão.
  2. A solução é filtrar sinais combinando outros fatores como volume, momento, etc.

Áreas de melhoria

Esta estratégia pode ser melhorada nos seguintes domínios:

  1. Adicionar mecanismos de stop loss para tornar a estratégia mais estável
  2. Incorporar mais indicadores técnicos para a filtragem de sinais
  3. Desenvolver modelos de reversão de PRED utilizando aprendizado de máquina para aumentar ainda mais a previsão de pontos pivot
  4. Construir em parâmetros adaptativos

Conclusão

Em geral, esta estratégia tem um bom desempenho. A ideia central é detectar pontos de pivô importantes e negociar seus breakouts.


/*backtest
start: 2023-02-13 00:00:00
end: 2024-02-19 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("Pivot of Pivot Reversal Strategy [QuantNomad]", shorttitle = "PoP Reversal Strategy [QN]", overlay=true)

// Inputs 
leftBars   = input(4,   title = 'PP Left Bars')
rightBars  = input(2,   title = 'PP Right Bars')
atr_length = input(14,  title = 'ATR Length')
atr_mult   = input(0.1, title = 'ATR Mult')

// Pivot High Significant Function
pivotHighSig(left, right) =>
    pp_ok = true
    atr   = atr(atr_length)
    
    for i = 1 to left
        if (high[right] < high[right+i] + atr * atr_mult)
            pp_ok := false
    for i = 0 to right-1
        if (high[right] < high[i] + atr * atr_mult)
            pp_ok := false
    
    pp_ok ? high[right] : na

// Pivot Low Significant Function
pivotLowSig(left, right) =>
    pp_ok = true
    atr   = atr(atr_length)
    
    for i = 1 to left
        if (low[right] > low[right+i] - atr * atr_mult)
            pp_ok := false
    for i = 0 to right-1
        if (low[right] > low[i] - atr * atr_mult)
            pp_ok := false
    
    pp_ok ? low[right] : na


swh = pivotHighSig(leftBars, rightBars)
swl = pivotLowSig (leftBars, rightBars)

swh_cond = not na(swh)

hprice = 0.0
hprice := swh_cond ? swh : hprice[1]

le = false
le := swh_cond ? true : (le[1] and high > hprice ? false : le[1])

swl_cond = not na(swl)

lprice = 0.0
lprice := swl_cond ? swl : lprice[1]

se = false
se := swl_cond ? true : (se[1] and low < lprice ? false : se[1])

// Pivots of pivots
ph1 = 0.0
ph2 = 0.0
ph3 = 0.0

pl1 = 0.0
pl2 = 0.0
pl3 = 0.0

pphprice = 0.0
pplprice = 0.0

ph3 := swh_cond ? nz(ph2[1]) : nz(ph3[1])
ph2 := swh_cond ? nz(ph1[1]) : nz(ph2[1])
ph1 := swh_cond ? hprice     : nz(ph1[1])

pl3 := swl_cond ? nz(pl2[1]) : nz(pl3[1])
pl2 := swl_cond ? nz(pl1[1]) : nz(pl2[1])
pl1 := swl_cond ? lprice     : nz(pl1[1])

pphprice := swh_cond and ph2 > ph1 and ph2 > ph3 ? ph2 : nz(pphprice[1])
pplprice := swl_cond and pl2 < pl1 and pl2 < pl3 ? pl2 : nz(pplprice[1])


if (le)
    strategy.entry("PP_RevLE", strategy.long, comment="PP_RevLE", stop=pphprice + syminfo.mintick)

if (se)
    strategy.entry("PP_RevSE", strategy.short, comment="PP_RevSE", stop=pplprice - syminfo.mintick)
    
// Plotting 
plot(lprice, color = color.red,   transp = 55)
plot(hprice, color = color.green, transp = 55)

plot(pplprice, color = color.red,   transp = 0, linewidth = 2)
plot(pphprice, color = color.green, transp = 0, linewidth = 2)

Mais.