Estratégia de sinais de negociação quadrática

Autora:ChaoZhang, Data: 23 de Fevereiro de 2023
Tags:

Resumo

Esta estratégia adapta uma curva quadrática a pontos altos/baixos de barras para gerar sinais de negociação quando o preço quebra as linhas ajustadas.

Estratégia lógica

Os principais componentes e regras são:

  1. Ajuste da curva em pontos altos/baixos utilizando regressão quadrática.

  2. Compre sinal quando o fechamento estiver acima da banda superior.

  3. Vender sinal quando o fechamento for abaixo da faixa inferior.

  4. N períodos de verificação para evitar quebras falsas.

  5. Não há regras de saída fixas, otimize as saídas através de backtesting.

A estratégia tenta identificar os preços-chave matematicamente e negociar os breakouts, um sistema típico de breakout.

Vantagens

Em comparação com outros sistemas de escape, as principais vantagens são:

  1. A adequação matemática é mais objetiva do que o julgamento subjetivo.

  2. Abordagem inovadora que combina análise técnica e modelos estatísticos.

  3. A verificação multiperíodo evita falhas.

  4. O backtesting pode otimizar as saídas e o período de espera.

  5. Fácil de implementar com ajustes flexíveis.

  6. Atualizações automáticas do modelo sem intervenção manual.

  7. Pode testar a robustez dos parâmetros em produtos e prazos.

  8. Potencial para otimizar ainda mais com aprendizagem de máquina.

  9. Abordagem global inovadora com valor exploratório.

Riscos

No entanto, os riscos são:

  1. O desempenho da montagem depende do ajuste dos parâmetros, risco de sobreajuste.

  2. As linhas montadas estão atrasadas, não podem evitar completamente as perdas.

  3. Sem confirmação de volume, risco de ser preso.

  4. A arbitragem estatística é um desafio para o alfa persistente.

  5. Período de backtest limitado, preciso verificar a robustez.

  6. A adaptabilidade a vários mercados requer validação.

  7. O tamanho fixo carece de ajuste dinâmico.

  8. Precisamos de uma avaliação rigorosa das relações recompensa/risco.

Melhorias

Com base na análise, as melhorias podem incluir:

  1. Testar a robustez dos parâmetros em todos os regimes de mercado.

  2. Adicionar indicadores de confirmação de volume.

  3. Otimizar a lógica de entrada/saída para sinais de melhor qualidade.

  4. Construir modelos dinâmicos de dimensionamento de posição.

  5. Incorporar paradas para limitar perdas.

  6. Otimizar as estratégias de gestão de riscos.

  7. Validação do backtest da janela rolante.

  8. Avaliar a estabilidade de vários mercados.

  9. Aproveitar o aprendizado de máquina para a otimização do modelo.

Conclusão

Em resumo, esta estratégia tem algum valor inovador e mérito de experimentação. Mas a viabilidade a longo prazo da arbitragem estatística permanece não comprovada.


/*backtest
start: 2023-08-23 00:00:00
end: 2023-09-22 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
//
// ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ //

strategy(title = " Strategy Quadratic Semaphore ",
         shorttitle = "SQS",
         overlay = true,
         precision = 8,
         calc_on_order_fills = true,
         calc_on_every_tick = true,
         backtest_fill_limits_assumption = 0,
         default_qty_type = strategy.fixed,
         default_qty_value = 2,
         initial_capital = 10000,
         pyramiding=5,
         currency = currency.USD,
         linktoseries = true)

//
// ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ //

backTestSectionFrom = input(title = "═══════════════ From ═══════════════", defval = true, type = input.bool)

FromMonth         = input(defval = 1, title = "Month", minval = 1)
FromDay           = input(defval = 1, title = "Day", minval = 1)
FromYear          = input(defval = 2019, title = "Year", minval = 2014)

backTestSectionTo = input(title = "════════════════ To ════════════════", defval = true, type = input.bool)
ToMonth           = input(defval = 31, title = "Month", minval = 1)
ToDay             = input(defval = 12, title = "Day", minval = 1)
ToYear            = input(defval = 9999, title = "Year", minval = 2014)

Config            = input(title = "══════════════ Config ══════════════", defval = true, type = input.bool)
p = input(6)
length = input(30)
//
backTestPeriod() => (time > timestamp(FromYear, FromMonth, FromDay, 00, 00)) and (time < timestamp(ToYear, ToMonth, ToDay, 23, 59))
//
//
// ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ //

x1 = bar_index
x2 = sqrt(x1)
y = high
//
S11 = sum(x2,length) - sqrt(sum(x1,length)) / length  
S12 = sum(x1*x2,length) - (sum(x1,length) * sum(x2,length)) / length  
S22 = sum(sqrt(x2),length) - sqrt(sum(x2,length)) / length            
Sy1 = sum (y*x1,length) - (sum(y,length) * sum(x1,length)) / length   
Sy2 = sum (y*x2,length) - (sum(y,length) * sum(x2,length)) / length   
//
max1 = sma(x1,length) 
max2 = sma(x2,length)
may = sma(y,length)
b2 = ((Sy1 * S22) - (Sy2*S12))/(S22*S11 - sqrt(S12))
b3 = ((Sy2 * S11) - (Sy1 * S12))/(S22 * S11 - sqrt(S12))
b1 = may - b2*max1 - b3*max2
qr = b1 + b2*x1 + b3*x2
//
yl = low
//
Sy1l = sum(yl*x1,length) - (sum(yl,length) * sum(x1,length)) / length  
Sy2l = sum(yl*x2,length) - (sum(yl,length) * sum(x2,length)) / length  
//
mayl = sma(yl,length)
b2l = ((Sy1l * S22) - (Sy2l*S12))/(S22*S11 - sqrt(S12))
b3l = ((Sy2l * S11) - (Sy1l * S12))/(S22 * S11 - sqrt(S12))
b1l = mayl - b2l*max1 - b3l*max2
qrl = b1l + b2l*x1 + b3l*x2
//
period = round(p/2)+1
hh = qr[period]
ll = qrl[period]
countH = 0
countL = 0
buy=0
sell=0
//
for i = 1 to period-1
    if qr[i]<hh
        countH:=countH+1
    if qrl[i]>ll
        countL:=countL+1

for i = period+1 to p+1
    if qr[i]<hh
        countH:=countH+1
    if qrl[i]>ll
        countL:=countL+1

if countH==p
    pivotH = high[period]
    buy := 1
    
if countL==p
    pivotL = low[period]
    sell := 1
//    
plotshape(buy == 1 , text='💣', style=shape.arrowup, location=location.belowbar, color=#32CD32, textcolor=color.white, offset=0, transp=0,size=size.auto)
plotshape(sell == 1 , text='🔨', style=shape.arrowdown, location=location.abovebar, color=#FF0000, textcolor=color.white, offset=0, transp=0,size=size.auto)
//

if (backTestPeriod())
    strategy.entry("long", true, 1, when = buy == 1)
    strategy.entry("short", false, 1, when = sell == 1) 


Mais.