[策略] Stg_20_Double_Diagonal_Spread
作者: 宋沛恒
日期: 2025-09-22
[toc]
在期权市场中,不同期限的隐含波动率(以下简称 IV)水平通常不同。其差异受多种因素影响,如市场大幅波动、市场流动性不平衡、做市商的报价意愿等等。IV 期限结构一般存在可以转换的两种形态:
- 升水,即远期 IV > 近期 IV
- 贴水,即远期 IV < 近期 IV
本策略通过对期权市场 IV 期限结构的拟合,在近月和远月上做相反的期权跨式操作,以期获得不同期限间 IV 的变化之差所带来的利润。
符号说明
本文档将使用以下符号:
- 同一数据切片 n 个期限的到期时间向量 T ,在 t 时刻,
Tt=[T0,t,T1,t,...]
表示由近到远不同期限的到期时间。
- 同一数据切片 n 个期限的 ATMIV 向量 ATMIV ,在 t 时刻,
ATMIVt=[ATMIV0,t,ATMIV1,t,...]
表示由近到远不同期限的 ATMIV 。
其余标红参数可参考下方策略参数设置章节。
策略因子计算
线性回归
假设 ATMIV 与 T 存在如下相关关系:
log(ATMIV)=α+βT+ϵ,ϵ∼N(0,σ2)
注:
- T 中所有元素均需大于 TTMmin .
- 若 ATMIV 或 T 长度仅为 1,则跳过此时间切片。
对其进行线性回归,可得回归系数:
β^=(T⊤T)−1T⊤log(ATMIV),α^=log(ATMIV)−β^T
计算回归系数的移动Z-Score
对线性回归得到的 β^ 和 α^ 求 Winz 个窗口的Z-Score, Zβ^,tWinz 和 Zα^,tWinz, 以下简记为 Zβ^,t 和 Zα^,t, 具体算法详见 ZScore.md.
开仓逻辑
开仓条件
每当切片数据到达,计算如下条件(布尔值):
LongFilter=Zβ^,t<−ZopenShortFilter=(Zβ^,t>Zopen)∧(Zα^,t<−Zopen)
寻找适合开仓的跨式组合
在所有的到期日中,取 Tenor 大于 TTMmin 且最早的两个到期日,其中近月记作 Efront ,远月记作 Eback , 分别寻找一对期权,组成一个共4腿的跨期跨式组合。具体参数说明及计算方法详见 Func_DeltaNeutralCalendarStrangle.md. 将这一过程记作:
Sdir=Cdir,Efront,Cdir,Eback,Pdir,Efront,Pdir,Eback=f(dir,Efront,Eback,Pund,Δmax,θmin,d)
,其中 dir∈[long,short] , Pund 为当前标的VWAP价格。
首先判定是否满足时间条件:
- 近月合约的 Tenor 大于 TTMmin ; (注:在上一步中找到的组合必然满足这一条件,无需重复判断)
- 例如: TTMmin=3,近月合约下周三到期,则必须在本周五或更早开仓;
- 当前时间位于上午 9:35 和下午 14:55 之间。
若满足时间条件,且 LongFilter 成立时,寻找对应的跨式组合:
Slong=Clong,Efront,Clong,Eback,Plong,Efront,Plong,Eback=f(long,Efront,Eback,Pund,Δmax,θmin,dlimit)
若存在满足条件的组合,则做多远月的跨式组合 {Clong,Eback,Plong,Eback} ,同时做空近月的跨式组合 {Clong,Efront,Plong,Efront} ,记为多头;
若满足时间条件,且 ShortFilter 成立时,寻找对应的跨式组合:
Sshort=Cshort,Efront,Cshort,Eback,Pshort,Efront,Pshort,Eback=f(short,Efront,Eback,Pund,Δmax,θmin,dlimit)
若存在满足条件的组合,则做空远月的跨式组合 {Cshort,Eback,Pshort,Eback} ,同时做多近月的跨式组合 {Cshort,Efront,Pshort,Efront} ,记为空头。
其他说明
- 本策略适用于中国国内的 ETF 期权市场,其余市场有待进一步测试。
- 本策略的数据源是 ETF 期权的 10 秒切片及其衍生数据,包括到期时间、各期限的 ATMIV ,以及近月和次近月期权的 Greeks 数值。
开发文档
开盘预处理
如果初次运行,本策略需要在开盘前读取至少前 5 个交易日的切片数据并计算交易信号,具体计算方法见下方交易信号计算章节。
如果策略已经存储好5个交易日的因子计算结果,则需要按时间读入该文件,并做好新数据传入的准备。
交易信号计算
切片过滤
-
由于期权市场绝大部分流动性由做市商提供,而在开盘后或者收盘前的短时间内,做市商一般不会提供优质报价。因此,在本节后续所有计算之前,需要对切片数据进行过滤,以保证计算的准确性。具体来说,除以下数据切片数区间(闭区间)之外的其他切片都需要被设置为空值:
- [3431, 4132]
- [4685, 5380]
-
由于曲面拟合的结果有质量上的差别,体现在曲面拟合的均方误差 MSE 上,因此还需要对 MSE>MSECutoff 的切片设置为空值。
因子计算
具体计算伪代码如下,需保留 ATMIV , T , βt , αt , Zβ^,t 和 Zα^,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}}, 记为空头
否则: 该切片无操作
持仓信息记录与更新
在开仓后,策略应记录
- Ventry : 开仓时的各腿总价值(多头减去空头)
- Vt: 当前切片 t 各腿总价值(多头减去空头)
盘后处理
最近5个交易日的 beta 和 alpha 的计算结果需要实时记录,并于盘后按照时间顺序存储成文件,以便下一交易日开始时可以读取。文件应采用先进先出的原则,只保留最新5日的数据。
平仓逻辑
以下平仓逻辑均在 09:35 ≤ current_dt ≤ 14:55 时进行判断:
-
多头Theta平仓:
如果多头组合中的加总 Theta 小于 0, 即平掉所有仓位。
-
到期平仓:
当组合中有某腿 Tenor 小于等于 Closeexp 即可平掉所有仓位。
- 例如: Closeexp=2.25 , 组合中某腿本周三收盘到期,则可以在周一下午14:00开始平仓。
-
条件平仓:
- 当组合为多头,而 ShortFilter = 1 时,平掉所有仓位;
- 当组合为空头,而 LongFilter = 1 时,平掉所有仓位。
-
价值止损平仓:
当 Vt−Ventry≤−ρsl∗S 时,平掉所有仓位。其中 S 为标的当前价格。
交易执行逻辑
在开仓信号发出时,应计算组合各腿预计保证金金额 Margin (需要考虑组合保证金情况,空头可节省一腿的保证金), 以及策略分配的资金总额 TotalCapital . 则组合各腿开仓数量均为 ceil(MarginTotalCapital) .
本策略现阶段应保证组合内各腿均成交一手,再开下一组。具体开仓执行算法见 Exec_11_Option4LegsOpen.md .
平仓时,可按照 Exec_12_OptionSingleLeg.md 平仓。
本策略在开平仓期间需记录成交状态,若由于系统宕机等导致交易中断时,可以在恢复时继续交易。
本策略的多头仓位允许用于策略间仓位的抵消,而空头仓位不允许。
策略参数设置
| 参数名 | 示例值 | 说明 |
|---|
| Winz | 1440 | Z-Score滚动计算周期(单位:10秒切片数量) |
| Zopen | 1.0 | 开仓距离 |
| dlimit | 0.1 | 跨式组合距离限制 |
| Δmax | 0.2 | 组合加总 Delta 上限 |
| TTMmin | 3 | 最晚开仓时间(单位:交易日) |
| Closeexp | 2.25 | 临近到期平仓时间(单位:交易日) |
| θmin | 0.5 | 多头组合加总 Theta 下限 |
| ρsl | 0.02 | 价值止损平仓比例 |
| MSECutoff | 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(可为空) |