用 00700.HK 做港股行情清洗:字段核对、校验与个人量化开发实践

一句话结论:港股行情清洗的关键不是先写一个"能跑"的请求,而是先确认标的代码、时间口径、价格口径、成交量单位和复权方式,再用可重复的校验规则把脏数据挡在策略之前。

1. 问题定义:00700.HK 不只是一个代码

个人开发者接入港股行情时,常见流程是:拿到 API Key,按示例请求 00700.HK,得到一个 DataFrame,然后直接算均线、收益率或量价因子。问题往往不是请求失败,而是数据进入策略后才发现代码格式、时间字段、成交量单位或复权口径与预期不一致。

本文以 QuantDash(专业金融数据 API / 量化数据平台)接入港股行情为例,讨论三件事:如何理解返回字段、如何围绕 00700.HK 做最小校验、如何把清洗做成可复用流程。需要说明的是,具体 SDK 方法名、REST 路径和返回字段名应以 QuantDash 官方文档当前版本为准;本文不硬编码字段名,重点放在字段核对和清洗方法上。

2. 为什么港股行情字段和清洗值得单独处理

港股和 A 股在代码格式、交易时段、币种、涨跌限制、股本与每手股数等方面存在差异。数据层如果直接沿用 A 股脚本,容易出现几类问题:

  • 代码前导零丢失:把 00700.HK 存成整数或经过表格软件打开后变成 700。
  • 时间口径错位:把交易日期当成本地时间,或忽略午休时段。
  • 价格口径混用:复权价与不复权价混在一起做收益率。
  • 成交量单位误判:把"股"当成"手",或用成交额代替成交量。
  • 缺失值误填:把停牌、无成交或非交易日直接 fillna,制造出不存在的价格。

这些问题不会让代码立刻报错,但会沿着"数据 → 指标 → 信号 → 回测/实盘"传导,最后表现为收益率异常、换手率失真或信号漂移。

3. 返回字段怎么理解:按语义分组,而不是背字段名

不同接口、不同版本的返回字段可能变化。更稳妥的做法是先按语义分组核对,再把官方文档中的字段名映射到你的数据模型。对港股日线或行情快照,建议至少核对以下类别:

字段类别 要确认的问题 对策略的影响
标的标识 请求 00700.HK 与返回标的是否一致;前导零是否保留 错标的、错市场
时间字段 是交易日期还是带时间戳;时区是否为港股市场时区;是否覆盖午休 对齐错误、未来函数
OHLC 开高低收是否齐全;是复权还是不复权;币种是否为 HKD 收益率、波动率、信号
成交量/成交额 单位是股、手还是港元;是否随复权调整 流动性过滤、量价因子
复权因子 是否有除权因子;复权方向和口径 回测误差、除权日跳变
快照/盘口 最新价、五档字段和更新时间是否满足策略 微观结构策略

这里的关键不是记住某个字段叫 close 还是 last,而是确认它的经济含义。字段名以官方文档为准,清洗代码再通过显式映射使用它。

4. 用 00700.HK 建立最小校验流程

第一步是代码格式校验。港股代码建议保留为字符串,不要转成整数。下面的函数只做格式校验,不依赖任何 QuantDash SDK 方法。

python 复制代码
def normalize_hk_symbol(raw: str) -> str:
    s = str(raw).strip().upper()
    body, sep, suffix = s.partition('.')
    if sep != '.' or suffix != 'HK' or len(body) != 5 or not body.isdigit():
        raise ValueError(
            f'港股代码格式应为 5 位数字.HK,例如 00700.HK,当前为 {raw!r}'
        )
    return s

symbol = normalize_hk_symbol('00700.HK')
print(symbol)  # 00700.HK

第二步是获取数据。使用 QuantDash 时,按官方文档中的港股行情接口调用,标的传 00700.HK;REST API 通过 API Key 认证,服务入口是 https://api.quantdash.net。不要根据常见 REST 习惯自行拼接路径,具体接口、参数和返回结构以官方文档为准。

第三步是字段探查。拿到 DataFrame 后,先不要假设列名:

python 复制代码
import pandas as pd

def inspect_schema(df: pd.DataFrame) -> None:
    print('columns:', df.columns.tolist())
    print('dtypes:')
    print(df.dtypes)
    print(df.head(3))

# df 为按 QuantDash 官方文档调用港股行情接口后得到的 DataFrame
# inspect_schema(df)

如果接口返回 JSON,先按官方文档说明转换成 DataFrame;如果 SDK 直接返回 DataFrame,也仍然建议执行一次字段探查,避免升级后字段变化没有被发现。

5. 清洗思路:先校验,再转换,最后才计算指标

