Estratégia de sinal de negociação de ajuste quadrático


Data de criação: 2023-09-23 15:40:57 última modificação: 2023-09-23 15:40:57
cópia: 2 Cliques: 627
1
focar em
1617
Seguidores

Visão geral

Esta estratégia usa a curva de dupla correspondência K para formar um sinal de negociação. Quando o preço real quebra a curva de correspondência, gera um sinal de compra e venda. A estratégia tenta usar um modelo matemático para identificar os principais suportes e resistências para realizar uma negociação de ruptura.

Princípio da estratégia

Os principais componentes e regras da estratégia são os seguintes:

  1. Altos e baixos de adequação: use o mínimo de bimetal da curva secundária para ajustar os altos e baixos da linha K.

  2. Sinais de compra: O sinal de compra é gerado quando o preço de fechamento da linha K quebra a curva de alta.

  3. Sinais de venda: quando o preço de fechamento da linha K quebra a curva de queda, um sinal de venda é gerado.

  4. Verificação de ciclo N: requer que a ruptura seja contínua durante N ciclos para que seja efetiva, evitando a falsa ruptura.

  5. Sinais de equilíbrio: sem um sinal de equilíbrio claro, o tempo de detenção é determinado pela otimização de feedback.

A estratégia tenta identificar os preços-chave através de modelos matemáticos e entrar em jogo em caso de ruptura, o que é típico de um sistema de ruptura.

Análise de vantagens

As principais vantagens da estratégia em relação a outros sistemas de invasão são:

  1. O uso de modelos matemáticos para a adequação é mais objetiva do que subjetivo.

  2. A tecnologia de negociação e o modelo estatístico são integrados em um método inovador.

  3. Introdução de verificação de múltiplos ciclos para filtrar falhas.

  4. A otimização de retrospectiva permite encontrar o melhor tempo para manter uma posição.

  5. A implementação não é muito difícil e pode ser ajustada de forma flexível.

  6. O modelo é atualizado automaticamente, sem manutenção manual.

  7. Parâmetros de robustez de diferentes variedades e ciclos podem ser testados.

  8. A introdução de aprendizagem de máquina para otimização e validação.

  9. Em geral, a novidade é alta e vale a pena ser explorada.

Análise de Riscos

Mas a estratégia também traz os seguintes riscos:

  1. O efeito de encaixe depende da escolha dos parâmetros, podendo ser otimizado demais.

  2. A curva de adequação está atrasada e não é possível evitar completamente as perdas.

  3. Não se considera o volume de transações, mas o risco de um “swap”.

  4. A arbitragem estatística dificulta a obtenção de lucros excedentários de forma estável a longo prazo.

  5. O ciclo de retorno é curto e a robustez do modelo deve ser verificada.

  6. A adaptabilidade ambiental de várias variedades está a ser testada.

  7. As posições fixas não podem ser ajustadas dinamicamente.

  8. É preciso avaliar rigorosamente a taxa de retirada de receitas.

Direção de otimização

De acordo com a análise acima, a estratégia pode ser melhorada em vários aspectos:

  1. Teste de robustez de parâmetros em diferentes ambientes de mercado.

  2. Adição de indicadores de verificação de volume de transações.

  3. Otimizar a lógica de entrada e saída para melhorar a qualidade do sinal.

  4. Estabelecer um modelo de gestão de posições dinâmicas.

  5. Introdução de estratégias de stop loss para limitar perdas.

  6. Otimizar estratégias de gestão de fundos.

  7. Verificação de rolagem da janela de detecção.

  8. Avaliação da capacidade de rendimento estável de várias variedades.

  9. Otimizar o modelo com aprendizado de máquina.

Resumir

A estratégia, em geral, tem um certo valor de inovação e experimentação. No entanto, a estabilidade de longo prazo da Statistical Arbitrage ainda está sendo testada.

Código-fonte da estratégia
/*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)