Skip to main content

[策略] Stg_20_Double_Diagonal_Spread

作者: 宋沛恒

日期: 2025-09-22


目录

[toc]


版本

  • V1.0 – 2025-09-22 初版。

原理

概述

在期权市场中,不同期限的隐含波动率(以下简称 IV)水平通常不同。其差异受多种因素影响,如市场大幅波动、市场流动性不平衡、做市商的报价意愿等等。IV 期限结构一般存在可以转换的两种形态:

  • 升水,即远期 IV > 近期 IV
  • 贴水,即远期 IV < 近期 IV

本策略通过对期权市场 IV 期限结构的拟合,在近月和远月上做相反的期权跨式操作,以期获得不同期限间 IV 的变化之差所带来的利润。


符号说明

本文档将使用以下符号:

  • 同一数据切片 nn 个期限的到期时间向量 T\mathbf{T} ,在 t 时刻,
Tt=[T0,t,T1,t,...]\mathbf{T}_t = [T_{0,t}, T_{1,t}, ...]

表示由近到远不同期限的到期时间。

  • 同一数据切片 nn 个期限的 ATMIVATM IV 向量 ATMIV\mathbf{ATMIV} ,在 t 时刻,
ATMIVt=[ATMIV0,t,ATMIV1,t,...]\mathbf{ATMIV}_t = [ATMIV_{0,t}, ATMIV_{1,t}, ...]

表示由近到远不同期限的 ATMIVATM IV

其余标红参数可参考下方策略参数设置章节。


策略因子计算

线性回归

假设 ATMIV\mathbf{ATMIV}T\mathbf{T} 存在如下相关关系:

log(ATMIV)=α+βT+ϵ,ϵN(0,σ2)\log(\mathbf{ATMIV}) = \alpha + \beta \, \mathbf{T} + \boldsymbol{\epsilon}, \quad \boldsymbol{\epsilon} \sim \boldsymbol{N}(0, \sigma^2)

注:

  • T\mathbf{T} 中所有元素均需大于 TTMmin\textcolor{red}{\boldsymbol{TTM}_{min}} .
  • ATMIV\mathbf{ATMIV}T\mathbf{T} 长度仅为 1,则跳过此时间切片。

对其进行线性回归,可得回归系数:

β^=(TT)1Tlog(ATMIV),α^=log(ATMIV)β^T\hat{\beta} = (\mathbf{T}^\top \mathbf{T})^{-1} \mathbf{T}^\top \log(\mathbf{ATMIV}), \\[2mm] \hat{\alpha} = \overline{\log(\mathbf{ATMIV})} - \hat{\beta} \, \overline{\mathbf{T}}

计算回归系数的移动Z-Score

对线性回归得到的 β^\hat{\beta}α^\hat{\alpha}Winz\textcolor{red}{\boldsymbol{Win_z}} 个窗口的Z-Score, Zβ^,tWinzZ_{\hat{\beta},t}^{\textcolor{red}{\boldsymbol{Win_z}}}Zα^,tWinzZ_{\hat{\alpha},t}^{\textcolor{red}{\boldsymbol{Win_z}}}, 以下简记为 Zβ^,tZ_{\hat{\beta},t}Zα^,tZ_{\hat{\alpha},t}, 具体算法详见 ZScore.md.


开仓逻辑

开仓条件

每当切片数据到达,计算如下条件(布尔值):

LongFilter=Zβ^,t<ZopenShortFilter=(Zβ^,t>Zopen)(Zα^,t<Zopen)\text{LongFilter} = Z_{\hat{\beta},t} < - \textcolor{red}{Z_{open}}\\[2mm] \text{ShortFilter} = ( Z_{\hat{\beta},t} > \textcolor{red}{Z_{open}}) \land ( Z_{\hat{\alpha},t} < - \textcolor{red}{Z_{open}})

寻找适合开仓的跨式组合

