O recurso está a ser carregado... Carregamento...

Estratégia de negociação de ruptura do canal de regressão linear

Autora:ChaoZhang, Data: 2024-02-18 15:00:53
Tags:

img

Resumo

Esta estratégia usa as bandas superior e inferior do canal de regressão linear, combinado com o desvio padrão duplo para definir sinais de compra e venda de ruptura, para estabelecer posições quando os preços quebram.

Estratégia lógica

A lógica central desta estratégia baseia-se na banda superior, banda inferior e linha média do canal de regressão linear.

  1. Calcular o valor de regressão linear linreg dos preços e o valor de regressão linear do período seguinte linreg_p

  2. Calcular a inclinação inclinação e interceptação interceptação da linha de regressão linear com base em linreg

  3. Calcular o desvio de desvio dos preços em relação à linha de regressão

  4. Definir o dev múltiplo do desvio para obter o deslocamento das bandas superior e inferior

  5. Quando o preço rompe para cima a partir da faixa inferior, definir sinal de compra compra

  6. Quando o preço rompe para baixo a partir da faixa superior, definir venda sinal vender

  7. Quando o preço se inverte a partir da linha do meio do canal, definir o sinal de saída de lucro

  8. Configurar a lógica de negociação baseada em sinais de compra, venda e saída

Análise das vantagens

A maior vantagem desta estratégia é que utiliza a tendência a médio e longo prazo refletida pelo canal de regressão linear.

  1. As bandas superior e inferior podem efetivamente refletir a faixa normal de flutuações de preços.

  2. O cruzamento da linha média como sinal de lucro pode maximizar os lucros e evitar perdas causadas por reversões após a obtenção de lucros.

  3. O canal de regressão linear tem algum atraso, o que pode efetivamente filtrar o ruído do mercado a curto prazo e tornar os sinais de negociação mais confiáveis.

  4. Esta estratégia tem poucos parâmetros e é fácil de implementar, adequada para negociação algorítmica.

Análise de riscos

Há alguns riscos nesta estratégia:

  1. O atraso do canal de regressão linear pode perder tendências após mudanças drásticas de curto prazo.

  2. A configuração inadequada do multiplicador de desvio também pode levar a sinais falsos.

  3. Confiar apenas nos sinais de ruptura pode levar a perdas de fenda.

  4. A combinação com outros indicadores de canal ou o teste de diferentes fontes de dados podem ajudar.

Orientações de otimização

As principais direcções de otimização desta estratégia:

  1. Otimizar o comprimento do canal de regressão linear para equilibrar o atraso e a sensibilidade.

  2. Otimizar o multiplicador de desvio para melhorar a qualidade do sinal, maximizando o controlo do risco.

  3. Adicionar outros indicadores para filtragem de sinal para melhorar a taxa de vitória, por exemplo, EMA, KDJ, etc.

  4. Adicionar mecanismos de stop loss, tais como o ATR trailing stop loss.

  5. Teste o impacto de diferentes fontes de dados na estratégia, por exemplo, fechamento ajustado, dados de índice, etc.

  6. Ajustar dinamicamente os parâmetros ou os pesos do sinal com base nas condições do mercado.

Conclusão

Em resumo, este é um sistema de ruptura usando o canal de regressão linear como indicador de sinal. A lógica da estratégia é clara e fácil de entender, com poucos parâmetros, tornando a negociação ao vivo relativamente fácil de implementar. No entanto, como otimizar dinamicamente os parâmetros com base nas condições de mercado em mudança e combinar outros indicadores para filtragem de sinal é a chave para o sucesso desta estratégia. Através de testes e otimização contínuos, esta estratégia pode se tornar um sistema quantitativo estável e gerador de lucro.


/*backtest
start: 2024-01-01 00:00:00
end: 2024-01-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//Robotrading
//@version=4

strategy("robotrading linreg", "linreg", overlay=true, default_qty_type = strategy.percent_of_equity, default_qty_value = 10, commission_value = 0.1)

//Settings
source      = input(close)
length      = input(100, minval=1)
offset      = input(0, minval=0)
dev         = input(2.0, "Deviation")
smoothing   = input(1, minval=1)
mtf_val     = input("", "Resolution", input.resolution)
signals     = input("Recent", "Signals Display", options=["Recent", "All"])
goto        = input(0, "End At Bar Index")

//Lin.reg.
cc(x) => x=="Red"?color.red:x=="Lime"?color.lime:x=="Orange"?color.orange:x=="Teal"?color.teal:x=="Yellow"?color.yellow:x=="Black"?color.black:color.white
data(x) => sma(security(syminfo.tickerid, mtf_val!="" ? mtf_val : timeframe.period, x), smoothing)
linreg = data(linreg(source, length, offset))
linreg_p = data(linreg(source, length, offset+1))

//Deviation
x = bar_index
slope = linreg - linreg_p
intercept = linreg - x*slope
deviationSum = 0.0
for i = 0 to length-1
    deviationSum:= deviationSum + pow(source[i]-(slope*(x-i)+intercept), 2)  
deviation = sqrt(deviationSum/(length))
x1 = x-length
x2 = x
y1 = slope*(x-length)+intercept
y2 = linreg

//Cross
dm_current = -deviation*dev + y2
dp_current = deviation*dev + y2
ex_current = (dm_current + dp_current) / 2
buy = crossunder(close, dm_current)
sell = crossover(close, dp_current)
exit = crossover(close, ex_current) or crossunder(close, ex_current)

//Channel
updating = goto <= 0 or x < goto
// if updating
//     line b = line.new(x1, y1, x2, y2, xloc.bar_index, extend.right, color.aqua, width = 3)
//     line.delete(b[1])
//     line dp = line.new(x1, deviation*dev + y1, x2, deviation*dev + y2, xloc.bar_index, extend.right, color.red, width = 3)
//     line.delete(dp[1])
//     line dm = line.new(x1, -deviation*dev + y1, x2, -deviation*dev + y2, xloc.bar_index, extend.right, color.lime, width = 3)
//     line.delete(dm[1])

//Lines
plot(dm_current, color = color.lime)
plot(dp_current, color = color.red)
plot(ex_current)
    
//Trading
if ex_current > 0
    strategy.entry("Long", strategy.long, na, limit = dm_current)
    strategy.entry("Short", strategy.short, na, limit = dp_current)
    strategy.exit("ExitLong", "Long", limit = ex_current)
    strategy.exit("ExitShort", "Short", limit = ex_current)

Mais.