基于凌波,概率游戏升级版
凌波的《概率游戏》将交易从预测活动重新定义为概率管理活动。其核心论点是:任何单笔交易结果都无法确定性地预测,但经过大量交易后,具有真正统计优势的系统将产生可靠利润——就像赌场无法预测任何一手二十一点的结果,但可以可靠地预测其月度收入一样。
这种范式转变是根本性的。大多数A股散户将每笔交易视为孤立事件,寻求"这只股票是否会上涨"的确定性答案。凌波的框架则问:"这个交易模式,在 100 次交易中,是否产生正期望值?"
本书的核心类比是赌场。赌场是概率交易者的模型:
| 赌场原则 | 交易应用 |
|---|---|
| 赌场有微小但一致的优势 | 交易者的系统具有正期望值 |
| 单个赌注不可预测 | 单笔交易不可预测 |
| 优势在大量赌注中体现 | 优势在大量交易中体现 |
| 赌注限制控制风险 | 仓位规模控制风险 |
| 赌场从不追逐亏损 | 交易者无论近期结果如何都遵守系统 |
| 赌场每天营业 | 交易者抓住每个有效信号 |
凌波确定了散户失败的根本原因:将交易视为确定性游戏而非概率游戏,表现为:
真理 1:任何单笔交易都可能亏损,无论建仓看起来多么完美。即使系统有 70% 的胜率,也会亏损 30% 的时间。三连败在一个 70% 胜率的系统中并不罕见——大约发生 2.7% 的情况,意味着大约每 37 笔交易会发生一次
真理 2:优势只存在于总体中,不存在于任何单笔交易中。"就这一次"偏离系统的交易者正在破坏使系统盈利的统计基础
真理 3:交易者的工作不是每笔交易都正确,而是确保盈利交易集体产生的利润超过亏损交易集体产生的亏损。这是一个数学问题,不是预测问题
| 确定性思维 | 概率思维 |
|---|---|
| "这只股票会上涨" | "这个模式有 60% 的盈利概率" |
| 亏损 = 失败,糟糕分析的证明 | 亏损 = 经营成本 |
| 寻求确认 | 寻求证伪 |
| 亏损后调整仓位(报复性交易) | 机械地遵守系统 |
| 评估单笔交易 | 评估交易序列 |
| 对结果情绪化反应 | 对结果中性反应 |
凌波教导交易者以条件概率的术语思考。不是简单地问"盈利的概率是多少",而是"在特定条件集合下盈利的概率是多少":
在任何特定建仓模式之前,交易者应该了解基础比率:
任何交易系统都必须明显优于基础比率。如果随机买入有 50% 的胜率,那么胜率仅 52% 的系统仅比随机略好,不值得交易成本
随着交易过程中新信息的到来,更新概率评估:
伪代码:贝叶斯交易评估
─────────────────────────────────────────────
initial_probability = 0.60 # 基于入场模式
# 第2天:股票向上突破但成交量低
volume_factor = 0.90 # 略负面——低成交量突破
updated_probability = initial_probability * volume_factor # 0.54
# 第5天:股票回调至入场水平并守住
support_factor = 1.10 # 正面——支撑守住
updated_probability = updated_probability * support_factor # 0.594
# 第8天:股票以扩张成交量突破新高
breakout_factor = 1.15 # 强正面
updated_probability = updated_probability * breakout_factor # 0.683
# 使用更新后的概率调整仓位管理
如果 updated_probability > 0.65:
考虑加仓()
否则如果 updated_probability < 0.45:
考虑减仓()
优势是一种统计优势,在大量交易中一致应用,会产生正期望值。凌波在A股中确定了几个潜在的优势来源:
基于模式的优势:特定技术模式(突破、背离、支撑/阻力位),历史胜率超过 55%,支付比率可接受
基于时机的优势:日内、星期几或季节性模式,创造可预测的偏见。例如,小型股的"一月效应"、节前反弹,或A股在牛市期间午盘上涨的倾向
结构性优势:市场结构特征,如价格限制制度(创造可预测的涨停次日行为)、IPO 折价或指数再平衡效应
行为优势:利用主要是散户的A股市场中可预测的行为偏见——对新闻反应过度、涌入主题、处置效应(持有输家、卖出赢家)
每个提议的优势都必须通过回测量化:
伪代码:优势量化
───────────────────────────────
函数 quantify_edge(模式, 历史数据, 回溯年数=5):
交易 = identify_all_instances(模式, 历史数据)
盈利 = [t for t in 交易 if t.profit > 0]
亏损 = [t for t in 交易 if t.profit <= 0]
胜率 = len(盈利) / len(交易)
平均盈利 = mean([t.profit_pct for t in 盈利])
平均亏损 = mean([abs(t.profit_pct) for t in 亏损])
支付比率 = 平均盈利 / 平均亏损
期望值 = (胜率 × 平均盈利) - ((1 - 胜率) × 平均亏损)
# 优势存在仅当 EV 为正且具有统计显著性
显著性所需交易数 = calculate_min_sample_size(胜率, 平均盈利, 平均亏损)
返回 {
胜率: 胜率,
支付比率: 支付比率,
期望值: 期望值,
样本量: len(交易),
is_significant: len(交易) >= 显著性所需交易数,
edge_per_trade: 期望值
}
所有优势都会随着更多参与者发现和利用它们而衰减。凌波警告,通过回测识别的优势在实盘中可能已经较弱。他建议:
概率交易的基本方程:
期望值 (EV) = (胜率 × 平均盈利) - (亏损率 × 平均亏损)
只有在考虑交易成本(佣金、滑点、A股印花税)后 EV > 0 时,交易才值得进行
| 系统 | 胜率 | 平均盈利 | 平均亏损 | 每笔交易 EV |
|---|---|---|---|---|
| 系统 A | 70% | 3% | 5% | (0.70 × 3%) - (0.30 × 5%) = 0.60% |
| 系统 B | 40% | 10% | 3% | (0.40 × 10%) - (0.60 × 3%) = 2.20% |
| 系统 C | 55% | 4% | 4% | (0.55 × 4%) - (0.45 × 4%) = 0.40% |
| 系统 D | 60% | 2% | 3% | (0.60 × 2%) - (0.40 × 3%) = 0.00% |
系统 B 的 EV 最高,尽管胜率最低。系统 D 的胜率为 60%,但 EV 为零。这说明胜率本身毫无意义——只有 EV 重要
在A股中,交易成本包括:
总摩擦:每往返约 0.2-0.3%。每笔交易 EV 为 0.3% 的系统在成本后几乎无利可图。凌波建议以每笔交易至少 0.5% EV 为目标,以确保摩擦后的可行性
概率交易系统需要五个组成部分:
每个规则必须 100% 客观且明确。如果两个交易者不能看同一张图表并独立得出关于是否存在信号的相同结论,则规则过于主观
糟糕的规则:"当股票看起来见底时买入" 好的规则:"当价格以成交量 > 20 日平均成交量 1.5 倍收于 20 日新高时买入"
凌波强烈主张简单。具有 3-4 个清晰规则的系统的表现会优于具有 15 个规则的系统,因为:
回测是必要的但不够。系统必须通过前向分析验证:
最推荐的方法:每笔交易用固定比例的资金去冒险
伪代码:固定比例仓位管理
─────────────────────────────────────────────
risk_per_trade = 0.02 # 资本的 2%
capital = current_portfolio_value
max_loss_per_trade = capital * risk_per_trade
shares = max_loss_per_trade / (entry_price - stop_price)
shares = floor(shares / 100) * 100 # A股每手100股
position_value = shares * entry_price
position_pct = position_value / capital
对于高级仓位管理,凌波介绍凯利公式:
Kelly % = W - (1-W)/R
其中:
W = 胜率(例如 0.60)
R = 支付比率(平均盈利/平均亏损,例如 1.5)
Kelly % = 0.60 - (0.40 / 1.5) = 0.60 - 0.267 = 0.333 (33.3%)
然而,凌波强烈建议在实践中使用半凯利或四分之一凯利:
根据建仓模式的质量调整仓位规模:
| 模式质量 | 仓位规模(占凯利的%) |
|---|---|
| A级(所有条件满足,强确认) | 50% 凯利 |
| B级(大多数条件满足) | 25% 凯利 |
| C级(最低条件满足) | 12.5% 凯利 |
交易级风险:任何单笔交易的最大亏损,由止损和仓位规模控制。建议:最多资本的 1-2%
组合级风险:从峰值权益的最大回撤,由总敞口和相关性管理控制。建议:如果组合回撤超过 10%,将所有仓位减少 50%
系统级风险:交易优势消失的风险。由持续监控和"断路器"规则控制:如果系统在 50+ 笔交易中表现低于预期 2 个标准差,停止交易并重新评估
伪代码:风险预算
───────────────────────
total_risk_budget = 0.06 # 任何时候最大总风险 6%
risk_per_trade = 0.02 # 每笔交易 2%
max_simultaneous_trades = total_risk_budget / risk_per_trade # = 3
# 如果当前开放风险 < 风险预算,可以添加新交易
current_open_risk = sum(position_size * (entry - stop) / entry for each position)
available_risk = total_risk_budget - current_open_risk
如果 available_risk >= risk_per_trade:
can_add_new_trade = True
否则:
can_add_new_trade = False
持有三只在同一板块、受同一催化剂影响的股票不是多元化——而是伪装成三笔独立交易的集中风险。凌波建议将板块敞口限制为最多 2 个同时持仓
胜率和支付比率之间存在内在张力:
凌波认为,对于大多数交易者,支付比率比胜率更重要:
最佳平衡取决于交易者的心理:
凌波最重要的教导之一:交易者放弃系统太快。评估系统统计所需的最少交易次数:
伪代码:置信度所需最小交易数
───────────────────────────────
函数 min_trades_for_confidence(胜率, 置信水平=0.95):
# 使用二项置信区间的近似
z = 1.96 # 95% 置信度
p = 胜率
误差幅度 = 0.05 # 想知道胜率在 ±5% 以内
n = (z^2 * p * (1-p)) / 误差幅度^2
返回 ceiling(n)
# 示例:
# 胜率 60%:n = (1.96^2 × 0.6 × 0.4) / 0.05^2 = 369 笔交易
# 胜率 55%:n = (1.96^2 × 0.55 × 0.45) / 0.05^2 = 380 笔交易
这意味着你需要大约 300-400 笔交易才能对系统真实胜率统计上有把握。在 20 笔亏损交易后放弃系统的交易者没有学到任何统计上有效的结论
对于实际目的,凌波建议:
如果你测试 100 个不同的参数组合并选择表现最好的,你没有找到优势——你找到了统计伪象。凌波建议:
每个系统都会经历回撤。问题不是是否而是多深和多长。凌波提供预期回撤指标:
| 胜率 | 支付比率 | 预期最大回撤(100笔交易) | 恢复交易次数 |
|---|---|---|---|
| 60% | 1.5:1 | 12-18% | 15-25 |
| 55% | 2.0:1 | 15-22% | 20-30 |
| 50% | 2.5:1 | 18-28% | 25-40 |
| 45% | 3.0:1 | 22-35% | 30-50 |
回撤是不对称的:20% 的亏损需要 25% 的盈利来恢复。50% 的亏损需要 100% 的盈利。这就是为什么回撤预防比回报最大化重要得多
A股有 T+1 结算(今天买入,最早明天才能卖出)。这创造了特定的概率模式:
凌波提供涨停延续的回测概率:
特定于A股市场:
当股票被添加到主要指数(沪深300、中证500)或从中删除时,指数基金存在可预测的买入/卖出压力。公告到实施的时间差创造了可交易的概率优势
最艰难的心理挑战:接受亏损是一个盈利系统的正常且必要的部分。凌波建议重新定义亏损:
| 结果导向 | 过程导向 |
|---|---|
| 根据盈亏判断每笔交易 | 根据规则遵守情况判断每笔交易 |
| 盈利交易后感觉良好 | 无论盈亏,执行良好的交易后感觉良好 |
| 亏损后改变系统 | 仅在统计显著证据后才改变系统 |
| 结果:情绪过山车 | 结果:一致的执行 |
胜率 55% 的系统将确定性地经历 8+ 次连败。当这发生时:
伪代码:完整概率交易系统
─────────────────────────────────────────────────────
类 ProbabilityTradingSystem:
配置:
risk_per_trade = 0.02
max_open_risk = 0.06
max_drawdown_threshold = 0.15
kelly_fraction = 0.25 # 四分之一凯利
min_ev_per_trade = 0.005 # 0.5% 最低期望值
函数 evaluate_setup(股票, 模式类型):
# 查询这个模式的历史表现
历史 = backtest_database.query(模式类型, 股票.板块)
如果 历史.样本量 < 30:
返回 跳过 # 数据不足
胜率 = 历史.胜率
平均盈利 = 历史.平均盈利
平均亏损 = 历史.平均亏损
ev = (胜率 × 平均盈利) - ((1 - 胜率) × 平均亏损)
ev_考虑成本后 = ev - 0.003 # 交易成本
如果 ev_考虑成本后 < min_ev_per_trade:
返回 跳过 # 优势太小
# 计算仓位规模
kelly_pct = 胜率 - ((1 - 胜率) / (平均盈利 / 平均亏损))
position_pct = kelly_pct * kelly_fraction
# 风险检查
如果 current_open_risk + risk_per_trade > max_open_risk:
返回 跳过 # 风险预算已用完
返回 交易(position_pct, ev_考虑成本后)
函数 daily_routine():
# 第1步:回撤检查
current_dd = (peak_equity - current_equity) / peak_equity
如果 current_dd > max_drawdown_threshold:
平所有仓位()
进入审查模式()
返回
# 第2步:管理现有仓位
对于 open_positions 中的每个仓位:
如果 仓位.hit_stop_loss():
平仓()
记录("亏损", 仓位.pnl)
否则如果 仓位.hit_profit_target():
平仓()
记录("盈利", 仓位.pnl)
否则如果 仓位.time_stop_exceeded():
平仓()
记录("时间止损", 仓位.pnl)
# 第3步:扫描新模式
模式 = scan_universe_for_setups()
对于 setups 中的每个模式:
结果 = evaluate_setup(模式.股票, 模式.类型)
如果 结果 != 跳过:
执行入场(模式.股票, 结果.position_pct)
# 第4步:更新统计
update_rolling_performance()
check_for_edge_decay()
函数 check_for_edge_decay():
recent_50 = last_50_trades()
expected_win_rate = system_historical_win_rate
actual_win_rate = recent_50.胜率
std_dev = sqrt(expected_win_rate * (1-expected_win_rate) / 50)
如果 actual_win_rate < expected_win_rate - 2 * std_dev:
警报("系统表现低于 >2 个标准差。需要审查。")
reduce_position_sizes(0.50)
"市场不是一个要解决的谜题。是一个要玩的概率游戏。 你越早接受这一点,你就越快开始盈利。"
"60% 的胜率意味着你每 10 笔交易会亏损 4 笔。如果 10 次亏损 4 次让你心烦意乱,那你入错行了。"
"期望值是唯一重要的指标。胜率 30% 的系统可能非常有利可图。胜率 80% 的系统可能是缓慢失血到零。"
"仓位规模是交易中完全在你控制之下的唯一部分。你无法控制交易是否盈利。你能控制的是你赌多少。"
"优势是脆弱的。它存在于大量交易的总体中。一次偏离系统,你就破坏了使优势真实存在的统计契约。"
"回撤是你为未来收益付出的代价。永远不会回撤的系统是不承担风险的系统,而不承担风险的系永远不会产生回报。"
"在A股市场,个人交易者可用的最大优势是行为上的:能够在 2 亿个散户以确定性思维思考时以概率思维思考。"
"不要问'这笔交易会成功吗?'问'如果我进行 100 次这样的交易,我会赚钱吗?'第一个问题无法回答。第二个是可测试的。"