
La estrategia es un innovador sistema de comercio cuantitativo basado en la teoría de la distribución estadística, que combina los indicadores tradicionales de fuerza múltiple (Bull Bear Power) con la tecnología de adaptación de la distribución. La innovación central de la estrategia consiste en deshacerse de la hipótesis fija de la distribución ortogonal en el análisis técnico tradicional, calcular en tiempo real las características estadísticas de alto nivel de los datos del mercado (pérdida y pico), ajustar dinámicamente los umbrales de transacción para que la generación de señales coincida con las características de distribución real del mercado.
El mecanismo central de funcionamiento de la estrategia incluye los siguientes elementos clave:
Cálculo del PIBA través del cálculo de la suma de la diferencia entre el precio más alto y el EMA (fuerza múltiple) y el precio más bajo y el diferencial entre el EMA (fuerza en blanco), se construye un indicador básico que refleja la comparación de la fuerza múltiple en el mercado. El valor positivo indica la predominancia múltiple y el valor negativo indica la predominancia en blanco.
Análisis de características distribuidas: Utilizando el método de cálculo de la matriz de grado alto, para el análisis estadístico de la secuencia de BBP, se producen las medias, la diferencia estándar, la desviación (la matriz central de grado tres) y el pico excesivo (la matriz central de grado cuatro disminuida) Cuatro estadísticas clave, que muestran de manera completa la forma distribuida de los datos del mercado. La desviación refleja la asimetría de la distribución, y el pico refleja el grosor de la cola y la frecuencia de los eventos extremos.
Generación de umbral adaptativo:
Evaluación del estado del mercado:
Sistema de frenado dinámico:
Generación y ejecución de señales:
Las bases de la teoría estadística son sólidas: Liberación de las estrategias tradicionales de la hipótesis fija de la distribución normal, ajuste de los criterios de decisión en función de la dinámica de las características de la distribución real del mercado, reconstrucción de la lógica de generación de señales desde el nivel estadístico, con un rigoroso apoyo teórico.
La capacidad de adaptación destacaA través de la monitorización en tiempo real de la oscilación y el pico, la estrategia puede identificar automáticamente los cambios en las características de la distribución del mercado. En los mercados de desviación positiva, aumentar los valores al alza para evitar el alza, y en los mercados de cola gruesa, ampliar los valores alza para evitar la reacción excesiva a las fluctuaciones normales, es realmente “hacer que la estrategia se adapte al mercado”.
Evaluación integrada y multidimensionalCombinando las tres dimensiones de la dinámica de los precios, la actividad de los volúmenes de transacción y la posición relativa de los precios, se construye un sistema integral de evaluación de la situación del mercado, evitando la unilateralidad de los juicios de una sola dimensión.
Gestión de riesgos dinámicosEl sistema de frenado de tres niveles está equipado con un mecanismo de ajuste dinámico que permite optimizar la distancia de frenado de acuerdo con el calor del mercado. Capturar plenamente el espacio de ganancias en situaciones de tendencia y cobrar rápidamente en situaciones de debilidad.
La calidad de la señal es alta: A través de la prueba de significación estadística, sólo se puede activar una transacción en un punto de anomalía de la distribución real, reduciendo así la tasa de falsas señales y aumentando la eficacia estadística de la transacción.
Visualización de la intuición: El proceso de adaptación de la estrategia es fácil de entender y monitorear, a través de líneas de referencia de umbral dinámico, referencia de desviación estándar y marcas de señales.
Complejidad de optimización de parámetros altaLa estrategia incluye varios parámetros (niveles de significancia, valores de desviación, valores de pico, multiplicadores de parálisis, etc.), la combinación óptima de parámetros en diferentes entornos de mercado es muy variable y requiere una optimización de parámetros sistemática y verificación de retroalimentación.
La falta de un mecanismo claro para detener los dañosLa estrategia se basa principalmente en la salida de retorno al promedio, sin un alto duro basado en el precio o en el ATR. En un caso extremo de unilateral, si el BBP se mantiene alejado del promedio y no retorna, puede causar grandes pérdidas y ocupación de capital.
La mala adaptabilidad del mercado horizontalEn el contexto de la oscilación estrecha a largo plazo, el BBP se mantiene cerca de la media y no alcanza los mínimos de adaptación, lo que hace que las oportunidades de negociación sean escasas y limita el rendimiento de la estrategia.
Fuerte dependencia de los datosEl análisis de características distribuidas requiere suficientes datos históricos para obtener resultados estadísticos estables y confiables. Las monedas nuevas o los indicadores con datos insuficientes pueden ser inestables en el uso inicial de las estadísticas, lo que afecta el rendimiento de la estrategia.
La complejidad de los cálculos es mayorEl cálculo en tiempo real de la torsión de alta gradación, la clasificación porcentual y el valor de los umbrales dinámicos requiere recorrer los datos históricos, lo que puede provocar problemas de rendimiento en un entorno de negociación con recursos limitados.
Riesgo de las tendencias extremasEn situaciones de unilateral extremo rápido, como un flash crash o un tornado, el BBP puede romper el umbral instantáneamente y regresar rápidamente, lo que hace que el punto de entrada no sea ideal o que se pierda el mejor momento.
Introducción de un mecanismo dinámico de detención de pérdidas:
Mejorar la identificación del entorno del mercado:
Optimización de los parámetros de adaptación:
Mejor calidad de la señal:
Optimización de la gestión de posiciones:
Integración de marcos de tiempo múltiples:
La estrategia de distribución adaptativa de BBP representa un intento innovador de combinar el análisis técnico con la estadística moderna, que resuelve fundamentalmente la dependencia de las estrategias tradicionales en la hipótesis de distribución ortogonal a través de la técnica de adaptación de distribución adaptativa. El valor central de la estrategia radica en su innovación teórica y el respeto por las características de la distribución real del mercado, que permite mantener una calidad de señal razonable en mercados con diferentes formas de distribución.
Sin embargo, también hay un margen de mejora evidente en la estrategia. La falta de un mecanismo claro de detención de pérdidas es el mayor de los puntos débiles, que se debe complementar con prioridad en la aplicación práctica. La complejidad de la optimización de los parámetros y la adaptabilidad de los mercados transversal también deben resolverse mediante la introducción de mecanismos de identificación de entornos de mercado y de adaptación de parámetros.
Esta estrategia ofrece un excelente marco de aprendizaje y mejora para los comerciantes cuantitativos que buscan profundidad teórica y están dispuestos a investigar en profundidad.
En general, se trata de una estrategia innovadora con una sólida base teórica, una lógica de diseño rigurosa y un alto valor de investigación y aplicación, que vale la pena que los operadores cuantitativos exploren en profundidad y optimizen continuamente.
//@version=5
strategy("BBP Adaptive Distribution Strategy [presentTrading]")
//========================================
// BBP策略参数设置
//========================================
lengthInput = input.int(20, "EMA Length");//EMA周期长度
zLength = input.int(150, "Distribution Analysis Period");//分布分析周期
//自适应分布参数组
dist_group = "Distribution Fitting";
//统计显著性水平,0.05表示95%置信度
significance_level = input.float(0.05, "Significance Level", minval=0.01, maxval=0.1, step=0.01,
group=dist_group, tooltip="统计显著性水平,0.05=95%置信度");
//是否启用自适应分布拟合,禁用则使用传统Z-score
auto_fit = input.bool(true, "Auto Fit Distribution", group=dist_group,
tooltip="启用自适应分布拟合,禁用则使用传统Z-score");
//偏度阈值,超过此值考虑使用偏态分布
skew_threshold = input.float(0.5, "Skewness Threshold", minval=0.1, maxval=2.0, group=dist_group,
tooltip="超过此值考虑偏态分布");
//峰度阈值,超过此值考虑使用厚尾分布
kurt_threshold = input.float(1.0, "Kurtosis Threshold", minval=0.3, maxval=3.0, group=dist_group,
tooltip="超过此值考虑厚尾分布");
//========================================
// 止盈参数设置
//========================================
tp_group = "Take Profit Settings";//止盈参数组
useTP = input.bool(true, "Use Take Profit", group=tp_group);//是否启用止盈
baseAtrLength = input.int(20, "ATR Period", minval=1, group=tp_group);//ATR计算周期
atrMult1 = input.float(1.618, "TP1 ATR Multiplier", minval=0.1, step=0.1, group=tp_group);//第一止盈位ATR倍数
atrMult2 = input.float(2.382, "TP2 ATR Multiplier", minval=0.1, step=0.1, group=tp_group);//第二止盈位ATR倍数
atrMult3 = input.float(3.618, "TP3 ATR Multiplier", minval=0.1, step=0.1, group=tp_group);//第三止盈位ATR倍数
tp1_size = input.float(13, "TP1 Position %", minval=1, maxval=100, group=tp_group);//第一止盈位仓位百分比
tp2_size = input.float(13, "TP2 Position %", minval=1, maxval=100, group=tp_group);//第二止盈位仓位百分比
tp3_size = input.float(13, "TP3 Position %", minval=1, maxval=100, group=tp_group);//第三止盈位仓位百分比
//========================================
// 成交量分析参数设置
//========================================
vol_group = "Volume Analysis Settings";//成交量分析参数组
vol_period = input.int(100, "Volume MA Period", minval=1, group=vol_group);//成交量均线周期
vol_high = input.float(2.0, "High Volume Multiplier", minval=1.0, step=0.1, group=vol_group);//高成交量倍数
vol_med = input.float(1.5, "Medium Volume Multiplier", minval=1.0, step=0.1, group=vol_group);//中成交量倍数
vol_low = input.float(1.0, "Low Volume Multiplier", minval=0.5, step=0.1, group=vol_group);//低成交量倍数
vol_high_mult = input.float(1.5, "High Volume Factor", minval=0.1, step=0.1, group=vol_group);//高成交量系数
vol_med_mult = input.float(1.3, "Medium Volume Factor", minval=0.1, step=0.1, group=vol_group);//中成交量系数
vol_low_mult = input.float(1.0, "Low Volume Factor", minval=0.1, step=0.1, group=vol_group);//低成交量系数
//========================================
// 百分位分析参数设置
//========================================
perc_group = "Percentile Analysis Settings";//百分位分析参数组
perc_period = input.int(100, "Percentile Period", minval=20, group=perc_group);//百分位计算周期
perc_high = input.float(90, "High Percentile", minval=50, maxval=100, group=perc_group);//高百分位阈值
perc_med = input.float(80, "Medium Percentile", minval=50, maxval=100, group=perc_group);//中百分位阈值
perc_low = input.float(70, "Low Percentile", minval=0, maxval=100, group=perc_group);//低百分位阈值
perc_high_mult = input.float(1.5, "High Percentile Factor", minval=0.1, step=0.1, group=perc_group);//高百分位系数
perc_med_mult = input.float(1.3, "Medium Percentile Factor", minval=0.1, step=0.1, group=perc_group);//中百分位系数
perc_low_mult = input.float(1.0, "Low Percentile Factor", minval=0.1, step=0.1, group=perc_group);//低百分位系数
//========================================
// 核心多空力量计算
//========================================
//计算价格的指数移动平均
emaClose = ta.ema(close, lengthInput);
//多头力量:最高价与EMA的差值
bullPower = high - emaClose;
//空头力量:最低价与EMA的差值
bearPower = low - emaClose;
//多空力量平衡:多头力量加上空头力量
bbp = bullPower + bearPower;
//计算分布的高阶矩:均值、标准差、偏度、峰度
calcDistributionMoments(src, length) =>
mean = ta.sma(src, length);//计算均值
variance = ta.variance(src, length);//计算方差
stddev = math.sqrt(variance);//计算标准差
//初始化偏度和峰度累加变量
skew_sum = 0.0;
kurt_sum = 0.0;
//当标准差大于0时,计算偏度和峰度
if stddev > 0
for i = 0 to math.min(length - 1, 100)
z = (src[i] - mean) / stddev;//计算标准化值
z2 = z * z;//计算Z的平方
skew_sum += z * z2;//累加偏度项
kurt_sum += z2 * z2;//累加峰度项
n = math.min(length, 100);//取样本数
skewness = skew_sum / n;//计算偏度
excess_kurtosis = kurt_sum / n - 3.0;//计算超额峰度
[mean, stddev, skewness, excess_kurtosis];//返回四个统计量
//自适应阈值计算:根据分布特征动态调整阈值
calcAdaptiveThreshold(mu, sigma, skew, kurt, alpha, use_adaptive) =>
//计算标准正态分位数(基础Z值)
z_base = math.sqrt(-2.0 * math.log(alpha / 2.0));
z_adjusted = z_base;//初始化调整后的Z值
//如果启用自适应拟合,则进行分布修正
if use_adaptive
//厚尾修正:使用t分布近似,当峰度超过阈值时调整
if math.abs(kurt) > kurt_threshold
df = math.max(6.0 / math.abs(kurt) + 4.0, 5.0);//计算自由度
z_adjusted := z_adjusted * math.sqrt(df / (df - 2.0));//调整Z值
//偏度修正:使用Cornish-Fisher展开式,当偏度超过阈值时调整
if math.abs(skew) > skew_threshold
z_adjusted := z_adjusted + skew * (z_adjusted * z_adjusted - 1.0) / 6.0;//应用偏度修正
//计算上下阈值
upper_threshold = mu + sigma * z_adjusted;
lower_threshold = mu - sigma * z_adjusted;
[upper_threshold, lower_threshold];//返回上下阈值
//执行分布分析:计算BBP的均值、标准差、偏度和峰度
[mu, sigma, skewness, kurtosis] = calcDistributionMoments(bbp, zLength);
//计算自适应阈值:基于统计特征动态确定交易阈值
[upper_threshold, lower_threshold] = calcAdaptiveThreshold(mu, sigma, skewness, kurtosis,
significance_level, auto_fit);
//========================================
// 成交量与百分位分析
//========================================
vol_sma = ta.sma(volume, vol_period);//计算成交量简单移动平均
vol_mult = volume / vol_sma;//计算当前成交量相对于均值的倍数
//计算百分位排名:返回当前值在历史数据中的百分位位置
calcPercentile(src) =>
var values = array.new_float(0);//初始化数组
array.unshift(values, src);//将新值插入数组头部
if array.size(values) > perc_period
array.pop(values);//超过周期长度时删除尾部元素
//计算百分位排名
array.size(values) > 0 ? array.percentrank(values, array.size(values)-1) * 100 : 50;
price_perc = calcPercentile(close);//计算价格百分位
vol_perc = calcPercentile(volume);//计算成交量百分位
//计算止盈系数:综合成交量和价格百分位评分
getTpFactor() =>
//根据成交量倍数评分
vol_score = vol_mult > vol_high ? vol_high_mult : vol_mult > vol_med ? vol_med_mult : vol_mult > vol_low ? vol_low_mult : 0.8;
//根据价格百分位评分
price_score = price_perc > perc_high ? perc_high_mult : price_perc > perc_med ? perc_med_mult : price_perc > perc_low ? perc_low_mult : 0.8;
math.avg(vol_score, price_score);//返回两个评分的平均值
//========================================
// 入场出场逻辑
//========================================
//多头入场条件:BBP向上突破上阈值
longCondition = ta.crossover(bbp, upper_threshold);
//空头入场条件:BBP向下跌破下阈值
shortCondition = ta.crossunder(bbp, lower_threshold);
//多头出场条件:BBP向下跌破均值
exitLongCondition = ta.crossunder(bbp, mu);
//空头出场条件:BBP向上突破均值
exitShortCondition = ta.crossover(bbp, mu);
//========================================
// 交易执行逻辑
//========================================
//在K线确认后执行交易
if (barstate.isconfirmed)
if longCondition
strategy.entry("Long", strategy.long);//开多头仓位
if shortCondition
strategy.entry("Short", strategy.short);//开空头仓位
if exitLongCondition
strategy.close("Long");//平多头仓位
if exitShortCondition
strategy.close("Short");//平空头仓位
//========================================
// 止盈执行逻辑
//========================================
//当启用止盈且持有仓位时执行止盈逻辑
if useTP and strategy.position_size != 0
base_move = ta.atr(baseAtrLength);//计算基础ATR值
tp_factor = getTpFactor();//获取止盈系数
is_long = strategy.position_size > 0;//判断是否为多头仓位
entry_price = strategy.position_avg_price;//获取入场均价
//多头止盈设置
if is_long
tp1_price = entry_price + (base_move * atrMult1 * tp_factor);//计算第一止盈价
tp2_price = entry_price + (base_move * atrMult2 * tp_factor);//计算第二止盈价
tp3_price = entry_price + (base_move * atrMult3 * tp_factor);//计算第三止盈价
strategy.exit("TP1", "Long", qty_percent=tp1_size, limit=tp1_price);//设置第一止盈
strategy.exit("TP2", "Long", qty_percent=tp2_size, limit=tp2_price);//设置第二止盈
strategy.exit("TP3", "Long", qty_percent=tp3_size, limit=tp3_price);//设置第三止盈
else
//空头止盈设置
tp1_price = entry_price - (base_move * atrMult1 * tp_factor);//计算第一止盈价
tp2_price = entry_price - (base_move * atrMult2 * tp_factor);//计算第二止盈价
tp3_price = entry_price - (base_move * atrMult3 * tp_factor);//计算第三止盈价
strategy.exit("TP1", "Short", qty_percent=tp1_size, limit=tp1_price);//设置第一止盈
strategy.exit("TP2", "Short", qty_percent=tp2_size, limit=tp2_price);//设置第二止盈
strategy.exit("TP3", "Short", qty_percent=tp3_size, limit=tp3_price);//设置第三止盈
//========================================
// 图表绘制
//========================================
//绘制BBP柱状图:多头力量为绿色,空头力量为红色
plot(bbp, color=bbp >= mu ? color.new(color.green, 0) : color.new(color.red, 0),
title="BBPower", style=plot.style_columns);
//绘制均值线
plot(mu, "Mean", color=color.gray, linewidth=1, style=plot.style_line);
//绘制上阈值线
plot(upper_threshold, "Upper Threshold", color=color.orange, linewidth=2);
//绘制下阈值线
plot(lower_threshold, "Lower Threshold", color=color.orange, linewidth=2);
//绘制参考线:正负1倍标准差
plot(mu + sigma, "+1σ", color=color.new(color.blue, 70), linewidth=1, style=plot.style_circles);
plot(mu - sigma, "-1σ", color=color.new(color.blue, 70), linewidth=1, style=plot.style_circles);
//绘制参考线:正负2倍标准差
plot(mu + 2*sigma, "+2σ", color=color.new(color.purple, 70), linewidth=1, style=plot.style_cross);
plot(mu - 2*sigma, "-2σ", color=color.new(color.purple, 70), linewidth=1, style=plot.style_cross);
//========================================
// 信号标记
//========================================
//绘制多头信号标记
plotshape(longCondition, title="Long Signal", location=location.bottom,
color=color.new(color.green, 0), style=shape.labelup, text="LONG",
textcolor=color.white, size=size.small);
//绘制空头信号标记
plotshape(shortCondition, title="Short Signal", location=location.top,
color=color.new(color.red, 0), style=shape.labeldown, text="SHORT",
textcolor=color.white, size=size.small);