多源金融数据中台:把各数据源的获取 → 落库 → 服务化收敛为一套统一能力,以 REST + WebSocket 对外提供数据服务。
opendata 为 backtrader / ai-for-investor / bt_api_py 等项目提供统一数据支持:消费方只经 API 取数, 不再各自维护取数脚本。
本仓库由 akshare_web 完整拷贝重构而来,正按迭代计划分批交付:
| 迭代 | 目标 | 状态 |
|---|---|---|
| 1A 地基 + 垂直切片 | A 股日线一条链路端到端可用,消费方取数成功 | 进行中(A0 地基已完成) |
| 1B 国内数据全覆盖 + 服务化 | A 股四件套 + 期货双源落库,REST/WS + 客户端对外可用 | 未开始 |
| 1C 海外与宏观 + 验收收口 | 海外/宏观数据可用,上游同步就绪,端到端验收 | 未开始 |
迭代1设计与验收标准见 docs/迭代计划/迭代1-重构数据中台/。迭代2正在统一provider布局并补齐固定350个模型任务,执行状态见迭代2开发验收记录;整体尚未验收完成。
| 来源 | 形态 | 许可证 | 本项目采取的动作 |
|---|---|---|---|
| akshare | HTTP 爬取各站点 | MIT | 按需源码级搬运,保留版权声明 |
| OpenBB | provider 插件体系 | AGPL-3.0 | 仅借鉴架构,实现全部自研(零源码复制) |
| 同花顺扶摇 API | REST(X-api-key) |
商业服务 | 自建客户端位于 opendata/data/providers/ths/,传输层位于其 transport/ |
向 akshare 与 OpenBB 的致谢与许可证边界见 THIRD_PARTY_NOTICES.md。
- 统一数据契约:与数据源无关的标准化模型(行情 / 复权 / 财务 / 指数成分 / 标的元数据 / 交易日历 / 宏观 …)
- provider 注册与路由:
source="auto"按权威度与可用性自动选择并可降级;未验证能力不参与自动路由 - 数仓分层:
ods_<domain>_<source>(逐源原始保真)→ 多源交叉校对 →dwd_<domain>(契约统一) - 跨源校对:经契约模型归一化后逐字段比对,差异落
dq_diff_report,配套白名单/去重/分级告警 - 跑批调度:数据域 pipeline(取数 → 落库 → 校对 → 合并 → 推送)作为调度单元,支持断点续拉与失败重入
- 服务化:REST 查询(分页/过滤/导出/复权口径)+ WebSocket 订阅增量 + 最小 Python 客户端
- 新鲜度与告警:每日检查各域是否含最近交易日数据,缺失即告警
- 数据脚本管理:按分类/频率组织,自动扫描注册,支持自定义脚本
- 定时任务:Cron / Interval 调度,启用/暂停/删除,指数退避自动重试
- 执行记录:状态追踪、行数统计、错误与堆栈、耗时与重试次数、统计趋势
- 用户权限:管理员/普通用户角色、基于角色的访问控制、JWT 认证
- 数据表管理:表列表、表结构、数据预览(适配 ods/dwd 分层)
- Web 界面:Vue3 + Element Plus,响应式,暗色/亮色主题
- 高可用工程:速率限制、结构化日志、健康检查、指标接口
cp .env.example .env
# 必填:MYSQL_ROOT_PASSWORD / MYSQL_PASSWORD / WAREHOUSE_ROOT_PASSWORD /
# WAREHOUSE_PASSWORD / SECRET_KEY(缺失时 compose 会直接拒绝启动)
docker compose up -d- Web 界面:http://localhost
- API 文档:http://localhost:8000/docs
- 健康检查:http://localhost:8000/health
pip install -e ".[web,dev]"
cp .env.example .env # 填写数据库与密钥
alembic upgrade head # 元数据库迁移
python -m opendata.cli init-db
uvicorn opendata.main:app --reload前端:
cd frontend && npm install && npm run dev # http://localhost:5173更完整的步骤、生产部署与排障见 QUICKSTART.md 与 DEPLOYMENT.md。
# 登录
curl -X POST "http://localhost:8000/api/v1/auth/login" \
-H "Content-Type: application/json" \
-d '{"username":"admin","password":"<your-password>"}'
# 数据能力清单(注册表内容)
curl "http://localhost:8000/api/v1/data/capabilities"
# 按数据域查询(迭代 1A 交付,含复权口径)
curl "http://localhost:8000/api/v1/data/stock/daily?symbols=600519&start=2024-01-01&end=2024-12-31&adjust=qfq"
# 创建定时任务
curl -X POST "http://localhost:8000/api/v1/tasks" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{"name":"A股日线增量","schedule_type":"daily","schedule_expression":"17:30"}'完整接口清单见 API.md。
opendata/
├── opendata/ # 主服务包(自研)
│ ├── api/ # REST / WS 路由
│ ├── core/ # 配置、数据库、安全
│ ├── models/ services/ # ORM 模型与业务逻辑
│ ├── data/ # 统一契约与唯一 provider 注册/路由
│ │ └── providers/ # 自研 provider 描述、模型与注册入口
│ │ ├── akshare/ # 自研 AkShare 适配器
│ │ │ └── _vendor/ # 搬运源码与资源,保留 MIT 许可
│ │ ├── ths/ # THS 端点、模型、导入与 transport 传输层
│ │ └── ... # 其他来源;注册状态和模型完成状态分别记账
│ ├── pipeline/ # ★ 数据域 pipeline(迭代 1A-A4)
│ └── data_fetch/ # 既有脚本框架(向 provider 体系迁移)
├── opendata_client/ # 独立安装的 REST/WS Python 消费方 SDK
├── frontend/ # Vue3 + TypeScript 前端
├── alembic/ # 元数据库迁移
├── alembic_data/ # ★ 数据仓库独立迁移环境(迭代 1A-A4)
├── scripts/ # 运维与 codemod 工具
├── tests/ # pytest 测试
└── docs/ # 设计、部署与验收文档
原 opendata_http/ 与 opendata_fuyao/ 已分别并入上面的 AkShare 与 THS provider;消费方 SDK 保持独立安装包。
make check # ruff + mypy + bandit
make test # pytest -n 8(默认跳过 e2e)
make test-cov # 覆盖率门禁 + 报告归档
make quality-ratchet # 存量债务棘轮检查(只降不升)
make public-api-quality # 公共 API docstring/注解覆盖率
make frontend-lint frontend-typecheck frontend-test
make gate # 全部门禁聚合,逐项阻断(CI 与本地验收统一入口)质量分层口径(存量棘轮 / 新增零容忍 / 搬运保真)见 CODE_QUALITY.md。
本项目采用 BSL 1.1(Business Source License 1.1):
- 个人与非商业用途:免费使用、修改、分发。
- 机构内部使用与商业用途:需获得 Licensor 书面授权。
- Change Date:发布日起 4 年后自动转为 MIT License。
内嵌的 akshare 源码为 MIT 许可,其版权声明与全文见
LICENSE-AKSHARE 与 THIRD_PARTY_NOTICES.md;
该部分代码他人仍可按 MIT 条款取用。
商务授权联系:cloudQuant — 个人主页 / GitHub。 授权范围为软件使用许可,不含数据再分发。
免责声明与使用风险草案说明软件、数据、回测和实盘交易的主要风险;该文件尚未批准生效,其中拟议的责任限制不是现行条款。 现行软件许可及第三方许可保持;许可调整状态和待审事项见许可审阅说明。 软件使用许可不代替第三方数据的访问、使用或再分发权限。
opendata 本身不生产数据。所有数据均来源于第三方站点与商业 API,本项目不主张任何数据权利, 亦不对数据的准确性、完整性与时效性作出保证。消费方须自行确认其数据使用方式符合数据来源方的 条款与适用法律。通用数据说明不构成针对特定个人的投资建议;具体服务或输出的性质应按实际内容与适用法律判断。
数据用途边界已逐源记录于数据权利登记表:公开许可可作为依据,免费接口和开源客户端不自动授予全部数据的落库、再分发或商业使用权。软件许可不包含第三方数据许可;已通过技术对照的源仍须遵守其登记条件。
迭代2新增 BLS 与 FMP 的专属登记。BLS 统计复用须遵守来源、访问日期、免责声明与限额条件;FMP 两个行情模型仅完成离线原型接线,本项目尚无适用订阅与多用户数据许可证明,未批准真实采集、集中落库或分发。新能力均未进入自动选源;模型覆盖和真实验收状态见开发验收记录。