Uma análise da estratégia de negociação quantitativa baseada na função de erro de Gauss

Autora:ChaoZhang, Data: 2024-01-19 14:28:03
Tags:

img

Resumo

Esta estratégia é uma estratégia quantitativa de negociação baseada no indicador P-Signal calculado por função de erro de Gauss para medir as mudanças de preço.

Estratégia lógica

O indicador central desta estratégia é o sinal P. A fórmula de cálculo do sinal P é:

fPSignal(ser, int) =>
    nStDev = stdev(ser, int) 
    nSma = sma(ser, int)
    fErf(nStDev > 0 ? nSma/nStDev/sqrt(2) : 1.0)

Aqui ser representa a série de preços, int representa o parâmetro nPoints, que é o número de barras para olhar para trás.

  1. nStDev é o desvio-padrão do preço;
  2. nSma é a média móvel simples do preço;
  3. fErf é a função de erro gaussiano.

O significado de toda a fórmula é tomar a média móvel do preço dividida pelo desvio padrão do preço, depois dividida por sqrt (((2) para padronização e, finalmente, mapeada para (-1, 1) intervalo pela função de erro de Gauss. Ou seja, se a flutuação do preço for maior que a média, o sinal P é próximo de 1; se a flutuação do preço for menor que a média, o sinal P é próximo de -1.

A estratégia utiliza o valor do sinal P e o sinal da sua alteração para determinar entradas e saídas:

strategy.entry("long", strategy.long, 1, when = nPSignal < 0 and ndPSignal > 0)

strategy.close("long", when = nPSignal > 0 and ndPSignal < 0)  

Ele vai longo quando o sinal P é menor que 0 e muda para positivo.

Vantagens

As vantagens desta estratégia incluem:

  1. Usando a função de erro de Gauss para caber na distribuição de preços.
  2. Ajuste automático dos parâmetros por desvio-padrão do preço, tornando a estratégia mais robusta em diferentes condições de mercado.
  3. O P-Signal combina as vantagens do seguimento de tendências e da reversão da média. Ele considera a tendência de flutuação de preços e os pontos de reversão, o que ajuda a capturar oportunidades tanto na negociação de tendências quanto na negociação de reversão.

Riscos

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

  1. Risco de negociação de alta frequência: como uma estratégia de negociação de alta frequência típica, pode gerar mais negociações, gerando assim custos de transação mais elevados e riscos de deslizamento.
  2. P-Signal pode produzir muitos sinais falsos quando o preço não tem uma tendência ou padrão claro.
  3. A relação complexa entre vários parâmetros torna a otimização de parâmetros desafiadora.

Para reduzir esses riscos, podem ser tomadas em consideração algumas medidas: adição de filtros para reduzir a frequência das trocas; otimização da combinação de parâmetros e fixação dos custos de transação; testes em tempo real e escolha de produtos adequados.

Reforço

Há espaço para mais melhorias:

  1. Adicionar filtros para evitar sinais falsos, por exemplo, E/OU com outros indicadores para filtrar algum ruído.
  2. Otimizar a combinação de parâmetros. Ajustar o tamanho dos nPoints em diferentes produtos e prazos para melhorar a estabilidade.
  3. Considerando os parâmetros dinâmicos, o ajustamento adaptativo dos nPoints de acordo com a volatilidade do mercado pode melhorar a robustez.
  4. Incorporar métodos de aprendizagem de máquina, utilizando algoritmos de IA em parâmetros, filtros e otimização de tempo entre produtos.

Conclusão

Em conclusão, a ideia central desta estratégia é inovadora, ajustando a distribuição de preços com função de Gauss e ajustando automaticamente os parâmetros.


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

// **********************************************************************************************************
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// P-Signal Strategy © Kharevsky
// @version=4
// **********************************************************************************************************
strategy("P-Signal Strategy", precision = 3)
// Parameters and const of P-Signal.
nPoints = input(title = "Number of Bars", type = input.integer, defval = 9, minval = 4, maxval = 100, group = "Parameters of observation.")
int nIntr = nPoints - 1
// Horner's method for the error (Gauss) & P-Signal functions.
fErf(x) =>
    nT = 1.0/(1.0 + 0.5*abs(x))
    nAns = 1.0 - nT*exp(-x*x - 1.26551223 + 
     nT*( 1.00002368 + nT*( 0.37409196 + nT*( 0.09678418 + 
     nT*(-0.18628806 + nT*( 0.27886807 + nT*(-1.13520398 + 
     nT*( 1.48851587 + nT*(-0.82215223 + nT*( 0.17087277 ))))))))))
    x >= 0 ? nAns : -nAns
fPSignal(ser, int) => 
    nStDev = stdev(ser, int)
    nSma = sma(ser, int)
    fErf(nStDev > 0 ? nSma/nStDev/sqrt(2) : 1.0)
// Strat.
float nPSignal = sma(fPSignal(change(ohlc4), nIntr), nIntr)
float ndPSignal = sign(nPSignal[0] - nPSignal[1])
strategy.entry("long", strategy.long, 1, when = nPSignal < 0 and ndPSignal > 0)
strategy.close("long", when = nPSignal > 0 and ndPSignal < 0)
// Plotting. 
hline(+1.0, color = color.new(color.orange,70), linestyle = hline.style_dotted)
hline(-1.0, color = color.new(color.orange,70), linestyle = hline.style_dotted)
plot(nPSignal, color = color.blue, style = plot.style_line)
plot(strategy.position_size, color = color.white, style = plot.style_cross)
// Alerts.
if(strategy.position_size[0] > strategy.position_size[1])
    alert("P-Signal strategy opened the long position: " + syminfo.tickerid + " " + timeframe.period, alert.freq_once_per_bar)
if(strategy.position_size[0] < strategy.position_size[1])
    alert("P-Signal strategy closed the long position: " + syminfo.tickerid + " " + timeframe.period, alert.freq_once_per_bar)
// The end.

Mais.