误解一:ZVT 自带行情
它只带「从数据源抓数据并写库」的能力。tradable_schema_map 描述的是标的类型,不是数据来源;能不能取到数据取决于 provider 与本机网络。这也是本站单独做「数据源」页的原因。
ZVT 项目研究站 · 实体模型
ZVT 把「你能研究什么」这件事写死在一个字典里:zvt_context.tradable_schema_map。它一共七个键——stock、stockhk、stockus、index、etf、block、fund。理解这七个键和它们的实体命名规则,比记住任何函数都重要,因为后面所有的取数、因子与查询都建立在这一层抽象上。
zvt_context.tradable_schema_map 的七个键(非官方架构图);实体 id 示例为 stock_sz_000001。下面这张表把 README 里的字典键、源码里的 domain 目录与文件命名对应起来——官方 README 只贴了一段字典输出,没有解释每一类能拿到什么。
| schema 键 | 对应对象 | 可拿到的数据面 | 适用场景 | 注意点 |
|---|---|---|---|---|
stock | A 股个股 | 标的清单、九个周期的 K 线(含后复权)、财务报表、财务指标、分红融资、股东与高管交易、龙虎榜、资金流 | 个股研究、因子选股、策略回测的主力标的 | 数据面最全,也最容易被限流;全市场写库耗时长 |
stockhk | 港股个股 | 标的清单、1 日 K 线(含后复权)、实时行情表结构 | 港股对照研究 | 周期覆盖远少于 A 股,没有分钟级 |
stockus | 美股个股 | 标的清单、1 日 K 线(含后复权)、实时行情表结构 | 美股研究、跨市场对照 | 标的清单里同一代码可能同时出现在 nyse 与 nasdaq,需要按 exchange 区分 |
index | 指数 | 指数清单(含分类与基点)、1 日/1 周/1 月 K 线、指数成分股 | 基准对照、指数增强研究 | 清单里区分 scope 等类别,筛选时要带 category 条件 |
etf | ETF | 清单、1 日 K 线 | 场内基金研究 | 只有日线,没有分钟级 |
block | 板块 | 板块清单(行业与概念两套来源)、板块日/周/月 K 线、板块资金流 | 板块轮动、概念题材研究 | 东财与新浪两种板块口径不完全一致,ZVT 默认取第一个注册的 provider,同一板块名可能指向不同成分 |
fund | 基金 | 基金清单与净值相关表 | 公募基金研究 | 部分表依赖聚宽一侧的口径与账号 |
tradable_schema_map 里不是可交易标的一等公民。仓库里确实有 future / cbond / currency 相关的 domain 文件,但它们没有出现在这份 schema 映射中,不能当成 ZVT 已支持的研究对象来宣传。官方文档把这些称为核心概念,但没有给出完整的命名规则说明。下面按 README 的输出反推并逐条标注依据。
股票、指数、ETF、板块、基金都是实体。每个实体由 entity_id 标识,形如 stock_sz_000001:{entity_type}_{exchange}_{code}。注意三段的顺序是类型在前、交易所在中、代码在后,和常见的「代码.交易所」写法相反。
行情、财务报表、分红、股东变动、龙虎榜、资金流都是事件。事件的表名由实体名 + 周期 + 复权方式拼出来(例如 Stock1dKdata),所以「研究一只股票」实际是在研究它的实体记录加一串事件记录。
实体类型决定这个对象能不能有分钟级数据、能不能有财务数据。stock 有九个周期,etf 只有 1d——这不是配置问题,而是 domain 里就没有那些表。写代码前先用 zvt_context.tradable_schema_map 确认自己研究对象属于哪一类。
美股尤其明显:README 港股与美股示例里,同一段输出中可能出现相同代码分属 nyse 与 nasdaq 两条记录。查询时用 entity_id 或带 exchange 条件,不要只用 code。
README 的输出块里带着具体行数,很多人直接当作「ZVT 能取到多少数据」的结论。下表说明正确的读法。
| README 示例 | 输出行数 | 正确读法 | 注意点 |
|---|---|---|---|
| 中国 A 股标的清单 | 4136 行 | 只能说明「这份输出被打印时」的记录条数 | 输出里已含 2021 年上市的 605xxx 代码,说明快照大约在 2021 年前后 |
| 美股标的清单 | 5826 行 | 同上 | 同一代码可能重复出现在不同交易所 |
| 港股标的清单 | 2597 行 | 同上 | 含 8xxxx 的 -R 类人民币柜台代码 |
| 指数清单(scope 类) | 30 行 | 只是带 category=='scope' 过滤后的子集 | 不是指数总数;不带过滤条件时行数不同 |
| 单只股票日线 | 3431 行(2007-04-30 起) | 示例标的潍柴动力的历史长度 | 不同标的上市时间不同,行数不能横向比较 |
| 单只美股日线 | 8770 行(1984-09-07 起) | 示例标的 AAPL 的历史长度 | 早期价格出现负值,属数据源口径问题,需自行清洗 |
Stock.record_data() 后查询。本站不把快照数字当作现状引用。七类标的能做的事差别很大,这张表按任务而不是按类型组织。
| 你要做的研究 | 该用哪类标的 | 理由 | 注意点 |
|---|---|---|---|
| 个股多因子选股 | stock + 财务与资金流事件表 | A 股的数据面最全,能支撑横截面因子 | 全市场写库耗时最长,建议先小范围验证 |
| 板块轮动或题材研究 | block 与 stock 组合 | 板块有独立 K 线与资金流,可与成分股交叉验证 | 行业与概念两套口径不同,先确定用哪套 |
| 指数增强或基准对照 | index + stock | 指数有成分股表,可以直接构造股票池 | 指数清单要带 category 条件筛选 |
| 跨市场对照(A 股 vs 美股) | stock + stockus | 两类标的都有日线与后复权版本 | 交易日历不同,对齐前先处理日期 |
| 场内基金或 ETF 轮动 | etf | 有日线可用 | 没有分钟级;基金净值要走 fund 一侧 |
这三条在中文教程里反复出现,但都能在源码与 README 里被反驳。
它只带「从数据源抓数据并写库」的能力。tradable_schema_map 描述的是标的类型,不是数据来源;能不能取到数据取决于 provider 与本机网络。这也是本站单独做「数据源」页的原因。
domain 目录里只有股票有 1m 到 4h 的周期表,ETF、指数、港股、美股都只有日线。想用分钟级做高频或日内研究,ZVT 在这几类标的上不提供。
「标的类型」是抽象层,不等于市场:美股的 nyse 与 nasdaq 同属 stockus,A 股的沪深同属 stock。做市场维度统计时要在 ZVT 的实体 id 上自己按 exchange 再分组。
涉及数据面的回答以 src/zvt/domain/ 的实际文件与 README 为准。
不是一等公民。仓库里有 future、cbond、currency 相关的 domain 文件(还有对应的 em provider recorder),但它们没有出现在 zvt_context.tradable_schema_map 的七个键里,官方 README 的数据与策略示例也全部围绕这七类展开。要用这些,等于自己走非主路径。
从 README 的输出看是这样:stock_sz_000001、stockus_nasdaq_AAPL、stockhk_hk_00700、index_sh_000001 都是「类型_交易所_代码」。指数用的是 sh/sz 这类市场前缀。以源码里的实体构造逻辑为准。
按 entity_id 查而不是按 code 查。README 的美股示例里,AACG 同时出现在 nasdaq 与 nyse 两行,如果不指定交易所,查询结果会混在一起。
README 的示例里 Block.provider_map_recorder 同时注册了 eastmoney 与 sina 两个 recorder,默认取第一个。两家的板块口径(尤其概念板块)不一样,换 provider 会换成分股,做历史对照前先固定一家。
不是。那是 README 输出被打印时的快照,从其中的 605xxx 代码推断大约在 2021 年前后。要当前数量请在自己的环境写库后查询。本站也不把这些快照数字当现状引用。
没有已证实集成。本机技能里有 akshare-finance、tushare-finance、mx-data 等取数技能,也覆盖 A 股、港股、美股与基金,但它们是即取即用、不落本地库的形态,和 ZVT 的「先写库再查询」是两种做法。对照见顶部导航「对比」。