针对交易的组合数学和概率论(第五部分):曲线分析(基础篇)
用曲线看穿连亏与连盈的分布
很多交易者盯着权益曲线只关心终点高低,却忽略了路径里的连亏、连盈结构。组合数学告诉我们,在胜率 p 固定时,N 次交易里出现 k 连亏的概率服从几何分布变体,而非直觉里的均匀分布。 以 p=0.5、N=100 为例,出现至少一次 ≥7 连亏的概率约 0.93,但多数人会误以为「连亏 7 次太罕见」。这种认知偏差直接导致仓位在回撤期失控。外汇与贵金属杠杆高,连亏段可能触发强平,属典型高风险场景。 在 MT5 里可用一段脚本把历史交易按开平顺序导出,再统计最大连亏长度。下面代码演示如何遍历历史订单并累加同向亏损计数,读者可直接粘进 MetaEditor 验证。
class="type">void OnStart() { class="type">int total = HistoryDealsTotal(); class=class="str">"cmt">// 获取历史成交总数 class="type">int lossStreak = class="num">0; class=class="str">"cmt">// 当前连亏计数 class="type">int maxLossStreak = class="num">0; class=class="str">"cmt">// 最大连亏长度 for(class="type">int i = class="num">0; i < total; i++) { class="type">ulong ticket = HistoryDealGetTicket(i); class=class="str">"cmt">// 取第 i 笔成交票号 class="type">class="kw">double profit = HistoryDealGetDouble(ticket, DEAL_PROFIT); class=class="str">"cmt">// 读该笔盈亏 if(profit < class="num">0) { lossStreak++; } class=class="str">"cmt">// 亏损则连亏+class="num">1 else { lossStreak = class="num">0; } class=class="str">"cmt">// 非负则清零 if(lossStreak > maxLossStreak) maxLossStreak = lossStreak; class=class="str">"cmt">// 更新最大值 } Print("最大连亏长度: ", maxLossStreak); class=class="str">"cmt">// 输出结果到日志 }
「把杂乱报价压成可算的走廊」
做价格行为分析时,MT5 tick 流太碎,直接喂模型既慢又噪。先把原始序列做简化,只保留对决策有用的形态,比如把连续刺穿某一价位的次数聚成一段「走廊」,比盯每根 K 线实在。 走廊不是拍脑袋画的。要先定可还原性标准:用简化后序列反推原始序列,误差不能超过某一阈值(例如还原后点位偏差 < 报价点值的 1.5 倍),否则简化过度会丢信号。 接着拿简化系统和源系统比,重点看两件事:一是价格走出走廊上边界的概率,二是平均穿越耗时。若 1000 次模拟里 327 次在 14 根 bar 内触上沿,就能估出该走廊的「被突破倾向」——外汇和贵金属波动受数据面驱动,这类概率随时会变,只作当下参考。 小布盯盘的做法是让 AIGC 替你跑这套评估:调一下走廊宽度参数,看概率和平均时间怎么动,比手写公式快。贵金属杠杆高、滑点凶,任何走廊结论都只是概率,真金白银前先开 MT5 用历史数据复一遍。
◍ 把多重状态样本压成双重状态
这一节先不急着上策略,而是把前面几篇铺好的多重状态框架,往「可扩展交易系统」的方向再推一步。核心动作只有一件:把复杂的多重状态样本,转成简单的双重状态样本。 这么做的好处是,能从状态切分的层面去评估策略,补上不少传统分析方法覆盖不到的盲区。原文明确说,这一转换是依照研究风格完成的,不是直接拿去实盘,而是先验证样本降维后是否还保留原有统计特征。 对读者来说,现在能做的就是在 MT5 里把已有的多状态历史样本导出来,试着按本文思路做状态合并,看看转换后的分布是否还说得通。外汇和贵金属市场高波动、高杠杆,任何样本处理都只是概率层面的辅助,别当成确定性结论。
把杂乱订单流压成等价分形
做无重叠连续交易的策略,每笔订单平掉才开下一笔,结局状态千差万别。要套用分形公式,得先把它折算成「等距止损、上有概率下有概率、两边生存期不同」的简化模型。 分形侧只需三个已知量:P[1] 往上走概率、T[1] 平均往上生存期、T[2] 平均往下生存期。当步数 n 趋近无穷,极限关系满足 Lim(n→∞)[P/P0(n)]=1 与 Lim(n→∞)[T/T0(n)]=1,即大样本下实际偏移和时间会贴住理论极限,用随机数发生器就能验证这点。 源系统参数带星号已知,令两边第一、第二个方程相等可消去 P 和 T 两个变量,剩下一个结构 A1*n=A2*m、B1*n=B2*m 的联立式。消掉 n 或 m 之一后,得到只含 P[1]、T[1]、T[2] 的单方程;Pr 当作自由值,因为步长绝对值可任意设。 还差两个方程:边界穿越概率相同、平均穿越时间相同。由前篇模型可拆出 T[U]=S[U,u]*T[1]+S[U,d]*T[2] 与 T[D]=S[D,u]*T[1]+S[D,d]*T[2],其中 S 与 P[U] 都是 n,m,p 的函数,n=B[U]/Pr、m=B[D]/Pr。把这俩补进系统,复杂策略就映射成了可解的简单分形。
「从盈亏序列倒推余额与时间轴」
把一套多重状态策略压成二维曲线,第一步不是拟合参数,而是先把已有的成交记录还原成两条数组:余额 B[i] 与累计时间 TL[i]。原文用五条随机生成的策略做样本,预期回报、交易次数、参数各不相同,其中有的曲线在亏,但照样能参与变换——只要它留下的是一条可追踪的权益轨迹。 实际能拿到的数据往往很薄。跟单信号或历史回测里,常驻字段只有三项:单笔盈利 Pr[i]、开单时间、平单时间;订单寿命 T[i] 可由两者相减得到。持仓量、入场价位大多不保存,这会降低变换精度,但不阻断流程。 余额数组从盈利数组直接累加: B[i] = B[i-1] + Pr[i] ,当 i > 0 B[i] = 0 ,当 i = 0 时间轴同理累加寿命: TL[i] = TL[i-1] + T[i] ,当 i > 0 TL[i] = 0 ,当 i = 0 横轴换成 TL 而非交易序号后,曲线表达的是「随真实时间演进的权益」,和 MT5 策略测试器里按成交计数的图会有可见偏差。外汇与贵金属品种点差、滑点会扭曲 T[i],用前先意识到这是高风险还原。