量化交易实战:从均值回归到动量策略的 Python 实现
量化交易作为现代金融工程的核心领域,正在深刻改变着投资决策的方式。本文将深入讲解两种最经典的量化策略——均值回归(Mean Reversion)和动量策略(Momentum),并提供完整的 Python 实现代码。
一、量化交易概述
量化交易是利用数学模型、统计分析和计算机程序来执行交易决策的方法。与传统的主观交易相比,量化交易具有纪律性强、覆盖面广、速度快、情绪影响小等优势。
一个完整的量化交易系统通常包括以下模块:数据获取模块、信号生成模块、仓位管理模块、执行引擎和风控系统。本文重点讨论信号生成环节中的核心策略。
二、均值回归策略
2.1 理论基础
均值回归基于一个核心假设:资产价格偏离其长期均值后,有向均值回复的趋势。这一现象在统计上表现为价格的平稳性或协整关系。数学表达为:Z = (P - μ) / σ,其中 P 为当前价格,μ 为移动平均价格,σ 为标准差。当 Z > 2 时做空,Z < -2 时做多。
2.2 协整配对交易
更高级的均值回归应用是协整配对交易(Pairs Trading)。两只具有协整关系的股票,其价差序列是平稳的,可以进行均值回归交易。通过 ADF 检验确认协整关系后,对价差序列计算 Z-Score 产生交易信号。典型参数:回望窗口 20 天,进场阈值 2 个标准差,出场阈值 0.5 个标准差。
2.3 完整回测流程
回测均值回归策略的步骤:1) 选择标的并获取历史价格数据;2) 计算滚动窗口内的均值和标准差;3) 计算 Z-Score 并生成交易信号;4) 模拟持仓和收益;5) 计算夏普比率、最大回撤等风险指标。注意过拟合风险,建议保留样本外数据做验证。
三、动量策略
3.1 理论基础
动量策略基于趋势延续的假设:过去表现好的资产在未来一段时间内仍将继续表现良好。这一现象被称为“动量效应”,是金融学中最稳健的异象之一。Jegadeesh 和 Titman (1993) 的经典研究发现,过去 3-12 个月表现最好的股票组合在未来 3-12 个月内持续跑赢表现最差的组合。
3.2 时间序列动量
时间序列动量(Trend Following)是最简单也是最有效的量化策略之一,基于短期均线穿越长期均线的信号进行交易。当短期均线(如20日均线)上穿长期均线(如60日均线)时做多,下穿时做空或平仓。优点是在趋势市场中表现优秀,缺点是在震荡市中频繁止损。
3.3 截面动量与高级因子
截面动量(Cross-sectional Momentum)同时做多过去表现好的资产、做空表现差的资产。高级因子包括:残差动量(剔除市场因子后的特异性动量)、波动率标准化动量(避免高波动资产过度配置)、以及复合动量(动量与价值因子的非线性组合)。
四、策略评估指标
评价量化策略的核心指标包括:
| 指标 | 说明 | 评价标准 |
|---|---|---|
| 年化收益率 | (1+R)^(252/n) - 1 | 越高越好 |
| 夏普比率 | (Rp - Rf) / σp | > 1 优秀,> 2 卓越 |
| 最大回撤 | max(Peak - Trough) | 越小越好 |
| 卡尔马比率 | 年化收益 / 最大回撤 | > 1 可接受 |
| 胜率 | 盈利交易数 / 总交易数 | > 50% 较好 |
五、Python 回测示例
import pandas as pd
import numpy as np
# 均值回归策略
def mean_reversion_strategy(prices, lookback=20, entry_z=2.0, exit_z=0.5):
signals = pd.DataFrame(index=prices.index)
signals['zscore'] = (prices - prices.rolling(lookback).mean()) / prices.rolling(lookback).std()
signals['position'] = 0
signals.loc[signals['zscore'] > entry_z, 'position'] = -1
signals.loc[signals['zscore'] < -entry_z, 'position'] = 1
signals.loc[signals['zscore'].abs() < exit_z, 'position'] = 0
return signals['position'].ffill()
# 动量策略
def momentum_strategy(prices, short_win=20, long_win=60):
signals = pd.DataFrame(index=prices.index)
signals['short_ma'] = prices.rolling(short_win).mean()
signals['long_ma'] = prices.rolling(long_win).mean()
signals['position'] = (signals['short_ma'] > signals['long_ma']).astype(int)
return signals['position']
# 绩效评估
def calculate_metrics(returns, risk_free=0.03):
ann_return = returns.mean() * 252
ann_vol = returns.std() * np.sqrt(252)
sharpe = (ann_return - risk_free) / ann_vol
cum_returns = (1 + returns).cumprod()
max_dd = (cum_returns - cum_returns.expanding().max()).min()
calmar = ann_return / abs(max_dd) if max_dd != 0 else np.inf
return {'Sharpe': round(sharpe, 2), 'Return': f'{ann_return:.1%}', 'MaxDD': f'{max_dd:.1%}', 'Calmar': round(calmar, 2)}
六、风险管理与实盘注意事项
量化交易中,风险管理比策略盈利能力更重要:
- 止损机制:设置固定比例止损和时间止损,防止单笔交易造成重大损失
- 仓位管理:使用凯利公式或波动率倒数法确定仓位大小
- 过度拟合防范:将样本外测试和交叉验证作为策略上线的必要程序
- 滑点和手续费:回测时必须考虑交易成本的影响
- 策略衰减:监控策略夏普比率衰减,及时进行策略迭代
七、总结
均值回归和动量策略代表了量化交易的两个基本维度——价格反转与趋势延续。在实际应用中,将两者结合往往能获得更好的风险调整收益。对于初学者,建议从简单的双均线动量策略入手,逐步增加策略复杂度。切记:稳健的风控永远比追求高收益更重要。量化交易是一个持续学习和迭代的过程,市场在不断变化,策略也需要不断适应。

发表评论 取消回复