
用 Python 揭秘均值回归策略:你的收益从何而来?
2026年重磅升级已全面落地!欢迎加入专注财经数据与量化投研的【数据科学实战】知识星球!您将获取持续更新的《财经数据宝典》与《量化投研宝典》,双典协同提供系统化指引;星球内含 500 篇以上独有高质量文章,深度覆盖策略开发、因子分析、风险管理等核心领域,内容基本每日更新;同步推出的「量化因子专题教程」系列(含完整可运行代码与实战案例),系统详解因子构建、回测与优化全流程,并实现日更迭代。我们持续扩充独家内容资源,全方位赋能您的投研效率与专业成长。无论您是量化新手还是资深研究者,这里都是助您少走弯路、事半功倍的理想伙伴,携手共探数据驱动的投资未来!
很多人对量化基金有一种想象:他们一定掌握着某个不为人知的「神秘公式」,普通人根本接触不到。但事实可能恰恰相反——量化交易所依赖的数学,绝大部分都躺在公开的教科书和论文里,有的甚至已经公开了三百多年。
那为什么依然只有少数机构能持续赚钱?答案是:护城河不是公式本身,而是把这些公式「接线」成一个完整系统的能力,以及严格执行系统的纪律。
这篇文章会带你梳理量化金融背后的「数学栈」(The Quant Stack),并用 Python 写几个小案例,让学习 Python 的你直观感受这些百年老公式的威力。
免责声明:本文仅用于学习交流,不构成任何投资建议。
单个公式几乎不可能独立赚钱:
长期存活的基金做的事情并不炫酷,却非常难:把各个模块接在一起,让每一层弥补上一层的弱点。
这个数学栈大致是:
概率 → 仓位管理 → 组合构建 → 信号提取 → 博弈论 → 优化 → 模拟 → 机器学习
下面按阶段拆解,并配上 Python 案例。
核心思想:一个赌注重复的次数足够多,结果就会越来越不随机。
51% 的胜率在 10 笔交易里几乎看不出任何优势——运气完全可以掩盖实力;但在 10000 笔交易之后,这个微小的优势会变成压路机。这也是量化策略偏爱「上千笔小额下注」而不是「几笔豪赌」的原因。
用 Python 模拟一下:
import randomdef simulate(win_rate, n_trades, n_rounds=1000): """模拟 n_rounds 轮交易,每轮 n_trades 笔,统计整体亏钱的轮数占比""" lose_count = 0 for _ in range(n_rounds): # 每笔交易:赢记 +1,输记 -1 pnl = sum(1 if random.random() < win_rate else -1 for _ in range(n_trades)) if pnl < 0: lose_count += 1 return lose_count / n_rounds# 胜率 51%,分别模拟 10 笔和 10000 笔print("10 笔交易后仍亏损的概率:", simulate(0.51, 10))print("10000 笔交易后仍亏损的概率:", simulate(0.51, 10000))运行后你会发现:10 笔交易时,亏钱的概率接近一半;而 10000 笔交易后,亏钱的概率会降到非常低。优势不变,改变的只是重复次数。
贝叶斯定理是一套「在不发疯的前提下改变主意」的规则:先有一个信念(先验概率),新证据到来,然后更新(后验概率)。量化模型不需要假装自己知道未来,它只需要持有一个概率,并在每次新数据到来时(价格变动、财报发布、成交量异动)更新它。
def bayes_update(prior, p_evidence_given_true, p_evidence_given_false): """贝叶斯更新:根据新证据更新信念 prior: 先验概率,比如「策略有效」的初始信念 p_evidence_given_true: 假设为真时,观察到该证据的概率 p_evidence_given_false: 假设为假时,观察到该证据的概率 """ # 全概率公式计算证据出现的总概率 p_evidence = (prior * p_evidence_given_true + (1 - prior) * p_evidence_given_false) # 贝叶斯公式计算后验概率 return prior * p_evidence_given_true / p_evidence# 初始认为策略有效的概率是 50%belief = 0.5# 连续观察到 5 次「盈利」信号,每次都做一次贝叶斯更新for day in range(1, 6): belief = bayes_update(belief, 0.6, 0.4) print(f"第 {day} 次更新后,策略有效的信念:{belief:.4f}")易错点提示:很多初学者会把「证据支持假设」直接当成「假设为真」,而忽略先验概率——这正是贝叶斯思维要纠正的直觉偏差。
很多系统的下一步主要取决于「当前状态」,而不是全部历史。市场经常在不同「状态」(regime)之间切换:平静、趋势、恐慌、均值回归。比「价格会不会涨」更好的问题是:我们现在处于哪种市场状态? 一个在平静市场里赚钱的策略,可能在恐慌行情中被摧毁。
早在 1900 年,法国研究生巴舍利耶就把股价描述为「随机游走」——价格是漫游的,但漫游得有数学结构。这一思想后来成为现代金融的基石。
信号负责找到交易,仓位决定你能否活下来。 这是有才华的交易者最容易悄悄毁掉自己的环节。
凯利公式给出了以长期资本增长为目标时,应该下注的精确资金比例:下注太少,优势复利得太慢;下注太多,一次正常的连败就能把你清零——哪怕你的优势是真实的。
def kelly_fraction(win_rate, odds): """计算凯利最优下注比例 win_rate: 胜率 p odds: 赔率 b(赢时每 1 元赌注的净收益) 公式:f* = (p * (b + 1) - 1) / b """ return (win_rate * (odds + 1) - 1) / odds# 胜率 55%,赔率 1:1f = kelly_fraction(0.55, 1.0)print(f"凯利建议的下注比例:{f:.2%}") # 输出 10.00%# 实践中通常采用「半凯利」以降低波动print(f"半凯利(更稳健):{f / 2:.2%}")延伸说明:实盘中胜率和赔率都只是估计值,估计误差会让「满凯利」变得非常危险,所以机构普遍使用「分数凯利」(如半凯利)来留出安全边际。
import randomdef monte_carlo_final_wealth(n_paths=100000, n_steps=252, mu=0.0004, sigma=0.01): """蒙特卡洛模拟:估计一年后资产净值的分布 n_paths: 模拟路径数 n_steps: 交易日数量(约一年 252 天) mu: 日均收益率 sigma: 日波动率 """ results = [] for _ in range(n_paths): wealth = 1.0 # 初始净值为 1 for _ in range(n_steps): # 每日收益近似服从正态分布 wealth *= 1 + random.gauss(mu, sigma) results.append(wealth) results.sort() # 输出 5% 分位数(尾部风险)和中位数 return results[int(0.05 * n_paths)], results[n_paths // 2]p5, median = monte_carlo_final_wealth()print(f"一年后净值中位数:{median:.3f}")print(f"最差 5% 情形的净值:{p5:.3f}")不要一上来就啃深度神经网络。先掌握三个概念:大数定律、贝叶斯定理、凯利公式。 它们会逼你回答三个真正重要的问题:
其余的一切,都只是工程问题。
对学 Python 的同学来说,好消息是:以上每一个概念都可以用几十行代码亲手验证。动手模拟一次大数定律,胜过读十篇公众号文章。
2026年全面升级已落地!【数据科学实战】知识星球核心权益如下:
星球已沉淀丰富内容生态——涵盖量化文章专题教程库、因子日更系列、高频数据集、PyBroker实战课程、专家深度分享与实时答疑服务。无论您是初探量化的学习者,还是深耕领域的从业者,这里都是助您少走弯路、高效成长的理想平台。诚邀加入,共探数据驱动的投资未来!
好文推荐
1. 用 Python 打造股票预测系统:Transformer 模型教程(一)
2. 用 Python 打造股票预测系统:Transformer 模型教程(二)
3. 用 Python 打造股票预测系统:Transformer 模型教程(三)
4. 用 Python 打造股票预测系统:Transformer 模型教程(完结)
6. YOLO 也能预测股市涨跌?计算机视觉在股票市场预测中的应用