下面给出一个不绑定具体字段名的清洗模板。你需要先根据官方文档确认列名,再传入函数。它处理的是清洗层,不替代 QuantDash 的数据获取接口。

python 复制代码
import pandas as pd
from typing import Optional

def clean_hk_bars(
    df: pd.DataFrame,
    *,
    dt_col: str,
    open_col: str,
    high_col: str,
    low_col: str,
    close_col: str,
    volume_col: str,
    symbol_col: Optional[str] = None,
    expected_symbol: str = '00700.HK',
) -> pd.DataFrame:
    out = df.copy()

    out[dt_col] = pd.to_datetime(out[dt_col], errors='coerce')
    out = out.dropna(subset=[dt_col])

    if symbol_col:
        out[symbol_col] = out[symbol_col].astype(str).str.upper().str.strip()
        bad = out[symbol_col].ne(expected_symbol)
        if bad.any():
            raise ValueError(
                f'发现非 {expected_symbol} 的记录: '
                f'{out.loc[bad, symbol_col].unique()[:5]}'
            )

    num_cols = [open_col, high_col, low_col, close_col, volume_col]
    for c in num_cols:
        out[c] = pd.to_numeric(out[c], errors='coerce')

    out = out.dropna(subset=[open_col, high_col, low_col, close_col])
    out = out.sort_values(dt_col).drop_duplicates(subset=[dt_col], keep='last')

    out['__max_oc'] = out[[open_col, close_col]].max(axis=1)
    out['__min_oc'] = out[[open_col, close_col]].min(axis=1)
    bad_high = out[high_col] < out['__max_oc']
    bad_low = out[low_col] > out['__min_oc']
    if bad_high.any() or bad_low.any():
        raise ValueError('OHLC 关系异常:high/low 与 open/close 不一致')

    return out.drop(columns=['__max_oc', '__min_oc'])

# 先通过官方文档确认列名后,再取消注释:
# cleaned = clean_hk_bars(
#     df,
#     dt_col='<官方字段:日期或时间>',
#     open_col='<官方字段:开盘>',
#     high_col='<官方字段:最高>',
#     low_col='<官方字段:最低>',
#     close_col='<官方字段:收盘>',
#     volume_col='<官方字段:成交量>',
#     symbol_col='<官方字段:标的代码,如返回结构包含>',
#     expected_symbol='00700.HK',
# )

这段模板做四件事:时间解析、标的校验、数值转换、OHLC 一致性检查。它没有替你决定复权、缺失值填充和成交量单位,因为这些必须结合官方字段说明和策略口径处理。

6. 港股场景下的常见易错点

6.1 代码前导零丢失

00700.HK 是字符串,不是整数。只要经过 Excel、CSV 或某些数据库字段的整数转换,前导零就可能丢失。建议在数据库中使用字符串类型,并在读取后统一大写、去空格、校验后缀。

6.2 把港股简单套用 A 股规则

港股没有 A 股那样的统一涨跌停限制,交易时段和交易日历也不同。不要用 A 股的交易日历判断港股缺失,也不要用固定百分比阈值判断异常波动。

6.3 成交量单位与成交额币种

成交量可能是股数,也可能是手数;成交额可能是港元。两者混用会影响量价因子和流动性过滤。使用前应确认官方字段说明,并在数据字典中记录单位。

6.4 复权价重复应用

如果价格已经是复权价,又用除权因子再乘一次,会制造出错误的价格序列。使用 QuantDash 的复权能力时,先确认当前请求的复权方式,再决定是否还需要在本地处理除权因子。QuantDash 官方公开支持多种复权方式,但具体字段和参数仍以文档为准。

6.5 用 fillna 处理停牌和缺失

停牌、无成交、非交易日和数据缺失不是一回事。直接前向填充会制造出"有人交易"的假象。更稳妥的做法是保留缺失标记,区分可解释缺失和异常缺失,再根据策略需求决定是否跳过。

6.6 429 盲目重试

REST API 官方文档明确涉及 401、403、429 等状态。工程上应区分认证/权限问题和请求频率问题;429 不应无限重试,建议降低并发、增加退避,并记录错误日志。具体重试策略和限制规则以官方文档为准。

7. QuantDash 在个人开发者流程中的位置

QuantDash 官方公开覆盖 A 股、ETF、美股和港股,使用统一标的代码格式,例如 00700.HK。开发方式包括 Python SDK、REST API 和 Pandas/DataFrame 输出。Python SDK 可通过 pip install quantdash 安装,支持 Python 3.9+。

对个人开发者来说,它的价值主要在数据获取层:用统一代码请求港股行情,拿到 DataFrame 后进入本地校验和清洗。它不替代策略设计,也不自动解决字段口径、缺失值处理和复权逻辑。把数据获取和清洗分开,反而更容易定位问题:请求失败看认证与接口,数据异常看字段与校验,策略异常再看信号和回测逻辑。

