
La estrategia se basa en el concepto estadístico de Z-Score, que se utiliza para identificar la desviación estadística de los precios con respecto a sus medias locales. La estrategia calcula el Z-Score del precio de cierre y luego aplica medias móviles a corto y largo plazo para suavizar el Z-Score.
El núcleo de esta estrategia es el cálculo y la aplicación de la puntuación Z. La puntuación Z es una estadística utilizada para medir el grado de desviación de un punto de datos respecto a la media de la muestra, en unidades de diferencia estándar. En esta estrategia, la fórmula para calcular la puntuación Z es: Z = (precio de cierre - SMA ((precio de cierre, N)) / STDEV ((precio de cierre, N)) Donde N es el ciclo básico definido por el usuario.
El proceso de ejecución de la política es el siguiente:
Las condiciones adicionales incluyen:
La solución:
La estrategia de negociación estadística de precios optimizada por dinámica basada en el cruce de la calificación Z es un sistema de negociación sencillo basado en principios estadísticos que se centra en capturar la desviación y la regresión de los precios con respecto a sus medias locales. Mediante el procesamiento de la suavización, el control del intervalo de la señal y el filtro de la dinámica, la estrategia reduce efectivamente el ruido de la negociación y mejora la calidad de la señal. La estrategia es especialmente adecuada para productos financieros con mercados inestables y comportamientos de regresión de la media.
Sin embargo, la estrategia también tiene algunas limitaciones, como la dependencia de hipótesis estadísticas, sensibilidad de parámetros y decisiones de un solo factor. Mediante la adición de medidas de optimización como la identificación de tendencias, ajuste de volatilidad, análisis de múltiples marcos de tiempo, mecanismos de parada de pérdidas, confirmación de la cantidad de transacciones y combinaciones de múltiples factores, se puede mejorar significativamente la robustez y el rendimiento de la estrategia.
En general, se trata de un marco estratégico con una sólida base teórica, que permite una estrategia concisa, fácil de entender y ampliar, adecuada para ser un componente básico de un sistema de negociación o una herramienta educativa para ayudar a los comerciantes a comprender la aplicación de la estadística en el comercio.
/*backtest
start: 2024-06-03 00:00:00
end: 2025-06-02 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/
//@version=6
strategy("Price Statistical Strategy-Z Score V 1.01", overlay=true)
// === Enable / Disable Z-Score Strategy Block ===
enableZScore = input.bool(true, title="Enable Smoothed Z-Score Strategy", tooltip="When enabled, this block calculates a smoothed Z-Score of the closing price and generates entry/exit signals based on crossover behavior between short-term and long-term smoothed Z-Scores.\n\nRecommended for quick and classic detection of price deviation from mean.\nSensitive to outliers. Best suited for relatively normal-distributed market conditions.")
// === Z-Score Parameters ===
zBaseLength = input.int(3, minval=1, title="Z-Score Base Period")
shortSmooth = input.int(3, title="Short-Term Smoothing")
longSmooth = input.int(5, title="Long-Term Smoothing")
// === Z-Score Calculation Function ===
f_zscore(src, length) =>
mean = ta.sma(src, length)
std_dev = ta.stdev(src, length)
z = (src - mean) / std_dev
z
// === Z-Score Logic ===
zRaw = f_zscore(close, zBaseLength)
zShort = ta.sma(zRaw, shortSmooth)
zLong = ta.sma(zRaw, longSmooth)
// === Minimum gap between identical signals ===
gapBars = input.int(5, minval=1, title="Bars gap between identical signals", tooltip="Minimum number of bars required between two identical signals (entry or exit). Helps reduce signal noise.")
// === Candle-based momentum filters ===
bullish_3bars = close > close[1] and close[1] > close[2] and close[2] > close[3] and close[3] > close[4]
bearish_3bars = close < close[1] and close[1] < close[2] and close[2] < close[3] and close[3] < close[4]
// === Entry and Exit Logic with minimum signal gap and candle momentum filter ===
var int lastEntryBar = na
var int lastExitBar = na
if enableZScore
longCondition = (zShort > zLong)
exitCondition = (zShort < zLong)
if longCondition and (na(lastEntryBar) or bar_index - lastEntryBar > gapBars) and not bullish_3bars
strategy.entry("Z Score", strategy.long)
lastEntryBar := bar_index
if exitCondition and (na(lastExitBar) or bar_index - lastExitBar > gapBars) and not bearish_3bars
strategy.close("Z Score", comment="Z Score")
lastExitBar := bar_index
// === Real-time PnL Table for Last Open Position ===
var table positionTable = table.new(position.bottom_right, 2, 2, border_width=1)
// Header Labels
table.cell(positionTable, 0, 0, "Entry Price", text_color=color.white, bgcolor=color.gray)
table.cell(positionTable, 1, 0, "Unrealized PnL (%)", text_color=color.white, bgcolor=color.gray)
// Values (only when position is open)
isLong = strategy.position_size > 0
entryPrice = strategy.position_avg_price
unrealizedPnL = isLong ? (close - entryPrice) / entryPrice * 100 : na
// Define dynamic text color for PnL
pnlColor = unrealizedPnL > 0 ? color.green : unrealizedPnL < 0 ? color.red : color.gray
// Update Table Content
if isLong
table.cell(positionTable, 0, 1, str.tostring(entryPrice, "#.####"), text_color=color.gray, bgcolor=color.new(color.gray, 90))
table.cell(positionTable, 1, 1, str.tostring(unrealizedPnL, "#.##") + " %", text_color=pnlColor, bgcolor=color.new(pnlColor, 90))
else
table.cell(positionTable, 0, 1, "—", text_color=color.gray, bgcolor=color.new(color.gray, 90))
table.cell(positionTable, 1, 1, "—", text_color=color.gray, bgcolor=color.new(color.gray, 90))