多资产股指期货期权套利策略回测案例
在现代金融市场的量化投资实践中,多资产策略早已成为机构投资者构建低波动、绝对收益产品的核心手段。随着国内衍生品市场的日益成熟,期货、期权等工具不再仅仅作为单一方向性投机的载体,而是更多地被纳入到跨品种、跨期限的综合配置框架中。相比传统的单边趋势跟踪策略,基于多资产定价的套利策略能够利用相关品种间的统计规律或理论定价关系,在有效控制方向性风险的前提下,捕捉价格回归带来的确定性收益。基于这一需求,DolphinDB 回测引擎提供了高性能的多资产混合回测能力,使研究人员能够在统一平台中实现复杂的期货期权策略,从而更贴近地验证其在实盘环境中的表现。
本文策略案例所有代码基于 3.00.6 版本 DolphinDB 、3.00.6.1 版本 Backtest 插件和 MatchingEngineSimulator 插件运行。
1. 背景介绍
期货与期权作为两类核心的风险管理工具,其价格走势高度相关,却又时常因微观结构因素产生短暂背离。基于期权平价关系(Put-Call Parity, PCP)的套利策略,正是利用期货与期权之间理论定价与实际交易价格的偏差,捕捉无风险或低风险收益的主流量化手段。
然而,此类策略在实际落地中面临三大挑战:一是跨品种协同难,期货与期权分属不同合约体系与保证金账户,传统单资产回测难以模拟真实的资金占用与风险对冲;二是高频信号衰减快,基于快照频(Snapshot)的定价偏差往往稍纵即逝,对回测框架的时序处理精度与低延迟模拟能力要求极高;三是执行风险高,由于涉及两腿甚至多腿组合,一旦单腿订单未成交或撤单不及时,极易造成裸露的方向性风险。
基于上述背景,本策略依托 DolphinDB 的高性能多资产回测引擎,构建了期货期权 PCP 平价套利策略。利用 DolphinDB 回测引擎实现该策略,能够还原实盘中的资金流转、冲击成本及风险敞口,为多资产套利策略的研发与验证提供了坚实的技术支撑。
2. 策略逻辑
策略以股指期货为现货标的,结合平值期权构建合成期货头寸,通过实时监控两者的价差偏离捕捉套利机会。系统内置智能移仓逻辑以应对合约到期风险,引入 Delta 动态对冲机制剥离市场方向性波动干扰,并设计了严密的订单状态管理与追单机制,确保在极端行情下仍能维持组合的闭合状态。
本策略运用 DolphinDB 回测框架,实现期货期权多资产 PCP 平价套利逻辑,围绕股指期货与股指期权的相对定价关系开展快照频套利交易,核心思路是:
-
根据期货和期权到期日判断当前主力合约标的,到期前 5 天进行移仓换月;
-
根据 PCP 平价公式,用同一标的、同一到期月份的平值看涨/看跌期权构建合成期货价格,当“合成期货价格”与“期货价格”偏离超过阈值时开仓,偏离回归时平仓;
-
持仓期间通过期货对冲组合 Delta,降低方向性暴露;
-
通过期权未成交订单检查,增加撤单和追单逻辑,防止单腿开仓造成风险暴露。
2.1 交易标的
-
期货腿:主力股指期货合约(按月份滚动)。
-
期权腿:与主力期货对应到期月的平值看涨(Call)和平值看跌(Put)。
-
套利组合:
-
正向组合(多头合成远期):买 Call + 卖 Put。
-
反向组合(空头合成远期):卖 Call + 买 Put。
-
2.2 交易规则
2.2.1 移仓换月规则
每个交易日先确定交易月份:
-
若距离当月到期仍有超过 5 个交易日,则交易当月;
-
若距离到期不足(含)5 个交易日,则切换到下月合约。
2.2.2 平值期权选择规则
在主力月份期权池中,选择行权价最接近期货最新价的一组 Call/Put 作为当下 ATM 组合。
2.2.3 开平仓规则
开仓信号:
-
若
C_bid - P_ask + K*DF < F - threshold,开“正向组合”(买 Call、卖 Put)。 -
若
C_ask - P_bid + K*DF > F + threshold,开“反向组合”(卖 Call、买 Put)。
其中 F 为期货最新价, K 为 ATM 行权价, DF 为 exp(-r*T) ,即折现因子, r 为无风险利率, T 为剩余年化到期时间。
平仓信号:
-
正向组合平仓条件:
C_bid - P_ask + K*DF >= F - threshold/2。 -
反向组合平仓条件:
C_ask - P_bid + K*DF <= F + threshold/2。
2.2.4 风险控制
-
仓位上限:限制期权单边最大持仓手数,避免无限加仓。
-
Delta 对冲:实时监控组合 Delta,超限后用期货进行方向对冲。
-
委托管理:订单超时未成交时触发撤单/追价,优先保证组合双腿一致性,降低单腿暴露风险。
-
双腿同时没有成交:报单以当前第一档报价,同时挂出 2 条腿。 5 秒之内如果没有成交,则全部撤单,当前这轮信号作废,并进行下一轮套利信号检查;
-
单腿成交:如果 5 秒之内成交了其中一条腿,则另外一条腿撤单后用对手价报单进行交易。
-
3. 策略实现流程
使用 DolphinDB 回测引擎实现多资产策略回测步骤如下所示:
-
策略输入:准备基本信息表和行情表
-
策略开发:根据回调函数参数使用策略回调函数
-
策略配置:设置策略参数
-
策略创建和执行:创建回测引擎并插入行情执行回测
-
策略输出:调用接口获取回测结果
3.1 策略输入:准备基本信息表和行情表
3.1.1 基本信息表
基本信息表用于向回测引擎传入策略回测必要的合约信息,该表是期权期货交易保证金计算、手续费计算、交割日处理的依据。用户需要按回测引擎要求,处理合约信息为基本信息表,并涵盖所有需要回测的标的。同时,在合约信息更新时,用户也可通过接口说明接口更新基本信息表。基本信息表完整输入结构和要求可参考文档多资产回测配置。
3.1.1.1 期权基本信息表
参考中金所期权合约表:沪深 300 股指期权 | 中国金融期货交易所,本策略期权基本信息表设置如下:
表 3-1 期权基本信息表结构
| 列名 | 类型 | 说明 |
|---|---|---|
| symbol | SYMBOL 或 STRING | 期权合约代码 |
| assetType | INT | 品种类型:设置为 3 ,即股指期权 |
| underlyingCode | STRING | 期权资产对应的期货标的代码 |
| optType | INT |
期权类型: 1:看涨(call) 2:看跌(put) |
| strikePrice | DOUBLE | 期权行权价 |
| multiplier | DOUBLE |
合约乘数: 沪深 300 股指期权为 100.0 |
| marginRatio | DOUBLE |
保证金比例: 根据实际调整,目前设为 0.12 |
| tradeUnit | DOUBLE |
合约单位: 仅商品期权需要设置,其他设为 1.0 |
| priceUnit | DOUBLE |
报价单位: 指数点,设置为 1 |
| priceTick | DOUBLE | 价格最小变动单位:设置为 0.2 |
| commission | DOUBLE |
手续费: 设为 15.0,代表 15 元每手 |
| deliveryCommissionMode | INT |
手续费计算方式: 设为 1 ,代表按 commission /手计算 |
| lastTradingDay | DATE | 期权合约最后交易日 |
| exerciseDate | DATE | 期权行权日 |
| exerciseSettlementDate | DATE | 期权交收日 |
3.1.1.2 期货基本信息表
参考中金所期货合约表:沪深 300 股指期货 | 中国金融期货交易所,本策略期货基本信息表设置如下:
表 3-2 期货基本信息表结构
| 列名 | 类型 | 说明 |
|---|---|---|
| symbol | SYMBOL 或 STRING | 期货合约代码 |
| assetType | INT | 品种类型:设置为 1 ,即期货 |
| underlyingCode | STRING | 无效字段,仅用于对齐基本表 |
| optType | INT | 无效字段,仅用于对齐基本表 |
| strikePrice | DOUBLE | 无效字段,仅用于对齐基本表 |
| multiplier | DOUBLE |
合约乘数: 沪深 300 股指期货为 300.0 |
| marginRatio | DOUBLE |
保证金比例: 根据实际调整,目前设为 0.12 |
| tradeUnit | DOUBLE |
合约单位: 仅商品期权需要设置,其他设为 1.0 |
| priceUnit | DOUBLE |
报价单位: 指数点,设置为 1 |
| priceTick | DOUBLE | 价格最小变动单位:设置为 0.2 |
| commission | DOUBLE |
手续费: 设为 0.000023 ,即万 0.23 |
| deliveryCommissionMode | INT |
手续费计算方式: 设为 2 ,代表按成交额* commission 计算 |
| lastTradingDay | DATE | 无效字段,仅用于对齐基本表 |
| exerciseDate | DATE | 无效字段,仅用于对齐基本表 |
| exerciseSettlementDate | DATE | 无效字段,仅用于对齐基本表 |
3.1.2 行情表
行情表是策略回测最重要的数据输入,在输入策略回测引擎前,需将行情处理成回测引擎要求的数据结构,再通过接口说明接口向回测引擎注入数据。本策略为快照频策略回测,完整快照频行情数据结构要求可参考:多资产回测配置。
3.1.2.1 期权行情表
本策略期权行情表结构如下表所示:
表 3-3 期权行情表结构
| 列名 | 类型 | 说明 |
|---|---|---|
| symbol | SYMBOL | 标的代码 |
| symbolSource | STRING |
"CCFX" (中金所) 交易所代码参考:交易日历 |
| tradingDay | DATE | 交易日期 |
| timestamp | TIMESTAMP | 行情时间戳 |
| lastPrice | DOUBLE | 最新成交价 |
| upLimitPrice | DOUBLE | 涨停价 |
| downLimitPrice | DOUBLE | 跌停价 |
| totalBidQty | LONG | 区间买量 |
| totalOfferQty | LONG | 区间卖量 |
| bidPrice | DOUBLE[] | 委买价格列表 |
| bidQty | LONG[] | 委买量列表 |
| offerPrice | DOUBLE[] | 委卖价格列表 |
| offerQty | LONG[] | 委卖量列表 |
| highPrice | DOUBLE | 最高价 |
| lowPrice | DOUBLE | 最低价 |
| underlyingPrice | DOUBLE | 标的价格(仅对期权品种必需) |
| Theta | DOUBLE | 用户自定义字段,期权价格对时间的导数 |
| Vega | DOUBLE | 用户自定义字段,期权价格对波动率的导数 |
| Gamma | DOUBLE | 用户自定义字段,期权价格对底层期货价格的二阶导 |
| Delta | DOUBLE | 用户自定义字段,期权希腊值,本策略以对冲 delta 风险为风控目标, delta 用于期货对冲计算 |
| IV | DOUBLE | 用户自定义字段,隐含波动率,目前填为 0 ,后续可扩展使用 |
| assetType | INT | 品种类型, 2 代表期权, multiAssetQuoteUnifiedInput 参数为 false 时,该字段无需传入,回测引擎内部自行补充 |
3.1.2.2 期货行情表
本策略期货行情表结构如下表所示:
表 3-4 期货行情表结构
| 列名 | 类型 | 说明 |
|---|---|---|
| symbol | SYMBOL | 标的代码 |
| symbolSource | STRING |
"CCFX"(中金所) 交易所代码参考:交易日历 |
| tradingDay | DATE | 交易日期 |
| timestamp | TIMESTAMP | 行情时间戳 |
| lastPrice | DOUBLE | 最新成交价 |
| upLimitPrice | DOUBLE | 涨停价 |
| downLimitPrice | DOUBLE | 跌停价 |
| totalBidQty | LONG | 区间买量 |
| totalOfferQty | LONG | 区间卖量 |
| bidPrice | DOUBLE[] | 委买价格列表 |
| bidQty | LONG[] | 委买量列表 |
| offerPrice | DOUBLE[] | 委卖价格列表 |
| offerQty | LONG[] | 委卖量列表 |
| highPrice | DOUBLE | 最高价 |
| lowPrice | DOUBLE | 最低价 |
| assetType | INT | 品种类型, 1 代表期货, multiAssetQuoteUnifiedInput 参数为 false 时,该字段无需传入,回测引擎内部自行补充 |
3.2 策略开发:策略回调函数与回调函数参数
3.2.1 策略回调函数
3.2.1.1 initialize 策略初始化函数
该函数在策略开始前回调一次,一般用于初始化策略全局变量,比如本策略中的主力合约名称等变量,如下所示:
def initialize(mutable context){
context['front_month_contract'] = "" // 主力期货合约名称
context['front_month_contract_latest_price']=double(NULL) // 主力期货合约最新价
context['strike_price']=double(NULL) // 平值期权合约的行权价
context["maturity"] = double(NULL) // 到期时间:距到期日的日期/365
context["managedOrderIds"] = dict(LONG, BOOL) // 订单管理字典,记录已处理的订单id,防止重复撤单追单
}
3.2.1.2 beforeTrading 盘前回调函数
该函数在每日盘前回调一次,一般用于策略盘前的初始化和变量标记,比如本策略在此处理移仓换月逻辑,标记主力合约标的,如下所示:
def beforeTrading(mutable context){
// 每天初始化一次
context['options'] = dict(STRING, ANY) // 主力期权标的与最新价映射
context["deltas"] = dict(STRING, DOUBLE) // 主力期权delta值映射
context['ATM_C']="" // 平值看涨期权合约名
context['ATM_P']="" // 平值看跌期权合约名
// 获取当前日期
today = context['tradeTime'].date()
print('当前时间'+context['tradeTime'])
// ---------------------- 移仓换月 ---------------------
// 根据当前日期获取当前到期日
context['expiryDate'] = exec expiryDate[0] from context['expiryMap'] where month(expiryDate) =month(today)
// 标记当前主力合约标的
if(today<transFreq(weekBegin(context['expiryDate']) - 5, "CCFX")){ // 如果开始日期距离到期日大于5天,用当月合约
context["maturity"] = temporalDiff(context['expiryDate'],today,"d")\365
context['front_month_contract'] = exec underlying[0] from context['expiryMap'] where expiryDate = context['expiryDate']
mainOption = exec symbol[0] from context['expiryMap'] where underlying = context['front_month_contract']
mainOptions = exec symbol from context['basicInfo'] where startsWith(symbol,mainOption)
}
else{ // 否则走移仓换月,用下月合约
context['expiryDate'] = exec expiryDate[0] from context['expiryMap'] where month(expiryDate) = month(context['expiryDate'])+1;
context["maturity"] = temporalDiff(context['expiryDate'],today,"d")\365
context['front_month_contract'] = exec underlying[0] from context['expiryMap'] where expiryDate = context['expiryDate']
mainOption = exec symbol[0] from context['expiryMap'] where underlying = context['front_month_contract']
mainOptions = exec symbol from context['basicInfo'] where startsWith(symbol,mainOption)
}
// 构造主力期权最新价字典
for(option in mainOptions){
px = dict(STRING, ANY)
px["bidPrice"] = double(NULL)
px["askPrice"] = double(NULL)
context["options"][option] = px
}
// 构造主力期权delta字典
for(option in mainOptions){
context["deltas"][option] = double(NULL)
}
}
3.2.1.3 onSnapshot 等行情回调函数
该函数在每条行情到来时回调一次,一般用于信号计算和开平仓等操作,体现策略的主逻辑。根据行情数据频率的不同,使用不同的行情回调函数,如 onTick 处理逐笔行情、 onSnapshot 处理快照行情、onBar 处理 K 线行情。本策略是期权期货快照频策略,故使用 onSnapshot 函数,部分脚本如下所示,完整脚本见附录:
def onSnapshot(mutable context, msg, indicator){
......
//1. 判断是否做多头:(C_bid - P_ask + K * DF) < Lastprice(F)-threshold
if (context['options'][context['ATM_C']]['bidPrice'] != NULL and context['options'][context['ATM_P']]['askPrice'] != NULL){
c_bid = context['options'][context['ATM_C']]['bidPrice']
p_ask = context['options'][context['ATM_P']]['askPrice']
if (callLongPos<context['maxQty'] && putShortPos<context['maxQty'] &&
((c_bid-p_ask+strike*discount_factor) < (f_last-threshold)) ){
// 下单(标的代码, 交易所代码, 时间, 订单类型, 委托订单价格, 止损价/止盈价,委托订单数量,买卖方向,委托订单有效性,委托订单到期时间)
print(context['tradeTime']+":开仓多头") // 买call卖put
print("买入:"+context['ATM_C'])
print("卖出:"+context['ATM_P'])
Backtest::submitOrder(context["engine"],
(context['ATM_C'],msg["symbolSource"],context['tradeTime'],5,c_bid, , ,context['orderQty'], 1,,,),"buyOpenCall", 0, 'option')
Backtest::submitOrder(context["engine"],
(context['ATM_P'],msg["symbolSource"],context['tradeTime'],5,p_ask, , ,context['orderQty'], 2,,,),"buyOpenPut",0, 'option')
}
}
//2. 判断是否做空头:(C_ask - P_bid + K * DF) > Lastprice(F)+threshold
if (context['options'][context['ATM_C']]['askPrice'] != NULL and context['options'][context['ATM_P']]['bidPrice'] != NULL){
c_ask = context['options'][context['ATM_C']]['askPrice']
p_bid = context['options'][context['ATM_P']]['bidPrice']
if (callShortPos<context['maxQty'] && putLongPos<context['maxQty'] &&
(c_ask-p_bid+strike*discount_factor) > (f_last+threshold) ){
//下单
print(context['tradeTime']+":开仓空头") // 卖call买put
print("卖出:"+context['ATM_C'])
print("买入:"+context['ATM_P'])
Backtest::submitOrder(context["engine"],
(context['ATM_C'],msg["symbolSource"],context['tradeTime'],5,c_ask, , ,context['orderQty'], 2,,,),"sellOpenCall", 0, 'option')
Backtest::submitOrder(context["engine"],
(context['ATM_P'],msg["symbolSource"],context['tradeTime'],5,p_bid, , ,context['orderQty'], 1,,,),"sellOpenPut", 0, 'option')
}
}
......
}
3.2.2 策略回调函数参数
回测引擎的策略事件函数策略全局变量 context,行情消息 msg、行情指标 indicator、订单信息 orders 和交易信息 trades 参数,相关变量说明可参考:Backtest。
3.2.2.1 context
策略全局变量 context 为一个字典,用于设置策略的所有自定义变量,在所有回调函数均可调用。通过 context["字段名称"] 或 context.字段名称 调用。若要使用 JIT 优化,context 中用户定义的全局变量不支持表,其他所有 DolphinDB 的数据类型均支持。引擎内部维护了 4 个变量:
-
context.tradeTime 获取行情的最新时间
-
context.tradeDate 获取当前日期
-
context.BarTime 快照降频为低频行情时的当前Bar 时间戳
-
context.engine 获取回测引擎实例
其他context变量根据用户输入参数确定,可参见 3.3.2 外部用户自定义参数和 3.3.3 策略内部自定义参数小节。
3.2.2.2 msg
回测引擎的策略事件函数行情消息 msg 为字典,在 onSnapshot 等策略行情回调函数调用,调用方式如下:
-
高频策略回测行情事件回调函数
onSnapshot和onTick中的 msg 为字典,代表一条消息,通过msg["字段名称"]或msg.字段名称进行调用,比如通过msg.lastPrice和msg.price可以获取最新价。需要注意的是,bidPrice、bidQty、offerPrice、offerQty的数据类型为向量,需要通过msg["bidPrice"][0]来调用最优买卖量价。 -
onBar行情回调函数中的 msg 也为字典,但是一个嵌套字典,表示多条消息。第一层的字典的 key 是标的代码(sym),value 值为该标的的行情,例如可以通过msg.sym.close获取最新收盘价。
本策略的msg结构见多资产回测配置或本文档的 3.1.2 行情表小节。
期货行情msg示例如下:
print(msg)
/* output:
symbol->IF2601
symbolSource->CCFX
timestamp->2026.01.05T09:30:01.400
tradingDay->2026.01.05
lastPrice->4651.199999999999818
upLimitPrice->5080.199999999999818
downLimitPrice->4156.600000000000363
totalBidQty->144
totalOfferQty->144
bidPrice->[4651.199999999999818]
bidQty->[3]
offerPrice->[4653.199999999999818]
offerQty->[2]
highPrice->4651.199999999999818
lowPrice->4651.199999999999818
assetType->1
*/
期权行情msg示例如下:
print(msg)
/* output:
symbol->IO2603P4100
symbolSource->CFFX
timestamp->2026.01.05T09:30:01.400
tradingDay->2026.01.05
lastPrice->17.600000000000001
upLimitPrice->34.539999999999999
downLimitPrice->12.06
totalBidQty->1
totalOfferQty->1
bidPrice->[13.4]
bidQty->[6]
offerPrice->[31.399999999999998]
offerQty->[6]
highPrice->17.600000000000001
lowPrice->17.600000000000001
underlyingPrice->4636.899999999999636
Theta->-0.537425054003289
Vega->3.643799865018499
Gamma->0.000377611826343
Delta->-0.098767264569741
IV->0
assetType->2
*/
3.2.2.3 indicator
indicator 表示策略中订阅的指标字典,行情指标 indicator 的数据类型同相应行情的 msg 的数据类型一致。在
initialize 策略初始化函数中通过接口说明接口订阅行情指标后,可在 onSnapshot
等策略行情回调函数调用,调用方式如下:
-
高频策略回测行情事件回调函数
onSnapshot和onTick中的 indicator 为字典,代表一条消息,通过indicator["字段名称"]或indicator.字段名称调用。 -
onBar行情回调函数中的 indicator 也为字典,但是一个嵌套字典,表示多条消息。第一层的字典的 key 是标的代码(sym),value 值为该标的的行情,可以通过类似indicator.sym.mavg调用。
下面为在 initialize 策略初始化函数订阅指标的脚本示例:
def initialize(mutable context){
d=dict(STRING,ANY)
d["mavg"]=<mavg(lastPrice,20)>
Backtest::subscribeIndicator(context["engine"], "snapshot", d,'futures')
}
在 onSnapshot 回调的indicator示例如下:
symbol->IF2603
mavg->4682.590000000000145
3.2.2.4 orders
orders 为订单数据字典,表示订单信息,在 onOrder 委托回报回调函数调用,通过 orders["字段名称"] 或 orders.字段名称 调用。字段如下:
| 字段名称 | 字段类型 | 说明 |
|---|---|---|
| orderId | LONG | 委托订单 id |
| symbol | STRING | 标的代码 |
| symbolSource | STRING | 交易所,本策略均为 "CCFX"
中金所。 |
| timestamp | TIMESTAMP | 委托时间 |
| qty | LONG | 委托数量 |
| price | DOUBLE | 委托价格 |
| status | INT |
委托状态 4:已报单 0:部份成交 1:已成交 2:撤单成功 -1:审批拒绝 -2:撤单拒绝 |
| direction | INT |
委托方向 1:买开 2: 卖开 3: 卖平 4:买平 |
| tradeQty | LONG |
累计成交数量 (status 为 2 时代表本次撤单成功数量) |
| tradeValue | DOUBLE |
累计成交金额 (status 为 2 时为 0) |
| label | STRING | 标签,可对该订单增加备注信息 |
| updateTime | TIMESTAMP | 更新时间 |
| account | STRING | 资产类型。 option 期权,或 futures 期货 |
orders示例如下:
orderId->1
symbol->IO2601C4650
timestamp->2026.01.05T09:30:01.400
qty->1
price->60.200000000000002
status->4
direction->2
tradeQty->0
tradeValue->0
label->sellOpenCall
updateTime->2026.01.05T09:30:01.400
account->option
3.2.2.5 trades
trades 为交易数据字典,表示成交订单信息,在 onTrade 成交回报回调函数调用,通过 trades["字段名称"] 或 trades.字段名称 调用,字段如下:
| 字段名称 | 字段类型 | 说明 |
|---|---|---|
| orderId | LONG | 订单号 |
| symbol | SYMBOL | 标的代码 |
| tradePrice | DOUBLE | 成交单价 |
| tradeQty | LONG | 成交数量 |
| tradeValue | DOUBLE | 成交总价 |
| totalFee | DOUBLE | 总费用 |
| totalVolume | LONG | 累计成交量 |
| totalValue | DOUBLE | 累计成交金额(已经乘进去合约乘数) |
| direction | INT |
1:买开 2:卖开 3:卖平 4:买平 |
| tradeTime | TIMESTAMP | 成交时间 |
| orderPrice | DOUBLE | 订单委托单价 |
| label | STRING | 备注(自定义) |
| account | STRING | 资产类型。option 期权,或futures 期货 |
trades示例如下:
orderId->5
symbol->IO2601P4650
tradePrice->50
tradeQty->1
tradeValue->50
totalFee->15
totalVolume->1
totalValue->5000
direction->2
tradeTime->2026.01.05T09:30:07.400
orderPrice->49
label->buyOpenPut
account->option
3.3 策略配置:设置策略参数
3.3.1 引擎配置参数
本策略设置的引擎配置参数如下表所示:
| 参数 | 说明 | 备注 |
|---|---|---|
| startDate | 开始日期 |
必须配置,DATE 类型 例如 |
| endDate | 结束日期 |
必须配置,DATE 类型 例如 |
| strategyGroup | 策略类型 | 必须配置,固定为 "multiAsset" |
| cash | 初始资金 |
必须配置,字典 目前设置为多资产共享资金,即:
|
| commission | 股票等现货的手续费 |
DOUBLE 类型, 对于期货和期权,此处不设置或设为 0.0 , 在基本信息表补充 |
| tax | 股票等现货的印花税 |
DOUBLE 类型, 对于期货和期权,此处不设置或设为 0.0 , 在基本信息表补充 |
| frequency | 将快照行情合成 frequency 频率的行情触发 onBar | INT 类型,此处为快照行情回测,无需合成
onBar,默认为 0 |
| callbackForSnapshot | 快照行情触发回调模式 | INT 类型,默认为 0 ,表示只回调
onSnapshot |
| dataType | 行情类型 | INT类型,设置为 1 ,代表快照行情 |
| matchingMode | 订单撮合模式 | INT 类型,当 dataType=1 时,该参数设置为 1 或 2 时无效,默认按模拟撮合引擎撮合订单 |
| benchmark | 基准标的 | STRING 或 SYMBOL 类型,暂不设置 |
| latency | 订单延时 | INT 类型,单位为毫秒,设置为 0 ,表示无延迟。 |
| orderBookMatchingRatio | 与行情订单簿的成交百分比 | DOUBLE 类型,默认 1.0 |
| matchingRatio | 区间撮合比例 | DOUBLE 类型,默认 1.0 |
| maintenanceMargin | 维保比例 | DOUBLE 类型,默认 0.75 |
| outputQueuePosition | 是否需要获取订单在行情中的位置 |
INT 类型,默认值为 0 ,表示不输出 仅在 dataType = 0 、5、6 且enableSubscriptionToTickQuotes = true 时生效。 |
| stockDividend | 分红除权基本信息表 | TABLE 类型,对于期货、期权无需设置 |
| multiAssetQuoteUnifiedInput | 行情输入方式 | BOOL 类型,默认值为 true ,此时输入行情 multiAsset 为不同资产合成的表 |
| msgAsPiecesOnSnapshot | onSnapshot 触发方式 |
BOOL 类型,默认值为 false,此时每条数据依次触发
onSnapshot |
上表仅说明本策略配置相关参数信息,完整引擎配置参数说明见多资产回测配置。
3.3.2 外部用户自定义参数
外部用户自定义参数为策略外部设置的变量,通常将需要由用户调整的变量定义在策略外部,通过 context 字典传入回测引擎。本策略的外部用户自定义参数如下表所示:
| 参数 | 说明 | 备注 |
|---|---|---|
| basicInfo | 基本信息表 | TABLE,用于移仓换月,根据主力期权名称找到所有行权价的具体主力期权标的 |
| expiryMap | 到期日映射表 | TABLE,该表为通过期权行情提取的到期日映射信息,包括期权代码、期货代码、到期日列,用于移仓换月和到期日计算 |
| threshold | 套利阈值 | DOUBLE类型,目前设置为 0.5 ,用于开平仓时阈值确定,该值越大,套利越难触发 |
| rf | 无风险利率 | DOUBLE类型,目前设置为 0.02 ,用于开平仓时计算折现因子 |
| orderQty | 单笔下单量 | INT类型,目前设置为 1 ,用于控制期权单笔开平仓下单量 |
| maxQty | 最大下单量 | INT类型,目前设置为 3 ,用于控制期权最大下单量 |
| Delta_Limit | delta 上限 | DOUBLE类型,目前设置为 1.0 ,用于 delta 对冲阈值确定,该值越大,承担的 delta 风险暴露越高 |
3.3.3 策略内部自定义参数
策略内部自定义参数是为了策略逻辑实现,在策略回调函数内部定义的变量,该变量为策略内全局变量,通过 context 字典定义,可在不同回调函数传递和访问。本策略的内部自定义参数如下表所示:
| 参数 | 说明 | 备注 |
|---|---|---|
| front_month_contract | 主力期货合约名称 | STRING 类型,记录最新的主力期货合约名称,在每日盘前移仓换月时更新 |
| front_month_contract_latest_price | 主力期货合约最新价 | DOUBLE 类型,记录最新的主力期货合约价格,每条主力期货合约行情到来时更新,用于 PCP 套利公式计算 |
| strike_price | 平值期权合约的行权价 | DOUBLE 类型,记录最新平值期权合约的行权价,每条主力期货合约行情到来时更新,用于 PCP 套利公式计算 |
| maturity | 到期时间 | DOUBLE 类型,以年为单位计量的期货和期权到期时间,每日盘前更新,用于 PCP 套利公式计算 |
| managedOrderIds | 订单管理字典 | dict(LONG, BOOL) ,记录已处理的订单 id ,防止重复撤单追单 |
| options | 主力期权最新价字典 | dict(STRING,dict(STRING, DOUBLE)) ,嵌套字典,记录主力期权标的与最新价,每日盘前重新初始化,每条主力期权合约行情到来时更新,用于寻找平值期权 |
| deltas | 主力期权delta字典 | dict(STRING, DOUBLE) ,记录主力期权标的与delta,每日盘前重新初始化,每条主力期权合约行情到来时更新,用于计算账户 delta |
| ATM_C | 平值看涨期权合约名 | STRING 类型,记录最新平值看涨期权合约,每日盘前重新初始化,每条主力期货合约行情到来时更新,用于开平仓 |
| ATM_P | 平值看跌期权合约名 | STRING 类型,记录最新平值看跌期权合约,每日盘前重新初始化,每条主力期货合约行情到来时更新,用于开平仓 |
| expiryDate | 当前到期日 | DATE 类型,每日盘前更新 |
3.4 策略输出:调用接口获取策略结果
策略运行完毕后,可通过回测引擎相关接口获取策略回测输出结果,常用的策略输出如下所示,完整接口说明见文档接口说明。
3.4.1 交易明细表
通过 Backtest::getTradeDetails(engine, [accountType]) 接口获取策略交易明细,输出字段详细说明见接口说明。
下图为部分期货交易明细展示:
下图为部分期权交易明细展示:
3.4.2 账户每日持仓表
通过 Backtest::getPosition(engine, [symbol], [accountType"options"]) 接口获取账户每日持仓,输出字段详细说明见接口说明。
下图为部分持仓明细展示:
3.4.3 账户每日权益表
通过 Backtest::getDailyTotalPortfolios(engine, [accountType]) 接口获取账户每日权益,输出字段详细说明见接口说明。
下图为部分每日权益展示:
3.4.4 策略收益概述
通过 Backtest::getReturnSummary(engine, [accountType]) 接口获取策略收益概述,输出字段详细说明见接口说明。
下图为策略在 2026.01.01 到 2026.02.28 的收益概述。
4. 附录
多资产股指期货期权套利策略 demo 以及模拟数据脚本:
建库建表:0.createDBsTBs.dos
模拟数据:1.mockData.dos,可根据实际替换成真实行情数据回测,本策略上文展示的为实际行情数据回测结果
