第四章:数据获取与清洗——期权链数据、期货数据、无风险利率
各位同学,欢迎来到第四章。这一章咱们聊聊数据。
做量化交易,尤其是跨品种套利,数据就是你的弹药。没有干净的数据,再漂亮的模型也是空中楼阁。我见过太多人,模型跑得飞起,结果一上实盘就崩——查到最后,是数据源出了问题。
今天我们就来拆解三个核心数据源:期权链数据、期货数据、无风险利率。我会把我在项目中踩过的坑、总结的经验,一股脑儿倒给你们。
4.1 期权链数据:从哪来,怎么洗
期权链数据,说白了就是所有期权合约的行情快照。包括行权价、到期日、买卖报价、成交量、持仓量、隐含波动率等等。
数据来源:我个人习惯用Wind、Bloomberg或者交易所直连。如果你做回测,也可以用一些免费的历史数据API,但要注意质量。
清洗要点:
- 剔除异常值:比如买卖价差为负、成交量异常大但价格没动——这些往往是数据推送错误。
- 处理缺失值:有些深度虚值合约可能全天无成交,报价也是旧的。我建议用前向填充,或者直接剔除。
- 统一时间戳:不同交易所的撮合时间可能差几毫秒,跨品种套利时这个误差会放大。
重要:期权链数据里,隐含波动率是最敏感的。我曾经发现某个合约的IV突然跳升,以为是市场异动,结果查出来是数据商把行权价搞错了。所以,拿到数据后,先做一轮行权价和到期日的逻辑校验。
4.2 期货数据:主力合约与连续合约
期货数据相对干净,但有个坑:主力合约切换。
你想想看,一个品种有多个到期月份,流动性集中在主力合约上。如果你直接用单个合约做回测,换月那天会出现价格跳空,导致套利信号失真。
我的做法:
- 先识别主力合约——通常用持仓量或成交量最大的那个。
- 构建连续合约:用前复权或后复权的方式,把不同合约拼接起来。
- 记录换月日期:这个信息在跨品种套利中很重要,因为换月期间价差波动会异常。
小技巧:我习惯在换月前后各留3天的缓冲期,避免在流动性最差的时候开仓。这个经验是从一次实盘亏损中得来的——嗯,那次亏得挺疼。
4.3 无风险利率:别小看这个数
无风险利率是期权定价模型里的关键参数。很多人直接用一年期国债收益率,但我觉得不够精细。
为什么? 因为不同期限的期权,对应的无风险利率应该不同。比如一个月到期的期权,你用一年期利率,误差会很大。
我的建议:
- 用SHIBOR或LIBOR的对应期限利率。
- 如果做跨品种套利,两个品种可能在不同市场,利率基准要统一。
- 注意利率的日频更新——有些数据源只提供周频,这会导致波动率曲面出现锯齿。
警告:千万不要直接用央行公布的基准利率。那个是政策利率,不是市场利率。我曾经犯过这个错,导致模型在极端行情下完全失效。
4.4 数据清洗流程:一张图说清楚
下面这张图是我自己总结的数据清洗流程,你们可以直接拿去用。
4.5 代码示例:Python数据清洗模板
下面是我常用的数据清洗代码片段。你们可以直接复制,改改参数就能用。
import pandas as pd
import numpy as np
def clean_option_chain(df):
"""
期权链数据清洗
"""
# 1. 剔除买卖价差为负的
df = df[df['ask'] > df['bid']]
# 2. 剔除成交量异常但价格未变的
df = df[~((df['volume'] > 1000) & (df['last_price'] == df['last_price'].shift(1)))]
# 3. 前向填充缺失的隐含波动率
df['implied_vol'] = df['implied_vol'].fillna(method='ffill')
# 4. 统一时间戳到毫秒级
df['timestamp'] = pd.to_datetime(df['timestamp']).dt.floor('ms')
return df
def build_futures_continuous(df, method='forward'):
"""
构建期货连续合约
method: 'forward' 前复权, 'backward' 后复权
"""
# 识别主力合约
main_contract = df.groupby('contract')['volume'].sum().idxmax()
# 拼接逻辑
if method == 'forward':
# 前复权:调整历史价格
pass
elif method == 'backward':
# 后复权:调整未来价格
pass
return df
提示:代码里的前向填充(ffill)在大多数情况下够用,但如果缺失值连续超过3个,我建议直接剔除该合约。这是我从一次回测中总结的教训——连续填充会导致数据失真。
4.6 无风险利率的获取与处理
无风险利率的获取其实很简单,但处理起来有讲究。
获取方式:
- Wind终端:直接调用
w.wsd()获取SHIBOR各期限利率。 - 央行官网:下载国债收益率曲线。
- 第三方数据商:如Quandl、FRED(适合美股)。
处理要点:
- 插值:如果期权到期日不在标准期限上,需要用线性插值或样条插值。
- 日频化:把年化利率转换成日频,用于每日定价。
- 检查异常:利率突然跳升或跳降,要确认是否是数据错误。
核心:无风险利率的微小变化,对深度实值期权影响不大,但对平值附近的期权影响显著。尤其是在跨品种套利中,两个品种的利率差可能直接决定套利空间是否存在。
4.7 数据质量检查清单
最后,我给你们一份检查清单。每次拿到新数据,按这个过一遍,能省很多事。
| 检查项 | 期权链 | 期货 | 无风险利率 |
|---|---|---|---|
| 缺失值比例 | <5% | <2% | <1% |
| 异常值数量 | 剔除后不影响统计 | 剔除后不影响统计 | 无跳变 |
| 时间戳对齐 | 毫秒级 | 毫秒级 | 日频 |
| 逻辑校验 | 行权价、到期日正确 | 主力合约切换正确 | 期限结构合理 |
好了,这一章的内容就到这里。数据获取与清洗看似枯燥,但它是整个套利策略的基石。你们在实际操作中如果遇到问题,随时可以翻回这一章对照检查。