在R语言中编写循环实现配对交易策略回测的技术问询
基于协整组合的配对交易策略回测方案
哈哈,刚好折腾过类似的配对交易回测,结合你已经完成的协整检验结果,给你梳理一套可行的落地流程:
一、回测前的准备工作
- 先把每一对协整资产的时间序列数据提出来:从你的资产数据集里,照着
combos每一列的ID,把对应资产的收盘价序列(配对交易优先用收盘价)捞出来就行 - 计算每对资产的均衡价差:用线性回归拟合它们的协整关系,得到的残差就是我们要盯的价差。比如资产X和Y,拟合
Y = α + βX + ε,这里的ε就是核心的价差指标 - 确定交易触发阈值:常规操作是用残差的均值±n倍标准差当开仓线,比如±1.5或2倍标准差,这个数值可以拿一小段历史数据调优,别太激进也别太保守
二、配对交易回测的核心逻辑
对着每一对协整资产,按下面的规则模拟交易就行:
- 开仓信号:当价差冲破上阈值(均值+标准差倍数),就做空Y、做多X;当价差跌破下阈值(均值-标准差倍数),就做多Y、做空X
- 平仓信号:要么等价差回归到均值附近(比如±0.5倍标准差范围内)就平仓,要么提前设好止损止盈线,防止极端行情把你套牢
- 仓位管理:一定要根据拟合出来的β系数调整仓位,比如做多X的仓位 = β × 做空Y的仓位,这样才能有效对冲市场的系统性风险
三、Python代码示例(快速上手版)
假设你的资产价格数据存在price_data这个DataFrame里,索引是时间,列名是资产ID:
import numpy as np import pandas as pd from statsmodels.tsa.stattools import coint # 遍历所有869组协整组合 for col_idx in range(combos.shape[1]): # 取出当前组合的两个资产ID asset_a_id = combos[0, col_idx] asset_b_id = combos[1, col_idx] # 获取两只资产的收盘价序列 asset_a = price_data[str(asset_a_id)] asset_b = price_data[str(asset_b_id)] # 拟合协整回归,计算价差(残差) # 因为已经做过协整检验,直接拟合线性回归就行 beta, alpha = np.polyfit(asset_a, asset_b, 1) spread = asset_b - (alpha + beta * asset_a) # 计算交易阈值 spread_mean = spread.mean() spread_std = spread.std() upper_limit = spread_mean + 2 * spread_std # 可调整倍数 lower_limit = spread_mean - 2 * spread_std close_limit = 0.5 * spread_std # 回归到均值±0.5倍标准差平仓 # 生成交易信号 signals = pd.DataFrame(index=spread.index) # 价差过高:空B多A signals['long_A_short_B'] = (spread > upper_limit).astype(int) # 价差过低:多B空A signals['long_B_short_A'] = (spread < lower_limit).astype(int) # 价差回归:平仓 signals['close_all'] = ((spread >= spread_mean - close_limit) & (spread <= spread_mean + close_limit)).astype(int) # 后续可以基于信号计算回测收益、最大回撤等指标 # 比如用信号计算每日仓位,再结合收益率算策略收益 # ...
四、回测后的关键评估指标
回测完别光看赚了多少钱,得看这些指标判断策略靠谱不:
- 累计收益率:直观看策略整体盈利情况
- 夏普比率:衡量风险调整后的收益,数值越高越划算
- 最大回撤:看策略最惨的时候亏了多少,心里有底
- 胜率:盈利交易次数占总次数的比例,辅助判断策略稳定性
- 协整稳定性:回测过程中定期重新做协整检验,要是协整关系破了,这组配对就得剔除了
内容的提问来源于stack exchange,提问作者Owen Cleberson