在所有的到期日中,取 TenorTenor 大于 TTMmin\textcolor{red}{\boldsymbol{TTM}_{min}} 且最早的两个到期日,其中近月记作 EfrontE_{front} ,远月记作 EbackE_{back} , 分别寻找一对期权,组成一个共4腿的跨期跨式组合。具体参数说明及计算方法详见 Func_DeltaNeutralCalendarStrangle.md. 将这一过程记作:

Sdir=Cdir,Efront,Cdir,Eback,Pdir,Efront,Pdir,Eback=f(dir,Efront,Eback,Pund,Δmax,θmin,d)\boldsymbol{S}_{dir} = C_{dir, E_{front}}, C_{dir, E_{back}}, P_{dir, E_{front}}, P_{dir, E_{back}} = f(dir, E_{front}, E_{back}, P_{und}, \textcolor{red}{{\Delta}_{max}}, \textcolor{red}{{\theta}_{min}}, \textcolor{red}{d})

,其中 dir[long,short]dir \in [long, short] , PundP_{und} 为当前标的VWAP价格。

开仓

首先判定是否满足时间条件:

  • 近月合约的 TenorTenor 大于 TTMmin\textcolor{red}{\boldsymbol{TTM}_{min}} ; (注:在上一步中找到的组合必然满足这一条件,无需重复判断)
    • 例如: TTMmin=3\textcolor{red}{\boldsymbol{TTM}_{min}} = 3,近月合约下周三到期,则必须在本周五或更早开仓;
  • 当前时间位于上午 9:35 和下午 14:55 之间。

若满足时间条件,且 LongFilter 成立时,寻找对应的跨式组合:

Slong=Clong,Efront,Clong,Eback,Plong,Efront,Plong,Eback=f(long,Efront,Eback,Pund,Δmax,θmin,dlimit)\boldsymbol{S}_{long} = C_{long, E_{front}}, C_{long, E_{back}}, P_{long, E_{front}}, P_{long, E_{back}} = f(long, E_{front}, E_{back}, P_{und}, \textcolor{red}{{\Delta}_{max}}, \textcolor{red}{{\theta}_{min}}, \textcolor{red}{d_{limit}})

若存在满足条件的组合,则做多远月的跨式组合 {Clong,Eback,Plong,Eback}\{C_{long, E_{back}}, P_{long, E_{back}}\} ,同时做空近月的跨式组合 {Clong,Efront,Plong,Efront}\{C_{long, E_{front}}, P_{long, E_{front}}\} ,记为多头;

若满足时间条件,且 ShortFilter 成立时,寻找对应的跨式组合:

Sshort=Cshort,Efront,Cshort,Eback,Pshort,Efront,Pshort,Eback=f(short,Efront,Eback,Pund,Δmax,θmin,dlimit)\boldsymbol{S}_{short} = C_{short, E_{front}}, C_{short, E_{back}}, P_{short, E_{front}}, P_{short, E_{back}} = f(short, E_{front}, E_{back}, P_{und}, \textcolor{red}{{\Delta}_{max}}, \textcolor{red}{{\theta}_{min}}, \textcolor{red}{d_{limit}})

若存在满足条件的组合,则做空远月的跨式组合 {Cshort,Eback,Pshort,Eback}\{C_{short, E_{back}}, P_{short, E_{back}}\} ,同时做多近月的跨式组合 {Cshort,Efront,Pshort,Efront}\{C_{short, E_{front}}, P_{short, E_{front}}\} ,记为空头。


其他说明

  • 本策略适用于中国国内的 ETF 期权市场,其余市场有待进一步测试。
  • 本策略的数据源是 ETF 期权的 10 秒切片及其衍生数据,包括到期时间、各期限的 ATMIVATM IV ,以及近月和次近月期权的 Greeks 数值。

开发文档


开盘预处理

如果初次运行,本策略需要在开盘前读取至少前 5 个交易日的切片数据并计算交易信号,具体计算方法见下方交易信号计算章节。 如果策略已经存储好5个交易日的因子计算结果,则需要按时间读入该文件,并做好新数据传入的准备。


