
用 Python 揭秘均值回归策略:你的收益从何而来?
量化交易的生死线:用 Python 算出你的最优下注比例
2026年重磅升级已全面落地!欢迎加入专注财经数据与量化投研的【数据科学实战】知识星球!您将获取持续更新的《财经数据宝典》与《量化投研宝典》,双典协同提供系统化指引;星球内含 500 篇以上独有高质量文章,深度覆盖策略开发、因子分析、风险管理等核心领域,内容基本每日更新;同步推出的「量化因子专题教程」系列(含完整可运行代码与实战案例),系统详解因子构建、回测与优化全流程,并实现日更迭代。我们持续扩充独家内容资源,全方位赋能您的投研效率与专业成长。无论您是量化新手还是资深研究者,这里都是助您少走弯路、事半功倍的理想伙伴,携手共探数据驱动的投资未来!
很多刚接触量化交易的朋友,会把大量精力花在寻找「完美的入场信号」上,仿佛只要找到那个神奇的指标,就能稳定盈利。但残酷的现实是:真正决定你账户能否活下来的,往往不是入场信号,而是仓位管理(Position Sizing)。
一个再好的策略,如果每笔下注比例失控,也可能在一次连续亏损中把账户清零;而下注太保守,又会白白浪费复利增长的空间。今天这篇文章,就带大家用 Python 把「期望值(Expectancy)」「胜率(Win Rate)」和大名鼎鼎的「凯利公式(Kelly Criterion)」串起来,算出属于你自己的最优下注比例。
在谈仓位之前,我们必须先搞懂期望值。
期望值的定义:在足够大的样本下,你平均每笔交易期望赚到或亏掉的金额。它代表的是你真正的「数学优势」。
这里有一个新手最容易踩的坑:
⚠️ 常见误区:期望值不是「你赢的时候能赚多少」,而是把盈利交易、亏损交易、胜率、败率综合到一起后得到的单笔平均结果。
计算期望值前,先理解两个核心组件:
标准期望值公式(以风险单位 R 表示,1 笔标准止损 = 1.00R):
期望值 E =(胜率 × 平均盈利)-(败率 × 平均亏损)判断标准很简单:
假设一位交易者每笔风险 500 美元(即 1R = 500 美元),在 100 笔交易的样本中:
代入公式:
E =(0.40 × 1500)-(0.60 × 500)= 600 - 300 = +300 美元 / 笔换算成 R 倍数就是 0.60R / 笔。注意看:即使这个人有 60% 的时间在亏钱,只要期望值为正,100 笔交易下来依然能净赚约 30000 美元(100 × 300)。这就是「亏多赢少但依然赚钱」的数学本质。
要正确决定仓位,你得先理解期望值和胜率是怎么互相牵制的。三个关键量:
如果你的策略目标是 0.30R 的期望值 搭配 50% 的胜率,那么每冒 1.00 美元的止损风险,长期平均能净赚 0.30 美元。
由结构关系,可以反推出「隐含盈亏比 B」(即赢一次相当于多少个 R):
B =(E + 1 - W)/ W代入 E = 0.30、W = 0.50:
B =(0.30 + 1 - 0.50)/ 0.50 = 0.80 / 0.50 = 1.60也就是说:50% 胜率想拿到 0.30R 期望值,你平均每次要用 1.00R 的止损去博取 1.60R 的盈利。用 1 元的风险去赢 1.6 元、赢一半,平均每笔正好赚 0.30 元。
凯利公式的作用,是算出应该把账户的多大比例(记为 f*)押在单笔风险单位(1R)上,从而最大化资金的长期对数增长率。
在盈亏比为 B 的情形下,可以用如下形式估算:
f* = 期望值 / 盈亏比 = E / B沿用上面的参数(E = 0.30R、W = 50%、账户 = 10000 美元),一步步推导:
第 1 步:计算隐含盈亏比 B
B =(0.30 + 1 - 0.50)/ 0.50 = 1.60第 2 步:计算完整凯利比例 f*
f* = E / B = 0.30 / 1.60 = 0.1875 = 18.75%第 3 步:分数凯利缩放
由于完整凯利波动极大,实战中常按比例缩放:
光讲公式不够直观,我们用 Python 跑一个模拟:基于 50% 胜率的二项分布生成 200 笔交易序列,对比不同下注比例下资金曲线的差异。
import numpy as np
import matplotlib.pyplot as plt
# ===== 基础参数设置 =====
np.random.seed(42) # 固定随机种子,保证结果可复现
n_trades = 200 # 交易笔数
win_rate = 0.50 # 胜率 50%
win_R = 1.60 # 盈利时的 R 倍数(隐含盈亏比)
loss_R = 1.00 # 亏损时的 R 倍数
start_equity = 10000 # 初始资金(美元)
# 不同策略对应的单笔风险比例
strategies = {
"完整凯利 (18.75%)": 0.1875,
"半凯利 (9.37%)": 0.0937,
"四分之一凯利 (4.69%)": 0.0469,
"固定风险 (2%)": 0.0200,
}
# ===== 生成交易结果序列:True 为盈利,False 为亏损 =====
outcomes = np.random.rand(n_trades) < win_rate
# ===== 逐笔计算每种策略的资金曲线 =====
def simulate(risk_fraction):
equity = start_equity
curve = [equity]
for win in outcomes:
# 本笔风险金额 = 当前资金 × 风险比例
risk_amount = equity * risk_fraction
if win:
equity += risk_amount * win_R # 盈利:赚 1.60R
else:
equity -= risk_amount * loss_R # 亏损:亏 1.00R
curve.append(equity)
return curve
# ===== 绘制对比图 =====
plt.figure(figsize=(10, 6))
for name, frac in strategies.items():
plt.plot(simulate(frac), label=name)
plt.yscale("log") # 用对数坐标观察复利增长
plt.title("200 笔交易资金曲线对比(期望值 = 0.30R)")
plt.xlabel("交易笔数")
plt.ylabel("账户资金(美元,对数刻度)")
plt.legend()
plt.grid(True, alpha=0.3)
plt.show()💡 小提示:
np.random.seed()固定随机种子后,每次运行得到的交易序列都一样,方便反复调试和对比策略。想看不同「运气」下的结果,改一下种子数字即可。
跑完这段代码,你会看到几条走势差异巨大的曲线,核心结论如下:
这篇文章的核心,其实就一句话:决定量化交易长期存活的,是仓位管理,而不是入场信号。
我们从期望值出发,理解了「亏多赢少也能赚钱」的数学本质;再通过胜率反推隐含盈亏比;最后用凯利公式算出理论最优下注比例,并用 Python 模拟验证了「激进凯利收益高但回撤吓人、分数凯利更适合实战」这一结论。
对正在学习 Python 的你来说,这不仅是一个金融知识点,更是一个绝佳的编程练习:用几十行代码,就能把抽象的数学优势可视化成一条条资金曲线。建议你亲手把上面的代码跑一遍,改改胜率、盈亏比和随机种子,感受一下参数变化对资金曲线的巨大影响。
理解了这套逻辑,你就已经领先大多数还在到处找「圣杯指标」的散户了。
2026年全面升级已落地!【数据科学实战】知识星球核心权益如下:
星球已沉淀丰富内容生态——涵盖量化文章专题教程库、因子日更系列、高频数据集、PyBroker实战课程、专家深度分享与实时答疑服务。无论您是初探量化的学习者,还是深耕领域的从业者,这里都是助您少走弯路、高效成长的理想平台。诚邀加入,共探数据驱动的投资未来!
好文推荐
1. 用 Python 打造股票预测系统:Transformer 模型教程(一)
2. 用 Python 打造股票预测系统:Transformer 模型教程(二)
3. 用 Python 打造股票预测系统:Transformer 模型教程(三)
4. 用 Python 打造股票预测系统:Transformer 模型教程(完结)
6. YOLO 也能预测股市涨跌?计算机视觉在股票市场预测中的应用
9. Python 量化投资利器:Ridge、Lasso 和 Elastic Net 回归详解
好书推荐