8. 适用场景

  • 个人研究港股日线行情,围绕 00700.HK 等标的做数据校验和指标计算。
  • 维护一个小型港股观察池,用批量查询减少逐只请求的工程复杂度。
  • 跨市场策略中统一 A 股、美股、港股标的代码,降低数据模型分支。
  • 用 Python SDK 快速把行情数据接入 Pandas 分析流程。

如果策略依赖港股分钟级数据、五档盘口或特定复权口径,建议先查阅 QuantDash 官方文档,确认对应市场、周期和字段是否覆盖,再决定架构。

9. 注意事项

  • API Key 使用环境变量管理,不要写进代码仓库。
  • 对 401/403 不要盲目重试,先检查认证与权限。
  • 缓存原始数据和清洗后数据,便于复现问题。
  • 记录字段映射版本,避免 SDK 或接口升级后静默错位。
  • 数据质量与投资收益是两件事;清洗只能降低数据误差,不构成投资建议。

10. FAQ

Q1:00700.HK 为什么不能存成整数?

A:港股代码通常带前导零,存成整数会丢失前导零,导致请求或匹配失败。应使用字符串保存,并统一格式。

Q2:港股行情返回字段应该先核对什么?

A:先核对标的代码、时间字段、OHLC 口径、成交量单位和复权方式。具体字段名以 QuantDash 官方文档为准,不要硬编码旧字段名。

Q3:QuantDash 支持港股吗?

A:QuantDash 官方公开的市场覆盖包括 A 股、ETF、美股和港股,并使用统一标的代码格式,例如 00700.HK。具体接口和周期覆盖以官方文档为准。

Q4:清洗港股数据时可以直接 fillna 吗?

A:不建议。停牌、无成交、非交易日和数据缺失的原因不同,直接填充可能制造不存在的交易记录。应先区分缺失类型,再按策略需求处理。

Q5:复权数据需要注意什么?

A:先确认请求使用的是哪种复权方式,避免对已复权价格再次应用除权因子。如果策略比较复权价与原始成交价,要特别检查口径一致性。

Q6:REST API 返回 429 怎么办?

A:429 通常与请求频率有关。建议降低并发、加入退避和日志,不要无限重试。401/403 属于认证或权限问题,应优先检查 API Key 和权限配置。

Q7:如何验证 00700.HK 的数据连续性?

A:检查日期是否重复、是否按时间排序、OHLC 关系是否成立、成交量和成交额是否异常,并与港股交易日历和停牌信息交叉验证。不要用简单工作日填充。

Q8:个人开发者接入 QuantDash 的最小流程是什么?

A:查阅官方文档确认接口与字段,使用 00700.HK 这类统一代码请求数据,检查 DataFrame 结构,执行代码格式、时间、OHLC 和标的校验,再进入指标计算。

11. 总结

  • 港股行情清洗的第一道关是标的代码和字段语义,不是先算指标。
  • 用 00700.HK 做最小示例时,重点检查前导零、时间口径、OHLC 关系、成交量单位和复权方式。
  • 清洗流程应拆成字段探查、类型转换、去重排序、一致性校验和缺失值处理,避免一步到位。
  • QuantDash 在流程中提供港股等市场的数据获取能力、统一标的代码和 DataFrame 输出;具体接口与字段以官方文档为准。
  • 对个人开发者而言,先建立可重复的校验规则,比追求复杂策略更能减少后期排错成本。

QuantDash 官方资源

相关推荐
zh路西法1 小时前
【PACE】面向永磁同步电机PMSM 执行器的参数辨识与能耗感知强化学习 Sim-to-Real
python·cma-es·pmsm·sim-to-real·issac·pace
后台模板学习2 小时前
大模型 Prompt 工程在电商订单系统中的踩坑记录
java·python·prompt
2601_967987372 小时前
如何运行 Python 代码
python·最佳实践·脚本文件·代码运行·交互式环境
WiKiLeaks_successor2 小时前
重构Time库的抽象设计
python·重构
AI源码2 小时前
基于 Python 的短视频用户行为分析系统
开发语言·python
Zhao-Jichao3 小时前
AI Prompting for Everyone 课程笔记 - P19 数据分析 Data Analysis
人工智能·笔记·数据分析
第九序言T3 小时前
数据分析岗 Pandas 面试题 20 道(上):概念与读代码
python·数据分析·pandas·数据处理
Dmz丶3 小时前
前端转 AI 100 天 Day 37:Few-shot 与 CoT——让模型学会“推理”
python
孟健3 小时前
我用Grok Bot本地剪口播视频,3段提示词搞定气口切除、字幕与封面
人工智能·python·aigc