交易信号计算

切片过滤

  • 由于期权市场绝大部分流动性由做市商提供,而在开盘后或者收盘前的短时间内,做市商一般不会提供优质报价。因此,在本节后续所有计算之前,需要对切片数据进行过滤,以保证计算的准确性。具体来说,除以下数据切片数区间(闭区间)之外的其他切片都需要被设置为空值

    • [3431, 4132]
    • [4685, 5380]
  • 由于曲面拟合的结果有质量上的差别,体现在曲面拟合的均方误差 MSEMSE 上,因此还需要对 MSE>MSECutoffMSE > \textcolor{red}{MSE_{Cutoff}} 的切片设置为空值


因子计算

具体计算伪代码如下,需保留 ATMIV\textcolor{blue}{\mathbf{ATMIV}} , T\textcolor{blue}{\mathbf{T}} , βt\textcolor{blue}{\beta_t} , αt\textcolor{blue}{\alpha_t} , Zβ^,t\textcolor{blue}{Z_{\hat{\beta},t}}Zα^,t\textcolor{blue}{Z_{\hat{\alpha},t}} 以供核对:

输入: 时间切片 t, 当前时间 current_dt, 到期日列表 ExpList[t]
输出: Z_beta[win_z][t], Z_alpha[win_z][t]

Step 1: 计算ATMIV
对每个时间切片 t:
定义 T[t] 为各到期日Tenor序列, ATMIV[t]为与前者一一对应的平值隐波序列, 其中T[t]中所有元素均需大于 TTM_min.
对每个到期期限 i:
ATMIV[t][i] = ATMVol(MAWd=1, i) # 调用库中已有函数
T[t][i] = ExpList[t][i] - current_dt

Step 2: 最小二乘回归
对每个时间切片 t:
若 len(ATMIV[t]) ≤ 1 或 len(T[t]) ≤ 1: 跳过该切片
y = log(ATMIV[t])
X = T[t]
通过最小二乘法求解y对X回归的斜率beta[t]和截距alpha[t]。最小二乘法求解的C++示例代码见Func_SimpleLinearRegressionCholesky.md.


Step 3: 计算Z-Score (具体算法见 ZScore.md)
Z_beta[win_z][t] = Z_score(beta, win_z, t)
Z_alpha[win_z][t] = Z_score(alpha, win_z, t)

开仓逻辑

具体逻辑伪代码如下,需保留跨期组合计算结果以供核对:

输入: 时间切片 t, 当前时间 current_dt, 到期日列表 ExpList[t], 组合加总 Delta 上限 delta_max,
多头组合加总 Theta 下限 theta_min, 跨式组合距离限制 d_limit
输出: 交易信号和跨式组合

Step 0: 寻找到期日
取 ExpList 中最早的两个大于 TTM_min 的到期日 E_front, E_back

Step 1: 时间条件检查
若 09:35 ≤ current_dt ≤ 14:55 则继续,否则跳过

Step 2: 寻找跨期跨式组合 (具体算法见Func_DeltaNeutralCalendarStrangle.md)
C_{long, E_front}, C_{long, E_back}, P_{long, E_front}, P_{long, E_back} = f(long, E_front, E_back, delta_max, theta_min, d)
C_{short, E_front}, C_{short, E_back}, P_{short, E_front}, P_{short, E_back} = f(short, E_front, E_back, delta_max, theta_min, d)

Step 3: 计算过滤条件
LongFilter = Z_beta[win_z][t] < - Z_open
ShortFilter = (Z_beta[win_z][t] > Z_open) and (Z_alpha[w][t] < - Z_open)

Step 4: 开仓判断
若 LongFilter 成立:
做多远月{C_{long, E_back}, P_{long, E_back}},做空近月{C_{long, E_front}, P_{long, E_front}}, 记为多头

若 ShortFilter 成立:
做空远月{C_{short, E_back}, P_{short, E_back}},做多近月{C_{short, E_front}, P_{short, E_front}}, 记为空头

