使用CTP期货期权和股票期权的API接口,不止可以交易期货,还可以交易沪铜、豆粕等商品期权和沪深300等金融期权。这里小小地总结一下CTP中期权与期货的区别之处,希望可以帮助到要用CTP API对接期权交易的同学。
CTP柜台是由上期技术公司(上海期货交易所子公司)推出的交易柜台系统, 支持国内的期货和期权等衍生品的交易, 目前是各个期货公司中占有率较高的柜台, 使用CTP平台进行程序化开发的用户较多, 而由于官方的支持文档等内容较少, 且分散各处, 可能不太容易读懂, 因此, 这里总结一些CTP柜台系统中期权交易的一些内容, 以期可以帮助到各位程序化交易的开发者.
注:CTP的API分成股票期权和期货期权这两个不同的版本,分别对应于交易 证券交易所的股票/ETF基金的期权,以及期货交易所的期货期权(含商品期权和金融期权),下载页面如下图所示。二者的接口基本一样,区别不大,下文中也不再对这两个版本进行区分。
目前支持CTP交易股票ETF期权的期货公司不太多,只有二十多家,可以就支持情况咨询期货公司。
合约属性不同
查询合约得到的期权合约数据中, 产品类型(ProductClass)的值是THOST_FTDC_PC_Options(期货期权)或THOST_FTDC_PC_SpotOption(现货期权), 同时期权相关的字段有: 基础商品代码(UnderlyingInstrID, 即标的物代码), 合约基础商品乘数(UnderlyingMultiple), 执行价(StrikePrice), 期权类型(OptionsType, 即看涨还是看跌)。
自v6.5.1版本起,CTP支持查询分类合约ReqQryClassifiedInstrument,用户可以指定查询期权类型的合约。
期权的合约代码命名规则是:
标的期货合约 + 看涨/看跌类型 + 执行价
上期所/能源中心 | 标的物期货代码(小写品种 + 四位数字) + C(或P) + 行权价 示例:cu2405P80000 |
大商所/广期所 | 标的物期货代码(小写品种 + 四位数字) + "-C-"(或"-P-") + 行权价 示例:lc2405-C-112000 |
郑商所 | 标的物期货代码(大写品种 + 三位数字) + C(或P) + 行权价 示例:CF405P16800 |
中金所 | 标的物期货代码(大写品种 + 四位数字) + "-C-"(或"-P-") + 行权价 示例:HO2409-C-2700 |
上交所/深交所 | 八位数字 示例:90003311(沪深300ETF购9月4000) |
代码中,C表示看涨期权(Call),P表示看跌期权(Put)。
TIPS:
- 中金所的沪深300股指期权(IO)等股指期权,虽然标的物是沪深300指数等指数,并不是期货合约,但它仍属于期货期权类型。
- 上交所和深交所的股票期权,由于标的物存在分红除息的情况,因此合约乘数和合约名称等可能会在合约生命周期中发生变化。
- 目前的沪深两市的股票ETF期权、中金所的股指期权是欧式期权,只能在最后交易日行权,其他的期权全都是美式期权,可以在任意交易日行权。
- CTP中目前并没有字段表示期权是美式或欧式类型, 需要开发者自行维护(有一个类型 TThostFtdcStrikeModeType, 但并未使用), 不过CTP的合约信息中有字段描述看涨或看跌类型(TThostFtdcOptionsTypeType OptionsType;)
查询和交易的接口不同
期权有一些专有的查询和交易的接口:
查询保证金(CTP中叫"交易成本"):
ReqQryOptionInstrTradeCost(请求查询期权交易成本)
OnRspQryOptionInstrTradeCost(请求查询期权交易成本响应)
查询手续费:
ReqQryOptionInstrCommRate(请求查询期权合约手续费)
OnRspQryOptionInstrCommRate(请求查询期权合约手续费响应)
行权(CTP中叫"执行宣告")和自对冲相关:
- 行权申请指令
行权申请:ReqExecOrderInsert
错误响应:OnErrRtnExecOrderInsert,OnRspExecOrderInsert
正确响应:OnRtnExecOrder
- 行权撤销指令
行权撤销:ReqExecOrderAction
错误响应:OnErrRtnExecOrderAction,OnRspExecOrderAction
正确响应:OnRtnExecOrder
- 期权自对冲指令
自对冲申请:ReqOptionSelfCloseInsert
错误响应:OnErrRtnOptionSelfCloseInsert,OnRspOptionSelfCloseInsert
正确响应:OnRtnOptionSelfClose
- 期权自对冲撤销指令
自对冲撤销:ReqOptionSelfCloseAction
错误响应: OnErrRtnOptionSelfCloseAction,OnRspOptionSelfCloseAction
正确响应: OnRtnOptionSelfClose
交易所会在期权合约到期日闭市后,默认自动将客户的实值期权进行行权,虚值期权放弃行权。如果客户不想执行某个实值期权,可在最后交易日申请放弃行权。不同交易所对行权和自对冲的支持情况不尽相同:
-
上期、能源、郑州支持放弃行权。
-
中金所不支持通过柜台系统(例如CTP)放弃行权,只支持通过会服系统放弃行权。
-
大商所不支持放弃行权,只支持取消到期日自动行权。例如,投资者10手实值期权,若要放弃其中2手,则需要先取消到期日自动行权,然后再申报行权8手,以此达到目的。
-
……
具体的业务规则,可以查看CTP的API接口说明文档。
CTP中无法查询到期权的希腊字母值,包括 Delta、 Gamma、 Theta、Vega 和 Rho等,CTP的深度行情中也不会推送这些希腊字母值,也即推送的都是无效值。
资金指标数据不同
此处涉及期权的一个概念,即权利金(或叫 期权费),不了解的同学先去补一补课。
期货的盈亏主要来自于持仓盈亏,平仓盈亏和手续费。而与期货不同,期权的持仓盈亏和平仓盈亏都是0,也即是说 持仓盈亏不受行情变化的影响,期权的盈亏主要体现在权利金收支上面:
权利金收支 = 权利金收入 - 权利金支出
平仓盈亏 | 持仓盈亏 | 权利金收支 | 手续费 | 持仓保证金 | ||
多头 | 空头 | |||||
期货 | √ | √ | × | √ | √ | √ |
期权 | × | × | √ | √ | × | √ |
随着期权成交, 会产生权利金的收入和支出:
买入成交,需支出权利金,因此导致 "权利金收支"的值减少;
卖出成交,会收入权利金,因此导致 "权利金收支"的值增加。
"权利金收支"增加或减少的数量,等于此次成交的成交额,即
权利金变化量 = 成交数量 * 成交价格 * 期权合约乘数。
TIPS:"权利金收支"与这笔成交的开平方向和合约的执行价及看涨看跌类型都无关哦~
在CTP中,"权利金收支"分别在两部分数据中躺在,等着我们使用:第一个是持仓(汇总)中具有这个持仓的"权利金收支";第二个是账户资金中具有整个账户的"权利金收支",与逐日平仓盈亏和逐日持仓盈亏类似,账户资金中的"权利金收支"是各个持仓(汇总)的权利金收支的和。
通过查询账户持仓和查询资金账户,分别可以获取持仓(汇总)和资金的情况,对应的函数分别是 ReqQryInvestorPosition 和 ReqQryTradingAccount,响应函数分别是 OnRspQryInvestorPosition 和 OnRspQryTradingAccount,响应的核心数据结构分别是 CThostFtdcInvestorPositionField 和 CThostFtdcTradingAccountField。
"权利金收支"在这两个数据结构中,换了个马甲,叫做"资金差额"(CashIn)。
与逐日平仓盈亏和逐日持仓盈亏类似,"权利金收支"它表示的当天这个交易日的权利金收支的值,每天结算后"权利金收支"会清零。并且,"权利金收支"会计入账户权益(Balance)的计算之中,也会在结算单上展示出来。
没有成交的买入挂单,会冻结一部分权利金,即持仓和资金数据结构中的冻结的资金(FrozenCash)。计算账户可用资金(Available)时,需要将这部分冻结的权利金计算在内,即:
可用资金(Available) = 权益(Balance) - 当前保证金总额(CurrMargin) - 冻结的保证金(FrozenMargin) - 冻结的手续费(FrozenCommission) - 冻结的权利金(FrozenCash)
与期货有所不同的是,期权买方(多头)在付完权利金以后只有权利没有义务,因而只有期权卖方(空头)才需要支付保证金,期权保证金收取主要需要考虑到期权权利金,期权标的的保证金以及期权的虚值额等方面。
虽然CTP中不会对期权合约计算平仓盈亏和持仓浮动盈亏,用户仍可以仿照股票或期货的盈亏计算规则,自行计算期权的盈亏。
具体各个交易所期权保证金计算方法如下表所示.
大商所 郑商所 | 郑商所、大商所期权卖方交易保证金的收取标准为以下二者的最大值: (1)权利金+期货保证金-期权虚值额的一半; (2)权利金+期货保证金的一半。 看涨期权虚值额=Max((期权合约行权价格-标的合约结算价)×合约乘数,0) 看跌期权虚值额=Max((标的合约结算价-期权合约行权价格)×合约乘数,0) 郑商所组合持仓的交易保证金按照以下规定收取: (1)买入价差组合持仓,不收取交易保证金。 (2)卖出价差组合持仓按两个行权价格之差和期权空头部位保证金二者中较小者收取交易保证金。 (3)卖出跨式或宽跨式组合,交易保证金收取标准为:卖出看涨期权和卖出看跌期权仿真交易保证金较大者加上另一部位权利金。 |
中金所 | 每手看涨期权交易保证金=(股指期权合约当日结算价×合约乘数)+max(标的指数当日收盘价×合约乘数×股指期权合约保证金调整系数-虚值额,最低保障系数×标的指数当日收盘价×合约乘数×股指期权合约保证金调整系数) 每手看跌期权交易保证金=(股指期权合约当日结算价×合约乘数)+max(标的指数当日收盘价×合约乘数×股指期权合约保证金调整系数-虚值额,最低保障系数×股指期权合约行权价格×合约乘数×股指期权合约保证金调整系数) 其中,沪深300股指期权合约保证金调整系数为15%,最低保障系数为0.667。 看涨期权虚值额=Max((期权合约行权价格-标的合约结算价)×合约乘数,0) 看跌期权虚值额=Max((标的合约结算价-期权合约行权价格)×合约乘数,0) |
上期所 | 上期所保证金计算采用Delta保证金模式: Delta保证金模式主要从期权和标的期货的Delta相关性角度来考虑,期权合约卖出方单位期权合约的交易保证金为Delta风险值与单位标的期货合约保证金的乘积,再加上期权合约收盘价与结算价的较大值,且不低于期权最小保证金。 期权合约卖方保证金为以下二者的较大值: (1)(标的期货合约结算价×标的期货合约保证金率×Delta风险值×期权合约持仓量)+(期权合约收盘价与结算价的较大值×期权合约持仓量) (2)期权最小保证金×期权合约持仓量 Delta风险值是标的期货合约价格发生涨跌停板波动以及波动率发生±k%幅度的变化时,Delta绝对值的最大值,由交易所每日公布。k值和期权最小保证金由交易所另行公告。 |
上交所 | 标的为股票的期权合约,每张合约的初始保证金计算公式为: 认购期权义务仓开仓初始保证金=[合约前结算价+ Max(25%×标的前收盘价-认购期权虚值,10%×标的前收盘价)]×合约单位; 认沽期权义务仓开仓初始保证金=Min{合约前结算价+Max[25%×标的前收盘价-认沽期权虚值,10%×行权价],行权价}×合约单位。 标的为ETF的期权合约,每张合约的初始保证金计算公式为: 认购期权义务仓开仓初始保证金={前结算价+Max(15%×合约标的前收盘价-认购期权虚值,7%×合约标的前收盘价)}*合约单位; 认沽期权义务仓开仓初始保证金=Min{前结算价+Max[15%×合约标的前收盘价-认沽期权虚值,7%×行权价],行权价}*合约单位; 认购期权虚值=Max(行权价-标的前收盘价,0); 认沽期权虚值=Max(标的前收盘价-行权价,0)。 |
深交所 | 合约标的为股票的,每张合约的开仓保证金的计算 公式为:(一)认购期权义务仓开仓保证金=[合约前结算价+Max (21%×合约标的前收盘价-认购期权虚值,10%×合约标的前收盘 价)]×合约单位。(二)认沽期权义务仓开仓保证金=Min[合约前结算价+Max (19%×合约标的前收盘价-认沽期权虚值,10%×行权价),行权价]× 合约单位。本条中的认购期权虚值=Max(行权价-合约标的前收盘价,0);认沽期权虚值=Max(合约标的前收盘价-行权价,0)。 合约标的为交易型开放式指数基金的,每张合约的开仓保证金的计算公式为:(一)认购期权义务仓开仓保证金=[合约前结算价+Max (12%×合约标的前收盘价-认购期权虚值,7%×合约标的前收盘 价)]×合约单位。(二)认沽期权义务仓开仓保证金=Min[合约前结算价+Max(12%×合约标的前收盘价-认沽期权虚值,7%×行权价),行权价]× 合约单位。本条中的认购期权虚值=Max(行权价-合约标的前收盘价,0);认沽期权虚值=Max(合约标的前收盘价-行权价,0)。 |