BigQuant使用文档

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

\

标签

配对交易均值回归
{link}