否则: 该切片无操作

持仓信息记录与更新

在开仓后,策略应记录

  • VentryV_{entry} : 开仓时的各腿总价值(多头减去空头)
  • VtV_{t}: 当前切片 tt 各腿总价值(多头减去空头)

盘后处理

最近5个交易日的 betabetaalphaalpha 的计算结果需要实时记录,并于盘后按照时间顺序存储成文件,以便下一交易日开始时可以读取。文件应采用先进先出的原则,只保留最新5日的数据。


平仓逻辑

以下平仓逻辑均在 09:35 ≤ current_dt ≤ 14:55 时进行判断:

  1. 多头Theta平仓:

    如果多头组合中的加总 Theta 小于 0, 即平掉所有仓位。

  2. 到期平仓:

    当组合中有某腿 TenorTenor 小于等于 Closeexp\textcolor{red}{\boldsymbol{Close}_{exp}} 即可平掉所有仓位。

    • 例如: Closeexp=2.25\textcolor{red}{\boldsymbol{Close}_{exp}}=2.25 , 组合中某腿本周三收盘到期,则可以在周一下午14:00开始平仓。
  3. 条件平仓:

    • 当组合为多头,而 ShortFilter = 1 时,平掉所有仓位;
    • 当组合为空头,而 LongFilter = 1 时,平掉所有仓位。
  4. 价值止损平仓:

    VtVentryρslSV_{t} - V_{entry} \le -\textcolor{red}{\boldsymbol{\rho_{sl}}} * S 时,平掉所有仓位。其中 SS 为标的当前价格。


交易执行逻辑

在开仓信号发出时,应计算组合各腿预计保证金金额 MarginMargin (需要考虑组合保证金情况,空头可节省一腿的保证金), 以及策略分配的资金总额 TotalCapitalTotalCapital . 则组合各腿开仓数量均为 ceil(TotalCapitalMargin)\textbf{ceil}(\frac{TotalCapital}{Margin}) . 本策略现阶段应保证组合内各腿均成交一手,再开下一组。具体开仓执行算法见 Exec_11_Option4LegsOpen.md . 平仓时,可按照 Exec_12_OptionSingleLeg.md 平仓。 本策略在开平仓期间需记录成交状态,若由于系统宕机等导致交易中断时,可以在恢复时继续交易。 本策略的多头仓位允许用于策略间仓位的抵消,而空头仓位不允许


策略参数设置

参数名示例值说明
Winz\textcolor{red}{\boldsymbol{Win_z}}1440Z-Score滚动计算周期(单位:10秒切片数量)
Zopen\textcolor{red}{Z_{open}}1.0开仓距离
dlimit\textcolor{red}{d_{limit}}0.1跨式组合距离限制
Δmax\textcolor{red}{\boldsymbol{\Delta}_{max}}0.2组合加总 Delta 上限
TTMmin\textcolor{red}{\boldsymbol{TTM}_{min}}3最晚开仓时间(单位:交易日)
Closeexp\textcolor{red}{\boldsymbol{Close}_{exp}}2.25临近到期平仓时间(单位:交易日)
θmin\textcolor{red}{\boldsymbol{\theta}_{min}}0.5多头组合加总 Theta 下限
ρsl\textcolor{red}{\rho_{sl}}0.02价值止损平仓比例
MSECutoff\textcolor{red}{MSE_{Cutoff}}0.0005均方误差上限

策略信号核对表

参数名说明
Strategy策略名称
ParameterGroup策略参数组
ATMIV平值隐波序列
T到期时间序列
beta[t]回归 beta
alpha[t]回归 alpha
Z_beta[win_z][t]beta Z-Score
Z_alpha[win_z][t]alpha Z-Score
C_{long, E_front}, C_{long, E_back}, P_{long, E_front}, P_{long, E_back}多头跨期组合的合约ID(可为空)
C_{short, E_front}, C_{short, E_back}, P_{short, E_front}, P_{short, E_back}空头跨期组合的合约ID(可为空)