免费行情 API 数据预处理:股票停牌缺失值工程化解决方案

用户头像sh_****447dvu
2026-08-07 发布

开篇

在量化策略离线回测研发过程中,多数策略研究者会选用免费行情 API 获取日线级历史 K 线数据,以此降低数据采购成本,快速完成模型迭代验证。但长期多轮回测复盘后可以发现一个共性数据问题:标的停牌会造成时序行情存在空白断层。

不少研究者为简化数据集,直接剔除缺失交易日记录,该处理方式看似精简数据表,却会系统性干扰均线计算、净值收益统计、开平仓信号判定等核心模块,短线波段、日内衍生类策略的回测偏差会被显著放大。本文结合回测工程落地经验,客观拆解停牌数据断层形成逻辑、两套分场景标准化处理方案、可直接复用的 Python 预处理代码,同时梳理数据预处理阶段极易被忽略的关键约束条件,全部逻辑可直接嵌入自研回测框架。

一、停牌产生日线时序缺口的底层逻辑

正常交易日,交易所会完整输出标的开、高、低、收、成交量全套结构化行情;个股触发停牌后市场无撮合成交,免费行情 API 针对停牌时段的数据返回格式分为三类:

数据返回形式 数据层面表现
完全舍弃停牌当日记录 时间索引直接断裂,出现无数据空白区间
保留日期索引,价格字段置空 交易日记录存在,全部行情数值为 NaN,部分接口附带停牌标识
自动复用前一交易日收盘价填充 直接使用上一交易日收盘价格覆盖停牌日期行情

直接删除空值日期存在明确计算缺陷,以行业通用 20 周期均线为例:代码仅会统计 20 条有效 K 线记录,而非连续 20 个工作日。长线持有类低频策略误差相对可控,短线交易策略则会出现信号提前、滞后偏移,回测净值曲线失去实盘推演价值。

二、两套工程化停牌数据处理方案(按策略场景区分)

实际数据预处理流程中,不建议直接删除停牌对应交易日,可依据回测仿真精度需求选择对应处理逻辑,两种方案各有适用边界:

方案 1:完整保留时间轴,不填充价格序列

严格还原二级市场真实成交规则,停牌时段不存在可交易有效价格。

适用场景:高精度实盘仿真系统、需要严格区分可交易 / 不可交易日期的合规回测模型。

局限:均线、波动率、ATR 等依赖连续价格序列的技术指标会批量生成空值,需额外开发空值过滤、分段计算逻辑,预处理开发成本更高。

方案 2:收盘价前向填充 + 新增停牌状态标记(通用落地首选)

该方案是绝大多数自研回测框架采用的标准处理逻辑。停牌期间标的不存在价格波动,沿用前收盘价格补齐时序,不会人为制造涨跌行情,保障整条时间序列连续完整。

核心关键:新增布尔字段is_suspended独立标记停牌日期。填充后的连续价格可正常支撑全量技术指标运算,同时策略执行层可读取该字段添加交易限制逻辑,过滤停牌日新开仓指令,规避回测生成现实中无法执行的虚假交易。

标准化数据示例:

日期 收盘价 交易状态
06-01 25.30 正常交易
06-02 25.30 停牌
06-03 25.30 停牌

三、通用 Python 预处理完整代码

以下代码覆盖行情拉取、工作日时序补全、停牌标记生成、收盘价前向填充全链路,仅替换接口地址、标的参数即可接入自有数据源:

import pandas as pd
import requests

# 替换为自身使用的行情API接口地址与请求参数
url = "你的行情API地址/kline"
params = {
    "symbol": "AAPL",
    "interval": "1day"
}

response = requests.get(url, params=params)
data = response.json()

# 转换结构化数据表,标准化日期索引
df = pd.DataFrame(data["data"])
df["date"] = pd.to_datetime(df["date"])
df = df.set_index("date")

# 补全数据起止区间内全部工作日,填补停牌缺失日期
trade_days = pd.date_range(
    start=df.index.min(),
    end=df.index.max(),
    freq="B"
)
df = df.reindex(trade_days)

# 生成停牌标识字段:收盘价为空判定当日停牌
df["is_suspended"] = df["close"].isna()

# 前向填充收盘价,维持价格序列连续性
df["close"] = df["close"].ffill()

# 输出前5行数据,校验预处理结果
print(df.head())

代码逻辑说明

本段预处理代码核心目标并非单纯补齐价格,而是完整留存停牌状态元数据。回测执行阶段可通过is_suspended字段约束交易行为:允许持有停牌存量仓位,禁止停牌当日新建买入、做空仓位。不同行情 API 字段命名、返回 JSON 结构存在差异,接入新数据源时对照接口文档调整字段映射关系即可。

四、预处理易忽略三大约束,直接影响回测可信度

停牌缺口清洗仅为量化数据预处理其中一环,以下三类约束若未纳入处理流程,会大幅降低回测结果与实盘的拟合度:

  1. 复权数据联动校准
    若停牌周期内标的发生分红、送转、股本拆分等权益变动,单纯前向填充收盘价会破坏前后价格逻辑连续性,必须同步引入复权系数对全时序行情统一校正。
  2. 遵循市场统一交易约束
    A 股、港股、美股通用交易规则:持仓标的停牌可继续持有,但当日禁止新开仓位。数据集缺失停牌标记时,回测引擎会生成大量不符合交易所规则的虚拟交易,系统性高估策略收益水平。
  3. 分市场独立预处理逻辑
    各市场停牌触发条件、停牌持续周期、盘中交易限制存在明显区别,不可复用同一套清洗逻辑适配全部品种,建议按交易市场拆分预处理分支,提升仿真精度。

五、标准化预处理闭环流程(可封装为框架通用算子)

针对日线回测数据集,固定使用四步标准化处理流程,可封装为独立工具函数嵌入回测框架:

  1. 基于原始行情生成区间完整工作日时间轴,不删除任意停牌对应交易日;
  2. 根据模型仿真精度需求,判断是否执行收盘价前向填充;
  3. 持久化存储is_suspended停牌识别字段,保留至最终数据集;
  4. 结合复权系数二次校正全量行情,输出可直接用于模型回测的标准化数据集。

该流程兼顾技术指标计算连续性与二级市场真实交易规则,离线批量回测、线上仿真推演场景均可适配。

结语

免费行情 API 仅作为原始行情数据获取工具,回测结果能否用于策略有效性研判,核心取决于完整、严谨的数据预处理体系。停牌时序断层、复权校正、交易日缺失等细节处理越规范,回测净值曲线与后续实盘运行表现的偏离度越低。

策略研发阶段可将本文预处理逻辑封装为通用算子,减少重复开发工作量;市面上轻量化行情数据源选择较多,AllTick API 是兼顾运行稳定性与接入便捷性的备选方案。

评论