
이 전략은 통계적 분산 이론에 기반한 혁신적인 양적 거래 시스템으로, 전통적인 다공간 힘 지표 ((Bull Bear Power) 와 적응적 분산 적합 기술을 결합한다. 전략의 핵심 혁신은 전통적인 기술 분석에 대한 정형 분포의 고정된 가정에서 벗어나, 시장 데이터의 고위 계층 통계적 특성을 실시간으로 계산함으로써 거래 마이너스를 동적으로 조정하여 신호 생성을 시장의 실제 분산 특성과 일치시킨다. ATR 및 시장 상태 평가에 기반한 3단 동적 정지 시스템을 갖추고 있으며, 다양한 시장 환경에 대한 정밀 적응을 실현한다. 이 전략은 특히 분산 특성이 뚜렷한 암호화폐 시장에 적합하며, 분산 가정으로 인해 잘못된 신호를 유발하는 통계적 의미의 실제 오차를 효과적으로 식별하고, 가짜 신호를 피한다.
전략의 핵심 운영 메커니즘은 다음과 같은 핵심 요소입니다.
GDP 지수 계산: 최고 가격과 EMA의 차치 ((多頭力) 과 최저 가격과 EMA의 차치 ((空頭力) 의 합을 계산하여 시장의 공백력 대조를 반영하는 기본 지표를 구성한다. 긍정적 값은 다頭優勢, 부정적인 값은空頭優勢이다.
분산 특성 분석: 높은 계층 모트 계산 방법을 사용하여 BBP 서열을 통계적으로 분석하고, 출력 평균, 표준 차, 오차 (三級中心矩) 및 초과 피크 (三級中心矩) 및 초과 피크 (四級中心矩减) 3를 사용합니다. 시장 데이터의 분포 형태를 포괄적으로 묘사하는 4 가지 핵심 통계. 오차는 분포의 비대칭성을 반영하고, 피크는 꼬리 두께와 극단적 사건의 빈도를 반영합니다.
자율적 값 생성:
시장 상태 평가:
동적 차단 시스템:
신호 생성 및 실행:
통계학 이론 기초가 튼튼하다: 전통적인 전략의 정형 분포에 대한 고정된 가정에서 벗어나, 시장의 실제 분포 특성에 따라 결정 기준을 동적으로 조정하고, 통계적 수준에서 신호 생성 논리를 재구성하여 엄격한 이론적 지원을 한다.
적응력이 뛰어나다: 편향과 피크도의 실시간 모니터링을 통해, 전략은 시장 분포 특성의 변화를 자동으로 식별할 수 있다. 긍정적인 편향 시장에서 상향 하락을 높여 추격 하락을 피하고, 두꺼운 꼬리 시장에서 하락 범위를 확장하여 정상적인 변동에 과잉 반응하지 않도록, 실제로 “전략을 시장에 적응하도록”한다.
다차원 통합 평가가격 동력, 거래량 활동 및 가격의 상대적 위치의 세 차원을 결합하여 단일 차원의 판단의 일방성을 피하는 포괄적 인 시장 상태 평가 시스템을 구축하십시오.
동적 위험 관리3단계 정지 시스템은 동적 조정 메커니즘과 함께 시장의 열에 따라 정지 거리를 최적화 할 수 있습니다. 추세 상황에서 수익 공간을 충분히 포착하고, 약한 상황에서 수익을 빠르게 현금화하십시오.
신호 품질: 통계적 유의성 검사를 통해 실제 분포의 비정상적인 점에서만 거래를 유발하여 가짜 신호율을 효과적으로 감소시키고 거래의 통계적 유효성을 향상시킨다.
시각화 직관: 동적 미지수선, 표준 오차 참조선 및 신호 표기, 명확하게 전략의 적응 조정 과정을 보여줍니다. 이해하기 쉽고 모니터링하기 쉽다.
매개 변수 최적화 복잡도 높다전략에는 여러 파라미터가 포함되어 있습니다. (중시 수준, 편향 값, 최고 값, 정지 배수 등), 다양한 시장 환경에서 최적의 파라미터 조합이 큰 차이가 있으며, 체계적인 파라미터 최적화 및 재검토 검증이 필요합니다.
명확한 차단 장치의 부재전략은 주로 평균값으로 돌아오는 출전에 의존하며, 가격이나 ATR에 기반한 하드 스톱 손실이 없습니다. 극단적인 일방적인 상황에서, BBP가 평균값에서 계속 벗어나지 않고 돌아가지 않으면 큰 부진과 자본 점유가 발생할 수 있습니다.
수평 시장의 적응력이 낮다: 장기간 좁은 폭동 상황에서는 BBP 값이 평균 근처에서 상승하여 적응 하락을 만지지 못하여 거래 기회가 희박하고 전략적 성능이 제한됩니다.
데이터 의존성: 분산 특성 분석은 충분한 역사적 데이터가 있어야 안정적이고 신뢰할 수 있는 통계 결과를 얻을 수 있다. 신규 상장된 코인이나 데이터가 부족한 지표는 초기 사용 시 통계량이 불안정하여 전략의 성과에 영향을 줄 수 있다.
계산의 복잡성이 높습니다.: 실시간 계산 고단계 모트, 퍼센티지 순위 및 동적 절댓값은 역사 데이터를 거쳐서 리소스 제한 거래 환경에서 성능 병목에 직면할 수 있습니다.
극단적 인 위험급격한 급격한 일방적인 상황, 예를 들어 플래시나 태풍에서, BBP는 순간적으로 경계를 돌파하고 빠르게 되돌아 갈 수 있으며, 입점 지점이 좋지 않거나 최적의 시기를 놓치게 된다.
다이내믹 스피드 메커니즘 도입:
시장 환경 인식 강화:
변수 적응 최적화:
신호 품질 향상:
포지션 관리 최적화:
다중 시간 프레임 통합:
BBP 자기 적응 분포 전략은 기술 분석과 현대 통계학을 결합한 혁신적인 시도를 나타내고, 자기 적응 분포 적합 기술을 통해 전통적인 전략의 정규 분포 가설에 대한 의존 문제를 근본적으로 해결한다. 전략의 핵심 가치는 이론적 혁신성과 시장의 실제 분포 특성에 대한 존중이며, 다양한 분포 형태의 시장에서 합리적인 신호 품질을 유지할 수 있다. 3단 동적 정지 시스템은 전략의 실용성을 더욱 강화하고, 수익과 위험의 좋은 균형을 이룬다.
그러나, 전략에 있어서도 개선할 여지가 분명하다. 명확한 스톱로스 메커니즘이 없는 것이 가장 큰 단점이며, 실제 적용에서 우선적으로 보완할 필요가 있다. 매개 변수 최적화의 복잡성과 가로판 시장의 적응성 문제는 또한 시장 환경 식별과 매개 변수 자조 메커니즘을 도입함으로써 해결될 필요가 있다.
이론적 심층을 추구하고 깊이 연구하려는 수량 거래자들에게 이 전략은 훌륭한 학습 및 개선 프레임워크를 제공합니다. 실무시장에 적용하기 전에 다음과 같이 권장합니다.
전체적으로, 이것은 이론적 기반이 튼튼하고, 디자인 논리가 엄격하며, 높은 연구와 응용 가치가 있는 혁신적인 전략이며, 양자 거래자가 깊이 탐구하고 지속적으로 최적화 할 가치가 있습니다.
//@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);