近期在研究300股指期权调取数据时发现一个问题。数据来源于JoinQuant但问题可能存在于多个数据源。
在使用get_price调取分钟级股指期权合约时返回的收盘集合竞价成交量(volume)和成交额(money)数据似乎为前一日的延迟数据。
以下用2020年4月4200认沽期权为例,代码 'IO2004-P-4200.CCFX'。
使用以下代码获取2020-03-04该合约的价格信息。
opt.run_query(query(opt.OPT_DAILY_PRICE).filter(opt.OPT_DAILY_PRICE.code=='IO2004-P-4200.CCFX').filter(opt.OPT_DAILY_PRICE.date=='2020-03-04'))
结果显示,前日(即2020-03-03)结算价为204.2,当日(2020-03-04)结算价为189.6。
接下来使用get_price获取该合约分钟级数据。
get_price('IO2004-P-4200.CCFX', '2020-03-03','2020-03-04', frequency='minute',skip_paused=False)
get_price('IO2004-P-4200.CCFX', '2020-03-04','2020-03-05', frequency='minute',skip_paused=False)
收盘集合竞价为每日交易时间的最后三分钟(14:47-15:00),因此结算价可以通过计算最后一次报价的成交额/成交量(money/volume)获得。由上图计算得到,2020-03-03结算价(settle price) = 375020/17/100 = 220.6,100为合约倍数。2020-03-04 结算价 245040/12/100 = 204.2。这里就出现了矛盾,合约价格的信息显示204.2实际上为2020-03-03的结算价。从分时报价中也可以看出204.2更接近2020-03-03集合竞价前的报价201,相比于2020-03-04的189.6。
由此合理的解释似乎是 成交额和成交量(money,volume)的报价信息存在一日的延迟,即2020-03-04的money和volume实则为2020-03-03的收盘集合竞价信息。选取其他日期和合约可检验这个错误会稳定地出现,例如选取2020-03-05的money和volume相除可获得2020-03-04的结算价322320/17/100=189.6。较为近期的例子集合竞价成交量较之前会更多,因此均价可能不完全等于前结算价,但相对关系仍然明显。
咨询JQ客服后回复可能是结算价并不是由成交额/成交量产生,但是这并不能解释隔日收盘集合竞价均价等于前一日结算价的现象(相反这一现象是延迟错误很好的证明)。尽管收盘数据并非在所有情况下等于平均成交价,但是只有极少数情况(根据交易所文件,股指期权合约除最后交易日外的当日结算价为合约当日收盘集合竞价的成交价格。当日收盘集合竞价未形成成交价格或者成交价格明显不合理的,交易所有权决定当日结算价)。
另一种反驳认为这种延迟等价是一种巧合,那似乎就更不合理了。前一日的结算价如果能与后一日的收盘成交均价如此接近,那么根据前一日结算价在第二日进行低买高卖的交易,并在收盘集合竞价全部清仓将获得非常稳定和巨大的收益,这显然是不现实的。
检查不同数据来源(如Wind)后发现存在同样的问题,那么这可能意味着数据供应商普遍的数据源头存在问题,例如ctp系统提供给机构的展示数据存在问题。由于此数据问题存在普遍性,在进行研究和回测时值得注意,如有相关的权威解释和反馈渠道,敬请告知。