165-基于两融信用账户的分钟级配对交易策略
由qxiao创建,最终由qxiao 被浏览 3 用户
1. 策略定位与适用场景
本策略为两融信用账户下的配对交易(Pairs Trading)/统计套利策略。通过同时交易两只高度相关或同一行业的股票(示例:601328.SH 与 601998.SH),在它们的相对价格出现短期偏离时进行多空对冲交易,目标是获取价差均值回归带来的收益,降低对大盘方向的依赖。
适用场景:
- 两只标的相关性较高、基本面/行业属性相近
- 客户可使用融资融券账户,具备融券券源或可融券额度
- 希望降低交易噪声、控制交易频率与执行成本
2. “30分钟信号 + 分钟执行”
2.1 30分钟信号
策略只在每小时的 :00 和 :30计算一次统计信号(z-score)并做开平仓决策:
- 例如:10:00、10:30、11:00、11:30、13:30…(午休时段不产生分钟bar)
- 非信号点不做开平仓决策,仅更新滚动数据
目的:
- 过滤分钟级噪声,减少过度交易
- 降低冲击成本、手续费与两融利息对收益的侵蚀
- 更贴近实际可执行的交易节奏
2.2 分钟执行
策略引擎按1分钟bar推进:
- 每分钟接收行情并更新滚动窗口
- 订单、持仓、保证金与负债的变化也随分钟推进而更新\n因此称为“分钟执行”(execution on minute bars)。
3. 信号构建方法(核心逻辑)
3.1 滚动回归估计对冲关系
策略使用滚动窗口(参数 REG_WIN_MIN,例:960分钟)估计两标的之间的线性关系:
- 对 X、Y 的价格序列(默认使用 log(price) 更稳健)做回归:\nY ≈ α + β·X
其中:
- β:对冲系数(反映两者相对变动关系)
- α:截距项
3.2 价差(残差)与 z-score
根据回归结果计算残差价差:
- spread = Y − (α + β·X)
对 spread 做标准化得到 z-score:
- z = (spread − mean(spread)) / std(spread)
解释:
- z > 0:当前价差高于历史均值(可理解为 Y 相对偏贵)
- z < 0:当前价差低于历史均值(Y 相对偏便宜)
- |z| 越大,偏离越极端,回归交易的性价比通常越高
备注:z 为负数完全正常,信号判断看的是 |z| 是否超过阈值。
4. 开平仓规则
4.1 开仓规则(仅在信号点触发)
- 当 z 从阈值内“上穿” ENTRY_Z:\n→ 认为价差偏高,执行 做空 Y + 做多 X
- 当 z 从阈值内“下穿” −ENTRY_Z:\n→ 认为价差偏低,执行 做多 Y + 做空 X
这里采用“穿越触发(crossing trigger)”而不是“只要超过就触发”,目的是:
- 防止 z 长时间在阈值外导致重复开仓尝试
- 降低噪声造成的频繁交易
4.2 平仓规则(仅在信号点检查)
有持仓时:
- 均值回归平仓:当 |z| ≤ EXIT_Z
- 极端止损平仓:当 |z| ≥ STOP_Z
平仓后策略会进入冷却期(见第 6 节),以减少震荡行情下的反复交易。
5. 仓位管理与两融约束
5.1 总敞口与单腿上限
策略使用名义金额控制仓位:
GROSS_EXPO_PCT:双腿合计敞口占组合权益比例(例 0.6)MAX_LEG_PCT:单腿敞口不超过组合权益比例(例 0.45)
示例:组合权益 100万
- 双边总敞口约 60万
- 单边基础敞口约 30万(再结合 β 做缩放)
5.2 对冲缩放(beta scale)
策略对 X 腿敞口做缩放:
scale = clip(|beta|, 0.3, 3.0)\n避免 β 极端导致某条腿异常过大/过小。
5.3 两融可交易量检查
策略在下单前会调用两融接口检查:
- 可融资买入量(get_margincash_open_volume)
- 可融券卖出量(get_marginsec_open_volume)\n若额度不足则跳过交易并输出原因日志,保证策略具备真实可执行性。
6. 控制交易频率的三道“安全阀”
针对“交易频率过高/成本过高”等问题,加入三项控频机制:
6.1 穿越触发(Crossing Trigger)
只有当 z 从阈值内穿越到阈值外才开仓:
- 上穿:
prev_z≤ ENTRY_Z 且z> ENTRY_Z - 下穿:
prev_z≥ -ENTRY_Z 且z< -ENTRY_Z
效果:
- 大幅减少“阈值外重复触发”
- 更符合“偏离发生→入场”的逻辑
6.2 冷却时间(Cooldown)
平仓后进入冷却期 COOLDOWN_SIGNAL_BARS 个信号点:
- 例如设置为 2,则平仓后 1小时内不再开仓
效果:
- 避免震荡区间里“刚平就进、来回刷单”
- 降低手续费、滑点、两融利息累积
6.3 Beta 过滤(关系稳定性过滤)
当 abs(beta) < BETA_ABS_MIN 时禁止开仓:
- 例如
BETA_ABS_MIN= 0.30
解释:
- β 太小意味着两标的的线性关系弱或阶段性失效
- 此时对冲效果差,容易出现“看似对冲,实则裸露风险”
效果:
- 在结构变化阶段主动降频与避险
- 往往对降低回撤更有效
7. 执行保护:15:00 不开仓
策略默认不在 15:00 发起开仓:
- 主要原因是分钟回测/撮合机制里,最后一根bar之后可能没有“下一根bar”来完成成交推进
- 在两融双腿交易中,若出现单腿成交/另一腿未成交,风险会放大
因此策略在 15:00 仅打印信号与允许平仓判断,不做新开仓。
8. 日志输出与可解释性
策略在每个 30 分钟信号点输出关键解释变量:
- 时间戳
- z 值、beta、alpha
- 当前持仓状态(空仓 / 多X空Y / 多Y空X)
- 是否在冷却期(cooldown ON/OFF)
- 是否因 beta 过滤禁止开仓(beta_block YES/NO)
- z 的历史范围 z_range(用于评估阈值是否合理)
示例输出:
[Z@30m] 2025-08-xx 10:30:00 z=1.72 beta=0.85 alpha=... state=0
cooldown=OFF beta_block=NO z_range=(-2.10,2.35)
可通过日志快速验证:
- 信号是否只在 :00/:30 产生
- 是否满足穿越触发逻辑
- 冷却期是否有效减少交易
- beta失效时是否自动“降频不交易”
策略源码:
https://bigquant.com/codesharev3/133ab4e9-7bb9-46d9-a3e4-75f793065796
\