ETF、股指数据清洗规则
量化研究
- 由于券商行情的推送机制是当存在订单簿变化的时候才推送新的快照,因此对于数据处理应当先由时间早向时间晚填充后,再对异常的值填充
NA或nan,从而避免问题数据对后续曲面和回测的影响。
- 对于每个合约14:57之前的行情,首先校验订单簿是否从买五到卖五严格单调变化,即
1e−12≤bidpx5≤bidpx4≤⋯≤bidpx1≤askpx1≤⋯≤askpx5
如若不满足上述条件,则将该订单簿设置为
NA
- 对于行情中仅有一边有报价的情况,应当在填充行情完成之后再将这一合约的订单簿设置为
NA
- 在使用较早时间的数据对较晚时间的数据进行填充时,应遵循orderbook整体填充,而不是每列分别向后填充。
量化开发
由于实盘交易中往往按照流式处理收到的行情数据,流程与上面一个部分略有差异。
- 对于14:57之前收到的行情,仍然需要校验
1e−12≤bidpx5≤bidpx4≤⋯≤bidpx1≤askpx1≤⋯≤askpx5
当不满足要求时,则抛弃这一行情,不再传递给曲面拟合,也禁止策略对这一合约进行交易。
- 对于某一合约的当前行情,如果合约最新行情能够通过最新的校验,则将最新行情视作当前行情;如果不能通过当前校验,则认为当前合约无行情。
套利检验
该算法用于检验某个处于熔断的 (strike, expiration) 的报价是否存在套利
Notation
- K∗ 表示熔断的 strike,T∗ 表示熔断的 expiration
- K+ 表示同一个 expiration 下,未熔断的 strike 中大于 K∗ 的最小行权价
- K− 表示同一个 expiration 下,未熔断的 strike 中小于 K∗ 的最大行权价
- T+ 表示同一个 strike 下,未熔断的 expiration 中大于 T∗ 的最小 expiration
- T− 表示同一个 strike 下,未熔断的 expiration 中小于 T∗ 的最大 expiration
- 当上述变量中不存在K+ 或 K− 或 T+ 或 T− 时,涉及相应变量的检查跳过。即当变量不存在时设置为
NULL或NAN,此时涉及NULL或NAN的不等式跳过。
Spread Arbitrage
对于 Call 而言,同一个 expiration 下熔断的 strike K∗ 无 spread arbitrage 当且仅当:
CallBid1(K+)CallBid1(K−)−D(K∗−K−)≤≤Call(K∗)Call(K∗)≤≤CallAsk1(K+)+D(K+−K∗)CallAsk1(K−)
对于 Put 而言,同一个 expiration 下熔断的 strike K∗ 无 spread arbitrage 当且仅当:
PutBid1(K−)PutBid1(K+)+D(K∗−K+)≤≤Put(K∗)Put(K∗)≤≤PutAsk1(K−)−D(K−−K∗)PutAsk1(K+)
其中 D 为贴现因子,可近似取 1。
Butterfly Arbitrage
对于 Call 而言,同一个 expiration 下熔断的 strike K∗ 无 butterfly arbitrage 当且仅当:
w−CallBid1(K−)+w+CallBid1(K+)≤Call(K∗)≤w−CallAsk1(K−)+w+CallAsk1(K+)
对于 Put 而言,同一个 expiration 下熔断的 strike K∗ 无 butterfly arbitrage 当且仅当:
w−PutBid1(K−)+w+PutBid1(K+)≤Put(K∗)≤w−PutAsk1(K−)+w+PutAsk1(K+)
其中:
ω−=K+−K−K+−K∗,ω+=K+−K−K∗−K−
Calendar Arbitrage
对于 Call 而言,同一个 strike 下熔断的 T∗ 无 calendar arbitrage 当且仅当:
CallBid1(T−)≤Call(T∗)≤CallAsk1(T+)
对于 Put 而言,同一个 strike 下熔断的 T∗ 无 calendar arbitrage 当且仅当:
PutBid1(T−)≤Put(T∗)≤PutAsk1(T+)