1. 配对交易策略概述
配对交易(Pairs Trading)是一种经典的市场中性策略,起源于1980年代摩根士丹利的量化团队。其核心逻辑是寻找两只历史价格走势高度相关的资产,当它们的价差偏离历史均值时,建立多头和空头头寸,等待价差回归后平仓获利。这种策略属于统计套利(Statistical Arbitrage)的范畴,在股票、期货、加密货币等市场都有广泛应用。
vectorbt作为Python生态中新兴的量化分析库,相比传统的backtrader、zipline等工具,最大的优势在于其向量化回测引擎。通过充分利用NumPy的向量化运算和并行计算能力,vectorbt能够以惊人的速度处理大规模历史数据。我在实际使用中发现,对于包含数百组配对组合的回测,vectorbt的处理速度可以达到传统迭代式回测框架的10倍以上。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 配对交易的核心原理
2.1 均值回归理论
配对交易的理论基础是均值回归(Mean Reversion)假设。该假设认为,资产价格虽然短期内可能偏离其长期均衡关系,但最终会回归到历史平均水平。在统计上,我们通常用价差序列(Spread)的平稳性来检验这一假设:
python复制# 使用ADF检验价差平稳性
from statsmodels.tsa.stattools import adfuller
def check_stationarity(spread):
result = adfuller(spread)
print(f'ADF Statistic: {result[0]}')
print(f'p-value: {result[1]}')
return result[1] < 0.05
注意:p值小于0.05才能认为序列是平稳的,这是配对交易可行的前提条件
2.2 协整关系检验
单纯的相关系数并不能保证两只资产的价差是平稳的。我们需要使用计量经济学中的协整(Cointegration)检验来确认这种长期均衡关系。最常用的是Engle-Granger两步法:
- 对两只资产的价格序列进行线性回归:price_A = β * price_B + ε
- 检验残差序列ε的平稳性(使用ADF检验)
python复制import statsmodels.api as sm
def engle_granger_test(price_a, price_b):
# 第一步:回归分析
price_b = sm.add_constant(price_b)
model = sm.OLS(price_a, price_b).fit()
spread = model.resid
# 第二步:ADF检验
return check_stationarity(spread)
3. vectorbt实现配对交易
3.1 数据准备与预处理
首先我们需要获取两只相关资产的历史数据。这里以BTC/USD和ETH/USD为例:
python复制import vectorbt as vbt
# 从Binance获取数据
btc_price = vbt.YFData.download('BTC-USD').get('Close')
eth_price = vbt.YFData.download('ETH-USD').get('Close')
# 数据对齐
data = pd.concat([btc_price, eth_price], axis=1).dropna()
data.columns = ['BTC', 'ETH']
3.2 构建价差与交易信号
计算标准化价差(Z-Score)是配对交易的关键步骤:
python复制# 计算价差
hedge_ratio = sm.OLS(data['BTC'], sm.add_constant(data['ETH'])).fit().params[1]
spread = data['BTC'] - hedge_ratio * data['ETH']
# 计算Z-Score
mean = spread.rolling(window=30).mean()
std = spread.rolling(window=30).std()
z_score = (spread - mean) / std
# 生成交易信号
entry_threshold = 1.5
exit_threshold = 0.5
long_signals = z_score < -entry_threshold
short_signals = z_score > entry_threshold
exit_signals = abs(z_score) < exit_threshold
3.3 组合配置与回测
在vectorbt中,我们可以使用Portfolio.from_signals快速构建回测:
python复制# 构建投资组合
portfolio = vbt.Portfolio.from_signals(
data['ETH'], # 使用ETH作为价格序列
entries=long_signals,
short_entries=short_signals,
exits=exit_signals,
upon_opposite_entry=True, # 反向信号时平仓
fees=0.001, # 考虑交易手续费
freq='1D' # 每日调仓
)
# 查看绩效指标
print(portfolio.stats())
4. 策略优化与风险管理
4.1 参数优化
配对交易有几个关键参数需要优化:
- 回看窗口(计算均值和标准差的周期)
- 入场/出场阈值
- 最大持仓时间
使用vectorbt的网格搜索功能:
python复制# 定义参数空间
param_grid = {
'window': np.arange(20, 60, 5),
'entry': np.linspace(1.0, 2.5, 10),
'exit': np.linspace(0.1, 1.0, 10)
}
# 运行网格搜索
grid = vbt.ParameterGrid.from_grid(param_grid)
results = grid.run(backtest_function) # 需要自定义回测函数
4.2 风险管理要点
- 资金分配:单对配对交易不宜超过总资金的5%
- 止损设置:当Z-Score超过3.5时应强制平仓
- 相关性监控:定期检查资产对的协整关系是否仍然成立
python复制# 动态监控相关性
rolling_corr = data['BTC'].rolling(30).corr(data['ETH'])
5. 实际应用中的挑战
5.1 常见问题排查
- 价差不回归:可能因为基本面关系改变,需要及时平仓
- 交易成本侵蚀利润:高频调仓可能导致手续费占比过高
- 流动性风险:小市值资产可能出现无法及时平仓的情况
5.2 实战经验分享
- 选择流动性好的资产对,日均成交量应大于1亿美元
- 避免在重大事件(如分叉、升级)前后建立新头寸
- 组合多个不相关的配对可以降低整体风险
python复制# 多对组合管理示例
pair_list = [('BTC','ETH'), ('SOL','AVAX'), ('BNB','FTT')]
portfolios = [backtest_pair(pair) for pair in pair_list]
combined = vbt.Portfolio.from_orders(portfolios)
我在实际交易中发现,配对交易在震荡市中表现优异,但在趋势性行情中容易亏损。因此建议配合市场状态识别模块,在强趋势行情中降低配对交易的资金分配比例。
