第四章:数据获取与清洗——期权链数据、期货数据、无风险利率

各位同学,欢迎来到第四章。这一章咱们聊聊数据。

做量化交易,尤其是跨品种套利,数据就是你的弹药。没有干净的数据,再漂亮的模型也是空中楼阁。我见过太多人,模型跑得飞起,结果一上实盘就崩——查到最后,是数据源出了问题。

今天我们就来拆解三个核心数据源:期权链数据期货数据无风险利率。我会把我在项目中踩过的坑、总结的经验,一股脑儿倒给你们。

4.1 期权链数据:从哪来,怎么洗

期权链数据,说白了就是所有期权合约的行情快照。包括行权价、到期日、买卖报价、成交量、持仓量、隐含波动率等等。

数据来源:我个人习惯用Wind、Bloomberg或者交易所直连。如果你做回测,也可以用一些免费的历史数据API,但要注意质量。

清洗要点

  • 剔除异常值:比如买卖价差为负、成交量异常大但价格没动——这些往往是数据推送错误。
  • 处理缺失值:有些深度虚值合约可能全天无成交,报价也是旧的。我建议用前向填充,或者直接剔除。
  • 统一时间戳:不同交易所的撮合时间可能差几毫秒,跨品种套利时这个误差会放大。

重要:期权链数据里,隐含波动率是最敏感的。我曾经发现某个合约的IV突然跳升,以为是市场异动,结果查出来是数据商把行权价搞错了。所以,拿到数据后,先做一轮行权价和到期日的逻辑校验。

4.2 期货数据:主力合约与连续合约

期货数据相对干净,但有个坑:主力合约切换

你想想看,一个品种有多个到期月份,流动性集中在主力合约上。如果你直接用单个合约做回测,换月那天会出现价格跳空,导致套利信号失真。

我的做法

  1. 先识别主力合约——通常用持仓量或成交量最大的那个。
  2. 构建连续合约:用前复权或后复权的方式,把不同合约拼接起来。
  3. 记录换月日期:这个信息在跨品种套利中很重要,因为换月期间价差波动会异常。

小技巧:我习惯在换月前后各留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(适合美股)。

处理要点

  1. 插值:如果期权到期日不在标准期限上,需要用线性插值或样条插值。
  2. 日频化:把年化利率转换成日频,用于每日定价。
  3. 检查异常:利率突然跳升或跳降,要确认是否是数据错误。

核心:无风险利率的微小变化,对深度实值期权影响不大,但对平值附近的期权影响显著。尤其是在跨品种套利中,两个品种的利率差可能直接决定套利空间是否存在。

4.7 数据质量检查清单

最后,我给你们一份检查清单。每次拿到新数据,按这个过一遍,能省很多事。

检查项 期权链 期货 无风险利率
缺失值比例 <5% <2% <1%
异常值数量 剔除后不影响统计 剔除后不影响统计 无跳变
时间戳对齐 毫秒级 毫秒级 日频
逻辑校验 行权价、到期日正确 主力合约切换正确 期限结构合理

好了,这一章的内容就到这里。数据获取与清洗看似枯燥,但它是整个套利策略的基石。你们在实际操作中如果遇到问题,随时可以翻回这一章对照检查。

专注资料整理