量化金融听起来像数学家和程序员的专属领域,但它最核心的思想并不神秘:把投资想法变成明确规则,用历史数据验证,再根据收益与风险决定是否采用。本文结合 Python,从量化金融的基本概念、研究流程和常用工具出发,完成均线策略、随机游走与凯利公式三个入门实验。
一、什么是量化金融
量化金融是一门交叉学科,它综合使用数学、统计学、计算机科学和金融理论,通过数据、模型与算法解决资产定价、交易决策和风险管理等问题。
传统投资常依赖经验,例如"这只股票已经连续上涨几天,明天可能继续涨"。量化研究不会直接接受这个判断,而是继续追问:
-
"连续上涨"具体指几天?
-
样本范围和时间区间是什么?
-
这种情况在历史上一共出现过多少次?
-
后续上涨概率、平均收益和最大亏损分别是多少?
-
扣除手续费、滑点后,规律是否依然存在?
因此,量化并不是拥有预测未来的水晶球,而是将主观想法转化为可计算、可检验和可复现的规则。
量化研究既有科学性,也需要创造性。科学性来自数据验证、模型评估和结果复现;创造性则体现在如何提出有价值的假设、选择变量、设计策略以及理解市场机制。
二、量化思维的四步闭环
以"股票连续上涨 5 天后,第 6 天上涨概率是否更高"为例,一个基本研究过程可以分成四步。
1. 提出假设
先把模糊感觉改写成可以回答的问题:连续上涨 5 天之后,下一交易日的收益率是否显著高于平常?
2. 量化定义
计算机无法理解"最近涨得不错",所以需要给出严格条件。例如:前 5 个交易日的日收益率均大于 0,并将第 6 天定义为观察期。
3. 历史验证
在足够长、足够广的数据中寻找所有符合条件的样本,统计下一日上涨概率、平均收益、收益分布和极端亏损。还要设置对照组,判断结果是真实规律还是随机波动。
4. 形成并迭代规则
如果规律在样本外仍然稳定,并且扣除交易成本后还有正收益,才有可能进一步形成策略。若结果不稳定,就应修改假设或放弃,而不是只保留支持自己观点的区间。
这条闭环可以概括为:
提出假设 → 获取数据 → 定义规则 → 回测验证 → 风险评估 → 模拟交易 → 持续迭代
三、一个完整量化系统包含什么
实际量化系统通常包含以下环节:
| 环节 | 主要任务 | 常见问题 |
|---|---|---|
| 获取数据 | 获取行情、成交量、财务或新闻数据 | 数据缺失、复权方式、幸存者偏差 |
| 数据处理 | 清洗、对齐、构造收益率和特征 | 时间错位、异常值、未来数据泄漏 |
| 分析建模 | 描述统计、因子研究、预测建模 | 过拟合、多重检验、伪相关 |
| 策略回测 | 根据历史信号模拟交易 | 手续费、滑点和成交限制被忽略 |
| 风险管理 | 控制仓位、回撤和风险暴露 | 只看收益,不看尾部风险 |
| 模拟与实盘 | 模拟下单并监控真实运行 | 研究环境与交易环境不一致 |
"历史回测很好"只是研究起点,并不代表未来一定盈利。一个可靠策略至少还应接受样本外测试、滚动验证、交易成本压力测试和不同市场阶段检验。
四、为什么 Python 适合量化入门
Python 的优势不是单纯运行速度快,而是在学习成本、开发效率与工具生态之间取得了很好的平衡。一门语言基本可以覆盖完整研究流程:
|---------|---------------------------------|----------------|
| 任务 | 常用工具 | 主要作用 |
| 数据获取 | yfinance、AkShare、Tushare | 获取股票、基金和宏观数据 |
| 数据处理 | pandas、Polars | 清洗表格、时间序列与特征计算 |
| 数值计算 | NumPy、SciPy | 数组、概率统计与科学计算 |
| 统计与机器学习 | statsmodels、scikit-learn | 回归、检验和预测模型 |
| 策略回测 | Backtrader、vectorbt、vn.py | 模拟交易与策略评估 |
| 可视化 | Matplotlib、Seaborn、Plotly | 绘制行情、净值和风险图表 |
例如,计算 5 日移动平均线只需要一行代码:
df["MA5"] = df["Close"].rolling(5).mean()
这种简洁性让研究者能够把精力放在策略逻辑和结果解释上,而不是反复处理底层实现。
五、实验一:均线规则与随机交易对比
下面先模拟一段"上涨---下跌---恢复"的价格序列,然后比较三种方法:买入并持有、20 日均线规则和随机持仓。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
np.random.seed(7)
# 模拟三个市场阶段
n1, n2, n3 = 90, 40, 120
returns = np.r_[
np.random.normal(0.0010, 0.010, n1),
np.random.normal(-0.0120, 0.015, n2),
np.random.normal(0.0012, 0.012, n3),
]
df = pd.DataFrame({"Close": 100 * np.cumprod(1 + returns)})
df["Return"] = df["Close"].pct_change().fillna(0)
df["MA20"] = df["Close"].rolling(20).mean()
# 收盘价高于20日均线时持仓
df["QuantSignal"] = (df["Close"] > df["MA20"]).astype(int)
# 随机策略作为对照组
rng = np.random.default_rng(7)
df["RandomSignal"] = rng.integers(0, 2, len(df))
# 使用前一日信号,避免把当天收盘后的信息用于当天交易
df["QuantReturn"] = df["QuantSignal"].shift(1).fillna(0) * df["Return"]
df["RandomReturn"] = df["RandomSignal"].shift(1).fillna(0) * df["Return"]
df["BuyHoldNAV"] = (1 + df["Return"]).cumprod()
df["QuantNAV"] = (1 + df["QuantReturn"]).cumprod()
df["RandomNAV"] = (1 + df["RandomReturn"]).cumprod()
df[["BuyHoldNAV", "QuantNAV", "RandomNAV"]].plot(figsize=(11, 5))
plt.title("Strategy NAV comparison")
plt.ylabel("NAV")
plt.grid(alpha=0.3)
plt.tight_layout()
plt.show()
这段代码最重要的细节是 shift(1):当天收盘后才能知道价格是否位于均线上方,因此该信号最早只能用于下一交易日。若不进行移位,就相当于在回测中"提前知道答案",产生前视偏差。
同时,这次模拟不能证明均线策略在真实市场中有效,因为行情是人为生成的,也没有加入手续费和滑点。它的意义是展示如何把交易想法写成规则,并设置对照组完成初步验证。
六、实验二:随机游走与统计规律
巴舍利耶使用概率思想研究价格波动,为现代量化金融奠定了早期理论基础。随机游走的核心启发是:单条价格路径很难预测,但大量路径可能表现出稳定的统计特征。
下面模拟 50 只虚拟股票,从 100 元出发运行 250 个交易日:
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(2026)
n_stocks = 50
n_days = 250
start_price = 100
daily_volatility = 0.02
all_paths = []
for _ in range(n_stocks):
daily_returns = np.random.normal(0, daily_volatility, n_days)
path = start_price * np.cumprod(1 + daily_returns)
all_paths.append(path)
all_paths = np.asarray(all_paths)
final_prices = all_paths[:, -1]
fig, axes = plt.subplots(1, 2, figsize=(12, 4.5))
axes[0].plot(all_paths.T, alpha=0.3, linewidth=0.8)
axes[0].axhline(start_price, color="red", linestyle="--")
axes[0].set_title("50 random price paths")
axes[0].set_xlabel("Trading day")
axes[0].set_ylabel("Price")
axes[1].hist(final_prices, bins=15, edgecolor="white")
axes[1].axvline(start_price, color="red", linestyle="--")
axes[1].set_title("Distribution of final prices")
axes[1].set_xlabel("Final price")
plt.tight_layout()
plt.show()
print("平均终点价格:", final_prices.mean())
print("终点价格标准差:", final_prices.std())
实验中每条路径都不同,说明随机波动会产生大量可能结果。随着时间增加,价格路径的离散程度也会扩大。在标准布朗运动中,增量的标准差与时间平方根成正比,即常说的"平方根时间法则"。
需要注意,示例采用正态分布的简单日收益率并进行连乘,最终价格更接近偏态分布,而不能简单断言为正态分布。真实市场还存在波动聚集、厚尾、跳跃和制度变化,基础随机游走只是理解概率模型的起点。
七、实验三:概率优势与凯利公式
爱德华·索普将概率优势与资金管理结合起来,展示了即使单次结果不确定,也可以通过正期望和长期重复建立优势。
当每次获胜的净赔率为 b、胜率为 p、失败概率为 q=1-p 时,凯利公式给出的理论最优资金比例为:
f\^\*=\\frac{bp-q}{b}
如果赔率为 1:1、胜率为 52%,则:
f\^\*=0.52-0.48=0.04
也就是每轮投入当前资金的 4%。可以用模拟比较"无优势""有优势且合理下注"和"有优势但过度下注"三种情况:
import numpy as np
np.random.seed(2026)
n_rounds = 1000
n_simulations = 200
initial_capital = 1000
def simulate(win_probability, bet_fraction):
final_capitals = []
for _ in range(n_simulations):
capital = initial_capital
for _ in range(n_rounds):
bet = capital * bet_fraction
capital += bet if np.random.random() < win_probability else -bet
final_capitals.append(capital)
return np.asarray(final_capitals)
kelly_fraction = 0.04
no_edge = simulate(0.50, kelly_fraction)
kelly_strategy = simulate(0.52, kelly_fraction)
overbetting = simulate(0.52, 0.25)
for name, result in {
"无优势 + 4%仓位": no_edge,
"2%优势 + 凯利仓位": kelly_strategy,
"2%优势 + 25%仓位": overbetting,
}.items():
print(name)
print(" 终点资金中位数:", np.median(result))
print(" 盈利实验占比:", np.mean(result > initial_capital))
这个实验说明:
-
没有正期望时,资金管理无法凭空创造优势;
-
微小但真实的概率优势,可以通过长期重复逐渐积累;
-
即使存在优势,仓位过大也会因波动损耗而导致资金大幅缩水;
-
凯利公式依赖对胜率和赔率的准确估计,实际应用通常会使用半凯利或更保守的比例。
因此,量化盈利不能只看策略信号,还要同时考虑概率优势、仓位管理和执行纪律。
八、获取第一份真实股票数据
通过 yfinance 可以快速获取美股行情。下面以苹果公司 AAPL 最近 6 个月的日线数据为例:
import yfinance as yf
import matplotlib.pyplot as plt
aapl = yf.download(
"AAPL",
period="6mo",
progress=False,
auto_adjust=False,
multi_level_index=False,
)
print(aapl.tail())
fig, axes = plt.subplots(
2, 1, figsize=(12, 6), sharex=True,
gridspec_kw={"height_ratios": [3, 1]},
)
axes[0].plot(aapl.index, aapl["Close"], color="tab:blue")
axes[0].set_title("AAPL closing price")
axes[0].set_ylabel("USD")
axes[1].bar(aapl.index, aapl["Volume"], color="gray", alpha=0.6)
axes[1].set_ylabel("Volume")
axes[1].set_xlabel("Date")
plt.tight_layout()
plt.show()
这段代码需要联网,运行结果也会随日期变化。yfinance 适合学习和原型验证,但正式研究还需要核对数据来源、复权方式、时区、停牌、退市股票以及接口稳定性。
九、AI 能怎样辅助量化学习
生成式 AI 可以帮助解释金融概念、补充数据清洗代码、生成回测框架、定位程序错误和梳理研究思路,因此显著降低了入门门槛。但 AI 的输出不能直接作为投资决策依据,尤其要防范以下问题:
-
虚构数据源、指标定义或历史事实;
-
在代码中无意引入未来数据;
-
只展示有利回测区间,忽略失败样本;
-
把相关关系误写成因果关系;
-
忽略手续费、滑点、流动性和冲击成本;
-
根据已知回测结果反复调参,造成过拟合。
正确用法是让 AI 充当研究助手:帮助提高编码和信息整理效率,但数据、假设、检验方法与最终结论必须由研究者核查。
十、初学量化最容易踩的坑
|--------------|----------------------|
| 常见错误 | 正确做法 |
| 把量化等同于准确预测涨跌 | 关注概率、期望收益和风险分布 |
| 只看累计收益 | 同时检查回撤、波动、换手率和稳定性 |
| 使用当天信号计算当天收益 | 对信号进行时间移位,避免前视偏差 |
| 忽略手续费和滑点 | 在回测中加入符合交易频率的成本模型 |
| 在同一数据上调参和评估 | 划分训练期、验证期和测试期 |
| 看到高收益就认为规律有效 | 检查样本量、显著性、样本外表现和经济逻辑 |
| 直接照搬 AI 生成策略 | 独立核对代码、数据与金融假设 |
总结
量化金融的核心不是猜中下一次涨跌,而是把想法转化为规则,用数据检验概率优势,并通过风险控制让策略能够长期执行。
这次学习可以归纳为三条主线:
-
研究方法:提出假设、量化定义、历史验证、形成规则;
-
技术工具:使用 Python 完成数据处理、统计分析、回测和可视化;
-
底层逻辑:单次结果可以随机,但统计规律、正期望和科学仓位能够被研究。
入门之后,下一步应继续学习 OHLCV 行情结构、简单收益率与对数收益率、风险指标、回测偏差和样本外验证。只有把"策略收益"与"研究可信度"同时建立起来,才算真正进入量化金融。
风险提示:本文仅用于编程与量化金融知识学习,不构成任何投资建议。金融市场存在风险,历史表现不代表未来收益。