Estratégia de negociação quantitativa baseada na função de erro gaussiana


Data de criação: 2024-01-19 14:28:03 última modificação: 2024-01-19 14:28:03
cópia: 1 Cliques: 647
1
focar em
1617
Seguidores

Estratégia de negociação quantitativa baseada na função de erro gaussiana

Visão geral

A estratégia é uma estratégia de negociação quantitativa baseada na função de erro de Gauss para calcular a variação de preço do indicador P-Signal. Ela usa o indicador P-Signal para determinar a tendência e o ponto de inflexão do preço e, com isso, determinar o momento de entrada e saída.

Princípio da estratégia

O indicador central da estratégia é o P-Signal. A fórmula de cálculo do P-Signal é a seguinte:

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

Aqui ser representa a sequência de preços, int representa o parâmetro nPoints, ou seja, veja quantas raízes K. A fórmula é composta por três partes:

  1. nStDev é a diferença padrão do preço;
  2. nSma é a média móvel simples dos preços;
  3. fErf é a função de erro de Gauss ≠

O que a fórmula inteira significa é que a média móvel do preço dividida pelo diferencial padrão do preço, dividida em sqrt ((2)), é padronizada, e então mapeada para o intervalo ((-1, 1) por meio da função de erro de Gauss. Ou seja, se o preço flutua mais do que a média, o P-Signal é próximo a 1; se o preço flutua menos do que a média, o P-Signal é próximo a -1.

A estratégia usa o valor do P-Signal e seus símbolos de variação para decidir a entrada e a saída:

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

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

Faça mais quando o P-Signal é menor que 0 e muda para positivo; leve quando o P-Signal é maior que 0 e muda para negativo.

Vantagens estratégicas

A estratégia tem as seguintes vantagens:

  1. Usando a função de erro de Gauss para ajustar a distribuição de preços. A função de erro de Gauss se ajusta bem à distribuição normal, o que é compatível com a maioria das características de distribuição de sequências de tempo financeiras.
  2. O uso de parâmetros de ajuste automático de diferença padrão de preço. Isso torna os parâmetros de estratégia mais amplos e mais robustos para as mudanças do mercado.
  3. O indicador P-Signal combina os benefícios de uma tendência e de uma inversão. Ele considera a tendência de flutuação dos preços e também os pontos de inversão dos preços, o que ajuda a capturar a tendência de negociação e a oportunidade de negociação de inversão.

Análise de Riscos

A estratégia também apresenta alguns riscos, como:

  1. Risco de negociação de alta frequência. Esta estratégia é a típica estratégia de negociação de alta frequência, que gera mais negociações, com custos de negociação mais elevados e risco de deslizamento.
  2. O indicador P-Signal produz um grande número de falsos sinais em mercados onde os preços não têm uma tendência e regularidade óbvias.
  3. A otimização de parâmetros é difícil. A relação entre vários parâmetros na fórmula é complexa, tornando a otimização de parâmetros mais difícil.

Para reduzir esses riscos, pode-se considerar aumentar as condições de filtragem, reduzir a frequência de negociação; otimizar o conjunto de parâmetros e a configuração de custos de negociação; a maturação em disco rígido, escolher a variedade apropriada.

Direção de otimização

A estratégia ainda tem espaço para ser melhorada, principalmente no sentido de:

  1. Adicione condições de filtragem para evitar falsos sinais. Por exemplo, em combinação com outros indicadores, faça condições AND ou OR para filtrar parte do Noise.
  2. Combinação de parâmetros de otimização. Ajuste o tamanho de nPoints em diferentes variedades e períodos, melhorando a estabilidade da estratégia.
  3. Considere os parâmetros dinâmicos. Deixe os parâmetros de nPoints se adaptarem à volatilidade do mercado, o que pode melhorar a robustez da estratégia.
  4. Combinação de métodos de aprendizagem de máquina. Utiliza algoritmos de IA para otimizar os parâmetros, as condições de filtragem e a escolha de variedades.

Resumir

Em geral, a ideia central da estratégia é nova, usando a função de Gauss para ajustar a distribuição de preços e ajustar automaticamente a gama de parâmetros. Mas, como uma estratégia de negociação de alta frequência, ainda é necessário testar e otimizar ainda mais, especialmente no controle de risco e no ajuste de parâmetros, para obter lucros estáveis no mercado real.

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