期货量化策略讲解:天勤量化下的跨期价差均值回归策略实战

前言

很多人做跨期价差策略时,只关注价差回归方向,却忽略了两个关键细节:一是价差序列本身是否稳定,二是双腿仓位是否按波动做了平衡。忽略这两点,策略很容易出现看对方向却仍然回撤过大的情况。

这篇我给出一套跨期价差均值回归策略的完整结构,基于天勤量化演示双合约同步信号、价差z-score入场、双腿风控和时间退出。

一、策略逻辑

  • 构建远近月价差序列:spread = near - far。
  • 计算滚动均值与标准差,得到z-score。
  • z-score > 上阈值做卖近买远;z-score < 下阈值做买近卖远。
  • z-score回归到中线附近平仓。

二、参数建议

  • 价差窗口:120根K线
  • 入场阈值:|z| >= 2.0
  • 平仓阈值:|z| <= 0.4
  • 组合风险上限:账户权益 1.0%
  • 强制退出:到期前固定天数清仓

三、天勤量化完整代码示例

python 复制代码
import os
import math
from datetime import date

import pandas as pd
from tqsdk import TqApi, TqAuth, TqSim, TqBacktest, TargetPosTask

NEAR = "SHFE.rb2409"
FAR = "SHFE.rb2410"
KLINE_SEC = 15 * 60
WIN = 120
ENTRY_Z = 2.0
EXIT_Z = 0.4
RISK_CAP = 0.01
LOT_SIZE_NEAR = 10
LOT_SIZE_FAR = 10

api = TqApi(
    TqSim(),
    backtest=TqBacktest(start_dt=date(2024, 1, 1), end_dt=date(2024, 12, 20)),
    auth=TqAuth(os.getenv("TQ_USER", "账户"), os.getenv("TQ_PASS", "密码")),
)

k_near = api.get_kline_serial(NEAR, KLINE_SEC, data_length=400)
k_far = api.get_kline_serial(FAR, KLINE_SEC, data_length=400)
q_near = api.get_quote(NEAR)
q_far = api.get_quote(FAR)

task_near = TargetPosTask(api, NEAR)
task_far = TargetPosTask(api, FAR)

state = 0  # 0:空仓, 1:卖近买远, -1:买近卖远

def lot_by_balance(balance, px_near, px_far):
    budget = balance * RISK_CAP
    one_pair_cost = px_near * LOT_SIZE_NEAR + px_far * LOT_SIZE_FAR
    return max(1, math.floor(budget / max(one_pair_cost, 1)))

while True:
    api.wait_update()
    if not (api.is_changing(k_near.iloc[-1], "datetime") and api.is_changing(k_far.iloc[-1], "datetime")):
        continue

    s_near = pd.Series(k_near["close"])
    s_far = pd.Series(k_far["close"])
    spread = s_near - s_far

    mu = spread.rolling(WIN).mean().iloc[-1]
    sd = spread.rolling(WIN).std().iloc[-1]
    if sd != sd or sd == 0:
        continue

    z = float((spread.iloc[-1] - mu) / sd)

    px_near = float(q_near.last_price)
    px_far = float(q_far.last_price)
    balance = api.get_account().balance
    qty = lot_by_balance(balance, px_near, px_far)

    if state == 0:
        if z >= ENTRY_Z:
            task_near.set_target_volume(-qty)  # 卖近
            task_far.set_target_volume(qty)    # 买远
            state = 1
        elif z <= -ENTRY_Z:
            task_near.set_target_volume(qty)   # 买近
            task_far.set_target_volume(-qty)   # 卖远
            state = -1
    else:
        if abs(z) <= EXIT_Z:
            task_near.set_target_volume(0)
            task_far.set_target_volume(0)
            state = 0

四、实盘化关键细节

  • 双腿成交要做时间一致性检查,避免单腿先成交导致裸露风险。
  • 价差序列要持续监控稳定性,窗口漂移时要先降仓再观察。
  • 到期切换前要提前退出,避免交割月流动性变化带来的执行偏差。

五、总结

跨期价差策略的核心不在猜方向,而在管理偏离与回归过程。只要你把价差标准化、双腿同步和风险预算做成固定流程,策略稳定性会比单腿方向策略更可控。

六、FAQ

1)为什么用z-score而不是绝对价差?

z-score做了标准化,跨阶段可比性更好。

2)双腿手数必须1:1吗?

不一定,建议按合约乘数和波动做平衡。

3)什么时候不适合做价差回归?

当价差结构发生持续性变化、回归特征弱化时。

4)回测里双腿都成交,模拟却不同步怎么办?

先查撮合时序和流动性,再加成交保护与超时撤单机制。

风险提示

本文用于期货量化策略研发实践讨论,不构成投资建议。请结合自身风险承受能力独立决策。

相关推荐
卷无止境4 小时前
FastAPI 后台任务的边界,以及 Celery、Redis 与自建调度系统的选择
后端·python
卷无止境4 小时前
Linux + Docker + FastAPI 工程化实践指南
后端·python·fastapi
小O的算法实验室13 小时前
IEEE TASE,基于MPC的多无人机协同搜索竞争群体优化方法
算法
Tbisnic13 小时前
BGE-M3 算法详解:从模型架构到三种检索方式的数学原理
算法·自然语言处理·大模型·bert·transformer·注意力机制
聪明蛋子哟13 小时前
Stagehand v3多语言SDK:Python/Go/Rust/Java下的浏览器自动化统一方案
python·golang·rust
Brilliantwxx14 小时前
【算法从零到千】【55-58】哈希位图+常见数学运算 接口
算法
今天AI了吗14 小时前
Python 基础语法(一):常量、变量、输入输出与运算符
开发语言·数据库·人工智能·python·sql·深度学习·机器学习
卷无止境14 小时前
Windows 上丝滑开发 Python,并稳定构建 Docker 镜像
后端·python·docker
空堂与归15 小时前
用户分群找不到规律?用K-Means聚类算法自动发现数据模式
算法·机器学习·kmeans·聚类
TELL52115 小时前
selenium webdriver 第二次初始化的异常
开发语言·python