
この戦略は,統計分布理論に基づく革新的な量化取引システムで,伝統的な多空力指標 ((Bull Bear Power) を自適配配合技術と組み合わせている.戦略の核心的な革新は,伝統的な技術分析の正規分布の固定仮定から解放され,市場データの高階統計特性をリアルタイムで計算し,取引の値を動的に調整し,シグナル生成を市場の実際の分布特性と一致させる.また,ATRと市場状態の評価に基づいた3段階のダイナミックストップシステムを装備し,異なる市場環境に精密に適応する.この戦略は,分布特性が顕著な暗号通貨市場には特に適しており,統計学的に意味のある真の異常を効果的に識別し,分布假設による誤ったシグナルを避ける.
戦略の核心的な仕組みは,以下の重要な要素で構成されています.
GDP指数の計算:最高価格とEMAの差値 (多頭力) と最低価格とEMAの差値 (空頭力) の和を計算することによって,市場空頭力の対比を反映する基礎指標を構成する.正値は多頭優勢を示し,負値は空頭優勢を示している.
分布特征分析:高階矩計算方法を用いてBBP序列を統計的に分析し,出力平均値,標準差,偏度 (三階中央矩) と超峰度 (四階中央矩減3) の4つの重要な統計量,市場データの分布形状を全面的に描写する.偏度は分布の非対称性を反映し,ピークは尾の厚さと極端なイベントの頻度を反映する.
値の自作生成:
市場状況の評価:
ダイナミック・ストップシステム:
信号生成と実行:
統計学理論の基礎はしっかりしている: 正常分布に関する固定仮定を伝統的な戦略から取り除き,市場の実際の分布特性の動向に基づいて意思決定基準を調整し,統計学的レベルから信号生成ロジックを再構成し,厳格な理論的支持を有する.
適応力に優れている:偏差とピーク度のリアルタイムモニタリングにより,戦略は市場分布特性の変化を自動的に識別することができる.正偏差市場では上値の上昇を回避し,厚尾市場では下値の範囲を拡大し,通常の波動に過度に反応しないようにし,本当に”戦略を市場に適応させる”を実現する.
多次元統合評価価格動力,取引量活力,価格の相対位置の3つの次元を組み合わせて,単一次元判断の片面性を避けるために,市場状態の総合的な評価システムを構築する.
ダイナミックなリスク管理三層ストップシステムは,ダイナミックな調整メカニズムを備えており,市場の熱に合わせてストップ距離を最適化できます.トレンドの状況で利益のスペースを十分に捕捉し,弱気な状況で迅速に収益を還元します.
信号の質は高い: 統計的有意性検査により,真の分布の異常点のみで取引を誘発し,偽信号率を効果的に低下させ,取引の統計的有効性を向上させる.
視覚化直観: 動的値線,標準差参照線,信号標識により,戦略の自律的調整プロセスを明確に表示し,理解し,監視する.
パラメータ最適化の複雑さ戦略には複数のパラメータが含まれています (注: 顕著なレベル,偏差の値,ピークの値,止まりの倍数など),異なる市場環境における最適なパラメータの組み合わせは大きく異なっており,体系的なパラメータ最適化と反測検証が必要です.
明確な停止メカニズムがない策略は主に平均値の回帰出場に依存し,価格またはATRに基づくハードストップがない.極端な一方的な状況では,BBPが平均値から継続的に逸脱して回帰しない場合,大きな浮動と資金占有が起こり得る.
横盤市場への適応力低下長期の狭い波動の状況では,BBPは平均値の近くで上昇し,自律的な低値に触れるのは困難であり,取引機会が稀になり,戦略のパフォーマンスは制限されます.
データ依存度が高い分布特征分析は,安定した信頼性の高い統計的結果を得るためには十分な歴史的データが必要です. 新規上場通貨またはデータ不足の標識は,初期の使用時に統計量が不安定になり,戦略のパフォーマンスを影響する可能性があります.
計算の複雑さリアルタイムで高階マッチ,パーセンテージランキング,動的値を計算するには,歴史データを通過する必要があります.リソースが限られた取引環境では,性能のボトルネックが発生する可能性があります.
極端な状況のリスクBBPは,閃乱や暴風のような極端に速い単一行情で,瞬く間に値を破り,すぐに戻り,入場地点が望ましくないか,最適なタイミングを逃す可能性があります.
ダイナミック・ストップ・メカニズムの導入:
市場環境の認識を強化する:
パラメータの自主最適化:
信号の質が向上する:
ポジション管理の最適化:
複数の時間枠の統合:
BBP自己適応分布戦略は,技術分析と現代統計学の組み合わせの革新的な試みを表し,自己適応分布マッチング技術によって,従来の戦略が正規分布の仮定に依存している問題を根本的に解決している.戦略の核心価値は,その理論的革新性と市場の実際の分布特性の尊重であり,異なる分布形状の市場で合理的な信号品質を維持することができる.三層のダイナミックストップシステムは,戦略の実用性をさらに強化し,利益とリスクの良いバランスを実現している.
しかし,戦略にも明らかに改善の余地がある.明確な止損機構の欠如が最大の短板であり,実用的な応用で優先的に補足する必要がある.パラメータ最適化の複雑さと横盤市場の適応性の問題は,市場環境の認識とパラメータ自適応機構の導入によって解決する必要がある.
この戦略は,理論的な深さを求め,深入に研究したい人にとって,学習と改善のための優れた枠組みを提供します.
全体として,これは理論的な基礎が堅牢で,設計論理が厳格で,研究と応用価値が高い革新的な戦略であり,量化トレーダーが深く探求し,継続的に最適化する価値があります.
//@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);