快速开始 · 数据集目录 · 研究 Recipes · 接入 AI Agent
CNEquity 开源、免注册、自托管。它不负责给出交易信号,而是把分散在不同来源、不同口径、不同更新节奏的数据,长期保存在自己的机器或服务器上,并且说明每一行从哪里来、何时采到、截至哪一天可用。
为什么要一个数据湖
发出一次 API 请求通常不是最费事的部分。真正困难的是长期保持研究口径一致:
- 多源一致性:字段、代码体系、更新节奏和可回补范围并不相同;
- 历史可复现:每次研究都现场拉取,结果会随上游变化而漂移;
- Universe 完整性:用今天的股票名单回看过去,会自动删掉后来退市的股票;
- PIT 语义:财报、公告和估值必须按当时实际可获得的日期查询;
- 复权与交易状态:如果每个研究脚本各自处理,口径很快就会分叉。
幸存者偏差是一个直观例子。下面的实验使用同一个等权买入持有策略和同一段时间,唯一差别是历史股票池里是否保留后来退市的股票。只用今天仍在交易的股票时,2016–2021 年的收益从 5.9% 变成了 12.0%:
那些股票不是收益为零,而是根本没有进入计算。CNEquity 因此把退市股、复权因子、历史成分和 PIT(按当时可获得的信息取数)放在数据层里处理,而不是交给每个下游脚本临时拼接。
与 AkShare、Tushare、Qlib 有什么不同
AkShare 和其它取数工具解决“怎样调用数据源”,Tushare 提供云端数据服务,Qlib / vn.py 更偏研究或交易平台。CNEquity 做的是中间的数据基础设施:把多源数据落成可日更、可复查、可溯源的本地 Parquet 湖。
| 你在意的能力 | CNEquity | AkShare / efinance | Tushare Pro | Baostock | Qlib / vn.py |
|---|---|---|---|---|---|
| 本地可续跑的数据底座 | 湖 + 日更编排 | 拉到内存,编排自管 | 云端积分,非自建湖 | 会话拉数,无湖 | 绑在平台数据子系统 |
| 历史结果能否复查 | 行级溯源 + 写前校验 | 无统一契约 | 平台字段 | 无湖契约 | 视模块 |
| 复权 / 历史成分 / PIT | 统一在 load() |
自己拼接 | 自己拼接 | 自己拼接 | 用平台口径 |
| 退市股是否保留 | 保留(防幸存者偏差) | 看调用方 | 看接口 | 看接口 | 看数据源 |
| 单一数据源故障 | 按批失败,可单独重试 | 调用方处理 | 平台处理 | 平台处理 | 视模块 |
| 需要注册 / token | 不需要 | 不需要 | 需要积分 | 不需要 | 视数据源 |
更完整的逐项比较见项目对比。
30 秒试玩
需要 Python 3.10+,无需 token、积分或账号:
pip install cnequity
cne demo
cne demo 默认拉取 5 只股票最近约 30 个交易日的真实数据,写入独立目录 data/cnequity-demo/,不会覆盖正式数据湖。需要能访问 TDX 行情主机;如果连接失败,可以先检查:
cne doctor # 环境体检:不需要配置,也不需要网络
cne sources probe --only tdx_protocol --config configs/cnequity.demo.toml
完全无法连接 TDX 时,运行 cne demo --sample,可离线验证安装、Parquet 落盘和查询链路。合成行全部标记为 source=mock,不可用于研究。
能力一览
| 采集 | 42 个数据集 · 14 个上游源 · 主备路由 · 批次级重试、断点续跑与水位对账 |
| 研究口径 | 复权(hfq / qfq 查询侧换算)· 历史指数与行业成分 · PIT 财报 · 保留退市股 |
| 数据契约 | 写前 schema 校验 · 行级溯源(source / data_version / fetched_at)· 破坏性变更必须提版本 |
| 质量 | 84 项审计检查 · 跨源比对 · 覆盖缺口与陈旧检测 · 可配置发布门禁 |
| 存储 | 本地 Parquet + DuckDB · 按数据集选择分区粒度 · 原子写 · 不可变代与时间旅行 |
| 消费 | load() · DuckDB 视图 · Polars · MCP 6 个工具 · 只读运维控制台 |
| 运维 | 日更编排 · launchd / cron 模板 · 源健康探针 · 可移植快照与增量包 |
全部本地运行,不需要注册、token 或积分。
然后在 Python 中读取:
from cnequity.query import load
bars = load("daily_bars", data_root="data/cnequity-demo")
print(bars.tail())
想直接比较原始价格与后复权口径:
cne demo --research --symbols 600519.SH
数据运维页面
建好湖之后,日常要确认的是覆盖有没有跟上、哪里断了、上次审计留下了什么。cne serve 打开只读控制台:
cne serve # http://127.0.0.1:8787
示意截图,图中标有 ILLUSTRATIVE DEMO;完整覆盖热力不是对当前生产湖的声明。
概览页给出健康状态、Fresh / Stale 计数、覆盖热力和行动项。另外三个页面分别看数据集契约与水位、跑批时间线,以及审计 findings、跨源比对和隔离区。控制台不写湖:采集、重试和清理仍走 CLI,页面只显示该复制的命令。非回环地址必须加 --token。
能回答哪些问题
| 研究问题 | 推荐入口 |
|---|---|
| 茅台过去五年复权后涨了多少 | load("daily_bars", symbols=[...], adjust="hfq") |
| 茅台 PE 在自身五年历史中的分位数 | valuation_metrics + 窗口分位 |
| 2018 年财报因子的 IC,且不使用未来数据 | load("financial_statement_items", as_of="2018-04-30") |
| 退市股退市前 60 天的价格形态 | delisting_events + daily_bars |
| 三年前的沪深 300 成分或申万行业 | index_constituents · industry_members |
| 今天的龙虎榜、未来解禁和板块资金流 | dragon_tiger · share_unlock_schedule · sector_fund_flow |
常用查询:
from cnequity.query import load
No comments yet.