交易日历不同
A 股、港股、美股的休市日不同,跨市场对照时直接按日期对齐会出现大量空缺。ZVT 里有交易日历相关的表(聚宽一侧提供),但没有自动对齐机制,需要自己按交易日历做重采样或取交集。
ZVT 项目研究站 · K 线与复权口径
ZVT 把所有行情表按同一个公式命名:{entity_schema}{level}{adjust_type}Kdata。理解这条公式,才知道为什么「前复权」的表名里反而什么都没有——README 有一句常被忽略的说明:为了兼容历史数据,前复权是例外,{adjust_type} 留空。本页把公式、实际存在的表与覆盖差异一次列清。
src/zvt/domain/ 的实际文件名自绘(非官方架构图);示例 Stock1dKdata(默认口径)与 Stock1dHfqKdata(后复权)。官方给了一行规则和一句例外说明,本页把它拆成可以照着拼的四段。
| 段 | 含义 | 取值来源 | 选错会怎样 | 注意点 |
|---|---|---|---|---|
第一段 entity_schema | 标的类型:Stock、Stockus、Stockhk、Index、Etf、Block 等 | 与 tradable_schema_map 的七类标的对应 | 用错类型查不到表,或查到另一个市场的同名代码 | A 股是 Stock,港股是 Stockhk,美股是 Stockus,不是同一个类 |
第二段 level | 周期:1m、5m、15m、30m、1h、4h、1d、1wk、1mon | 框架的 IntervalLevel 枚举 | 周期写错得到空结果或另一张表 | 并非所有标的都有全部周期,见下方覆盖表 |
第三段 adjust_type | 复权方式:默认(前复权)留空,后复权写 hfq | 框架的 AdjustType 枚举 | 最危险的一段:拿默认表当后复权用,长期序列会整体偏移 | README 原文:为兼容历史数据,前置复权是例外,{adjust_type} 留空 |
第四段 Kdata | 固定后缀,表示行情表 | 框架约定 | —— | 不用自己拼字符串,直接在 zvt.domain 里 import 对应类 |
from zvt.domain import Stock1dKdata # 默认口径(前复权,按官方说明 adjust_type 留空)
from zvt.domain import Stock1dHfqKdata # 后复权(hfq)
Stock1dKdata.record_data(code='000338', provider='em')
df = Stock1dKdata.query_data(code='000338', provider='em')官方 README 只说「支持任意标的、任意周期」,但仓库里的文件说明覆盖差异很大。下表按目录实际存在的文件整理。
| 标的类型 | 实际存在的周期 | 后复权变体 | 适用场景 | 注意点 |
|---|---|---|---|---|
stock(A 股) | 1m、5m、15m、30m、1h、4h、1d、1wk、1mon | 5m、15m、30m、1h、4h、1d、1wk、1mon(共 8 个) | 日内与日线研究都行;多周期策略 | 1m 没有后复权版本 |
stockhk(港股) | 1d | 有(1d_hfq) | 港股日线研究 | 没有分钟级 |
stockus(美股) | 1d | 有(1d_hfq) | 美股日线研究、跨市场对照 | 没有分钟级;历史早期数据可能有异常值 |
index | 1d、1wk、1m | 无 | 基准对照、指数增强 | 指数一般不需要复权,但仍要注意基期口径 |
etf | 1d | 无 | 场内基金日线研究 | 既没有分钟级也没有后复权表 |
block(板块) | 1d、1wk、1mon | 无 | 板块轮动、题材跟踪 | 板块指数口径由数据源决定 |
| 其它(future / currency 等) | 1d | 无 | 非主路径,需自行验证 | 这些类型不在 tradable_schema_map 的一等标的里 |
src/zvt/domain/ 下的文件名——表存在才有类可 import。不要凭「框架应该支持」来假设某个周期可用。口径选错往往要重跑整条链路,先确定再动手。
| 研究任务 | 建议表 | 理由 | 注意点 |
|---|---|---|---|
| 长期趋势与因子回测(跨年) | Stock1dHfqKdata(后复权) | 跨除权除息时后复权序列连续,累计收益可比 | 价格绝对值不反映真实成交价,展示时要注意 |
| 看真实成交价、做价格区间判断 | Stock1dKdata(默认口径) | 接近真实价格,便于与行情软件对照 | 长序列里除权处会出现跳空 |
| 日内或分钟级形态 | Stock30mKdata / Stock1hKdata 等 | 股票支持多种分钟级周期 | 历史分钟数据量级大,写库与查询都更重 |
| 周线/月线级别择时 | Stock1wkKdata / Stock1monKdata | 框架直接提供聚合好的周期表,不必自己重采样 | 周期表由数据源生成,边界规则与自行 resample 可能不同 |
| ETF/板块研究 | 对应类型的 1d 表 | 这些类型只有日线可用 | 没有后复权表,长期口径需自行处理 |
把多个标的的数据放进同一张二维表之前,这三件事必须处理,官方文档没有专门讲。
A 股、港股、美股的休市日不同,跨市场对照时直接按日期对齐会出现大量空缺。ZVT 里有交易日历相关的表(聚宽一侧提供),但没有自动对齐机制,需要自己按交易日历做重采样或取交集。
停牌期间某些标的没有记录,行数会少于日历交易日数。用「行数是否等于交易日数」来判断 ZVT 数据完整性时,必须先把停牌情形排除,否则会误判为写库失败。
财报记录的时间字段通常是公告或记录时间,而行情是交易日。把两者放进 ZVT 的同一张二维表时必须决定「用公告日还是报告期」,这个选择会明显改变因子有效性,且官方示例没有给出统一做法。
provider 列会在同一张表混入多源数据时暴露来源,level 列记录周期——做入库检查时这两个列比价格更值得先看。src/zvt/domain/ 的文件清单与 README 输出;本站未实际写库验证,实际可用的周期与字段以你的环境与数据源返回为准。下面这些差距都来自 domain 目录的文件清单,而不是配置问题。提前知道能省下一整轮试错。
| 你可能期待 | ZVT 的实际情况 | 依据 | 替代做法 | 注意点 |
|---|---|---|---|---|
| ETF 的分钟级 K 线 | 只有 1d 表,没有分钟级 | domain/etf_1d_kdata.py,无其他周期文件 | 用日线做轮动类研究;日内需求另找数据源 | 这是记录表层面的覆盖,不是参数开关 |
| 港股与美股的分钟级 K 线 | 各只有 1d(含后复权) | stockhk_1d_kdata / stockus_1d_kdata | 跨市场研究降到日频 | 不要拿 A 股的周期覆盖去推断境外标的 |
| 1 分钟的后复权价格 | 其它分钟周期都有 hfq,唯独 1m 没有 | stock_1m_kdata 存在,stock_1m_hfq_kdata 不存在 | 需要可比价格时自己在 1m 上做复权处理 | 超短周期回测容易在这里出错 |
| 指数的后复权表 | 无;指数只有默认口径 | index_1d/1wk/1m_kdata,无 hfq 变体 | 指数一般不需复权,但基期口径仍要确认 | 指数与个股的复权逻辑不同,不要混用处理方式 |
| 「官方支持任意周期任意标的」 | README 的表述是能力目标,实际以文件清单为准 | domain/ 目录逐个文件核对 | 动手前先列目录确认表存在 | 表存在才有类可 import,这是最直接的验证方式 |
口径类问题最容易被二手教程简化,这里只给仓库与 README 能支撑的说法。
README 明确写着「为兼容历史数据,前置复权是例外,{adjust_type} 留空」。也就是说 Stock1dKdata 就是默认(前复权)口径,而 Stock1dHfqKdata 才是后复权。这是这个框架里最容易看错的一处命名约定。
看任务:跨除权的长期序列与回测用后复权(价格连续、收益可比),需要与行情软件对照的真实价格用默认口径。关键是全流程统一——数据、因子、回测、基准必须落在同一口径上。
按 domain 目录清单,ETF 只有 1d;港股、美股也只有 1d 与 1d 后复权。分钟级只有 A 股个股覆盖最全(1m 到 4h)。这是记录表层面的覆盖差异,不是参数配置问题。
从文件清单看,stock_1m_kdata 存在但 stock_1m_hfq_kdata 不存在,其余五个分钟级周期都有 hfq 版本。做超短周期研究时要注意这一点,需要连续可比价格时可能要自己在 1m 上做复权处理。
两者结果可能不同:框架的周线表由数据源生成,周界定义(自然周还是交易周)与复权处理顺序可能和自行 resample 不一致。研究里要么统一用框架的周期表,要么统一自己聚合,不要混用。
不冲突,是两套独立实现。本机技能 stock-technical-mastery 用新浪财经与 Baostock 取 K 线并算指标,tongdaxin 走通达信官方接口;它们即取即用、不落本地库,与 ZVT 的表名体系无关。两者无已证实集成。