Estrategia de trading cuantitativo basada en la función de error gaussiano


Fecha de creación: 2024-01-19 14:28:03 Última modificación: 2024-01-19 14:28:03
Copiar: 1 Número de Visitas: 647
1
Seguir
1617
Seguidores

Estrategia de trading cuantitativo basada en la función de error gaussiano

Descripción general

La estrategia es una estrategia de comercio cuantitativa basada en la función de error de Gauss para calcular el cambio de precio del indicador P-Signal. Utiliza el indicador P-Signal para determinar la tendencia de los precios y los puntos de inflexión para decidir cuándo entrar y salir.

Principio de estrategia

El indicador central de la estrategia es la P-Signal. La fórmula de cálculo de la P-Signal es la siguiente:

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

Aquí ser representa la secuencia de precios, int representa el parámetro nPoints, es decir, veamos cuántas raíces K. La fórmula consta de tres partes:

  1. nStDev es la diferencia estándar del precio;
  2. nSma es el promedio móvil simple de los precios;
  3. fErf es la función de error de Gauss.

La fórmula entera significa que el promedio móvil del precio dividido por el diferencial estándar del precio, luego dividido por sqrt ((2)), se estandariza y luego se mapea a través de la función de error de Gauss al intervalo ((-1, 1). Es decir, si el precio fluctúa más que el promedio, la P-Signal es cercana a 1; si el precio fluctúa menos que el promedio, la P-Signal es cercana a -1.

La estrategia utiliza el valor de la P-Signal y su símbolo de cambio para decidir la entrada y la salida:

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

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

Hacer más cuando P-Signal es menor que 0 y cambia a positivo; hacer un equilibrio cuando P-Signal es mayor que 0 y cambia a negativo.

Ventajas estratégicas

La estrategia tiene las siguientes ventajas:

  1. Utiliza la función de error de Gauss para ajustar la distribución de precios. La función de error de Gauss se ajusta muy bien a la distribución normal, lo que coincide con las características de la mayoría de las distribuciones de secuencias de tiempo financieras.
  2. El uso de la diferencia estándar para ajustar automáticamente los parámetros del precio. Esto hace que los parámetros de la estrategia sean más amplios y más robustos para los cambios en el mercado.
  3. El indicador P-Signal combina las ventajas de la tendencia y el cambio de tendencia. Considera tanto la tendencia de la fluctuación del precio como el punto de cambio de precio, lo que ayuda a capturar el comercio de tendencia y las oportunidades de cambio de tendencia.

Análisis de riesgos

La estrategia también tiene algunos riesgos, como:

  1. Riesgo de negociación de alta frecuencia. Esta estrategia es la típica estrategia de negociación de alta frecuencia, que genera más operaciones y asume mayores costos de transacción y riesgo de deslizamiento.
  2. El indicador P-Signal produce una gran cantidad de señales falsas en mercados donde los precios no tienen una tendencia y regularidad obvias.
  3. La optimización de parámetros es difícil. La relación entre varios parámetros en la fórmula es compleja, lo que hace que la optimización de parámetros sea más difícil.

Para reducir estos riesgos, se puede considerar aumentar las condiciones de filtración y reducir la frecuencia de las transacciones; optimizar la combinación de parámetros y la configuración de los costos de las transacciones; ajustar el disco físico y elegir la variedad adecuada.

Dirección de optimización

La estrategia tiene espacio para una mayor optimización, principalmente en lo que respecta a:

  1. Añadir condiciones de filtración para evitar falsas señales. Por ejemplo, en combinación con otros indicadores, hacer condiciones AND u OR para filtrar parte del ruido.
  2. Optimización de la combinación de parámetros. Ajuste el tamaño de nPoints en diferentes variedades y períodos, para mejorar la estabilidad de la estrategia.
  3. Tenga en cuenta los parámetros dinámicos. Permitir que los parámetros de nPoints se ajusten a la volatilidad del mercado puede mejorar la robustez de la estrategia.
  4. Combinación de métodos de aprendizaje automático. Utiliza algoritmos de IA para optimizar los parámetros, las condiciones de filtrado y la selección de variedades múltiples.

Resumir

En general, la idea central de la estrategia es novedosa, ya que utiliza la función de Gauss para ajustar la distribución de precios y ajustar automáticamente el rango de parámetros. Como estrategia de negociación de alta frecuencia, sin embargo, se necesita más prueba y optimización, especialmente en control de riesgo y ajuste de parámetros, para estabilizar las ganancias en el mercado real.

Código Fuente de la Estrategia
/*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.