Estratégia de arbitragem de média móvel regularizada adaptativa

Autora:ChaoZhang, Data: 2023-11-16 16:20:11
Tags:

img

Resumo

Esta estratégia implementa negociação de arbitragem entre diferentes mercados através do cálculo de uma linha de média móvel regularizada adaptativa.

Princípio da estratégia

A estratégia primeiro define uma função scaleMinimax para padronizar a série de tempo para um intervalo especificado. Em seguida, define uma função média móvel regularizada adaptativa rema para calcular a linha de sinal suavizada sig. O cálculo da linha de sinal é:

  1. Definir uma janela deslizante, comprimento padrão 5 dias.

  2. O valor sig para cada dia é a média ponderada do valor sig anterior e do preço de fechamento actual.

  3. Adicione um parâmetro λ como um regularizador para tornar a transição sig mais suave.

Após a obtenção da linha de sinal, a estratégia determina longo / curto com base na cruz dourada / morta da linha de sinal e preço.

  1. Quando o SIG ultrapassar o preço, vai long.

  2. Quando o sig cruzar abaixo do preço, vai curto.

Além disso, a estratégia adiciona o fator suave e show_line como parâmetros ajustáveis para aumentar a flexibilidade.

Análise das vantagens

Em comparação com as estratégias tradicionais de média móvel, esta estratégia tem as seguintes vantagens:

  1. O mecanismo de ponderação adaptativa pode responder mais rapidamente às alterações dos preços.

  2. O regularizador adicionado torna a linha de sinal mais suave, evitando sinais errados de flutuações drásticas de preços.

  3. A arbitragem entre mercados pode beneficiar das diferenças de preços entre mercados.

  4. Os parâmetros flexíveis e ajustáveis podem ser otimizados de acordo com as condições do mercado.

Riscos e soluções

A estratégia apresenta também alguns riscos:

  1. A solução é ajustar adequadamente o parâmetro suave para evitar oscilações da linha de sinal.

  2. A solução é selecionar mercados altamente correlacionados para arbitragem.

  3. A otimização de parâmetros requer dados históricos suficientes para backtesting. A solução é ajustar cuidadosamente os parâmetros na negociação ao vivo.

Orientações de otimização

A estratégia pode também ser otimizada nos seguintes aspectos:

  1. Na seleção de parâmetros, algoritmos de aprendizado de máquina podem ser introduzidos para otimizar automaticamente combinações de parâmetros.

  2. Na geração de sinais, mais indicadores podem ser introduzidos para construir sinais de negociação mais estáveis.

  3. No controlo do risco, o stop loss pode ser definido para limitar a perda por transação.

  4. Na arbitragem entre mercados, pode ser estendida a ativos comerciais mais altamente correlacionados.

Resumo

Esta estratégia implementa a negociação de arbitragem entre os mercados através do cálculo adaptativo de médias móveis. Em comparação com as estratégias tradicionais de médias móveis, tem as vantagens de parâmetros adaptativos, processamento suave, arbitragem entre mercados, etc. Os próximos passos são otimizar ainda mais a estratégia por meio de aprendizado de máquina, sinais combinados, gerenciamento de risco, etc.


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

//@version=3
strategy("Crossover82%", overlay=true)

//
// Functions
//
scaleMinimax(X, p, min, max) => 
    hi = highest(X, p), lo = lowest(X, p)
    (max - min) * (X - lo)/(hi - lo) + min

rema(ts, p) => // regularized ma
    rm = 0.0, lambda = .5, a = 2 / (p + 1)
    rm := (nz(rm[1]) + a * (ts - nz(rm[1])) + lambda * (2 * nz(rm[1]) - nz(rm[2]))) / (lambda + 1)
    rm
    
//
// Inputs
//
X = input(close, title="Data source")
smooth = input(2, title="REMA smooth factor")
show_line = input(true, title="Show signal line")

//
// Main
//
p = 5
sig = rema(scaleMinimax(pow(X*p,-X) - 0.1, 100, lowest(X, 100), highest(X, 100)), smooth)

plot(show_line ? sig : na, linewidth=1)
plot(cross(sig, X) ? ohlc4 : na, style=circles, linewidth=8, color=blue, transp=50)

longCondition = crossover(sig, X)
if (longCondition)
    strategy.entry("LE", strategy.long)

shortCondition = crossunder(sig, X)
if (shortCondition)
    strategy.entry("SE", strategy.short)



Mais.