接口概览
QuantDB 提供 RESTful API,支持 JWT Token(桌面客户端)和 X-API-Key(量化脚本)两种鉴权方式。所有 API 均挂载在 /api/v1 下,返回 JSON 格式。
官方生产 Base URL:
https://quantdb.quantmind.cloud
|
Content-Type: application/json
分类一览
| 分类 | 端点 | 鉴权 |
|---|---|---|
| 健康 | GET /health | 公开 |
| 认证 | POST /auth/login | 公开 |
| 账户 | GET /auth/me, GET /auth/usage, GET /auth/api-keys, POST /auth/api-keys, DELETE /auth/api-keys/:id | 需鉴权 |
| 数据 | GET /data/stock-list, GET /data/calendar, GET /data/meta, GET /data/preview | 需鉴权 |
| 下载 | GET /data/download, GET /data/download/manifest | 需鉴权 |
| 发布 | GET /data/releases | 需鉴权 |
| 订阅 | GET /subscription/plans, POST /subscription/orders, GET /subscription/orders/:id | plans 公开,其余需鉴权 |
| 版本 | GET /api/v1/version | 公开 |
鉴权方式
JWT Bearer Token
桌面客户端或交互式使用,Token 24 小时过期。
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...
X-API-Key
量化脚本或自动化场景,长期有效。
X-API-Key: qdb_abc123def456...
响应格式
成功返回 HTTP 200,数据放在 data 或 files 字段;失败返回对应 HTTP 状态码与 detail 错误描述。
{
"detail": "错误描述信息(有错误时)"
}
认证接口
POST
/api/v1/auth/login
60次/分
▶
用户名或邮箱登录,返回 JWT Token(24 小时有效)。
请求参数
| 字段 | 类型 | 说明 |
|---|---|---|
| username | string | 用户名或邮箱 |
| password | string | 密码 |
请求示例
curl -X POST https://quantdb.quantmind.cloud/api/v1/auth/login \
-H "Content-Type: application/json" \
-d '{"username": "your_username", "password": "your_password"}'
响应示例
{
"access_token": "eyJhbGciOiJIUzI1NiIs...",
"token_type": "bearer"
}
账户管理
查询用量、余额、管理 API Key。支持 Bearer Token 或 X-API-Key。
GET
/api/v1/auth/me
60次/分
▶
获取当前用户信息及流量使用情况。
curl https://quantdb.quantmind.cloud/api/v1/auth/me \ -H "Authorization: Bearer <jwt_token>"
{
"username": "trader01",
"email": "trader@example.com",
"id": 2,
"used_traffic": 1048576,
"traffic_limit": 104857600,
"credit_limit": 0,
"purchased_traffic": 0,
"balance_yuan": 0,
"subscription": { "status": "free", "plan_id": "" }
}
GET
/api/v1/auth/usage
需鉴权
▶
获取当前用户流量用量与余额(与 /auth/balance 等价)。
curl https://quantdb.quantmind.cloud/api/v1/auth/usage \ -H "Authorization: Bearer <jwt_token>"
{
"used_traffic": 1048576,
"traffic_limit": 104857600,
"credit_limit": 0,
"purchased_traffic": 0,
"balance_yuan": 0,
"subscription": { "status": "free", "plan_id": "" }
}
GET
/api/v1/auth/api-keys
需鉴权
▶
列出当前用户的 API Key 列表(仅展示前缀,明文仅创建时返回一次)。
curl https://quantdb.quantmind.cloud/api/v1/auth/api-keys \ -H "Authorization: Bearer <jwt_token>"
POST
/api/v1/auth/api-keys
需鉴权
▶
创建新的 API Key(免费用户限 1 个,订阅用户按套餐上限)。
注意:API Key 创建后仅在返回时明文展示一次,请立即保存。
curl -X POST https://quantdb.quantmind.cloud/api/v1/auth/api-keys \
-H "Authorization: Bearer <jwt_token>" \
-H "Content-Type: application/json" \
-d '{"description": "量化回测脚本"}'
DELETE
/api/v1/auth/api-keys/:id
需鉴权
▶
按 id 撤销指定 API Key。
元数据查询
股票列表、交易日历、数据预览等元数据接口:网关直读对象存储 Parquet 返回 JSON,仅登录 + 限流,不计流量,免费用户可用。业务数据(K 线 / Tick / 财务)的查询通过下载 Parquet 切片实现,见下方"数据预览与下载"。
GET
/api/v1/data/stock-list
30次/分·用户
▶
A 股基础信息:代码、名称、上市日、ST/退市状态。
df = client.query_stock_list(keyword="茅台", limit=5) print(df)
GET
/api/v1/data/calendar
30次/分·用户
▶
A 股交易日历,返回交易日及是否开市标记。
df = client.query_calendar(start_date="2026-01-01", end_date="2026-12-31")
数据预览与下载
预览(免费)和下载(消耗流量)Parquet 原始数据文件。
GET
/api/v1/data/preview
60次/分
▶
预览本地 Parquet 尾部数据,不计流量费。
| 参数 | 类型 | 说明 |
|---|---|---|
| category_id | string | 大分类 ID(1-6) |
| sub_category | string | 子分类名,如 daily_forward |
| symbol | string | 股票代码 |
| limit | int | 返回行数,默认 30 |
df = client.preview_as_df("1", "daily_forward", symbol="600519.SH", limit=5)
GET
/api/v1/data/download
30次/分
▶
流式下载原始 Parquet 文件。支持
layout=auto|v1|v2;可用 object_key 下载 release 中的 V2 patch(必须属于所选数据集)。V2 数据集(日线、估值、技术指标、因子等)在 COS 上为纯 V2 存储,按日分区查询效率最优;V1 数据集(分钟线、Tick、财务等)仅提供逐股票文件。下载频率不限流。免费注册用户获赠 500MB 一次性体验流量,可下载 K线/Tick/财务等全部分类;模型训练数据集(第 6 大类)仅限订阅用户,免费用户访问返回 HTTP 403。订阅用户含 30GB/月,超出按 ¥1/GB 从账户余额扣减。
CDN 直连:服务端预扣流量成功后返回 302 重定向至一次性令牌中转端点,验证令牌后再 302 至 CDN 签名 URL。令牌一次性消费,防止签名 URL 被重复使用或分享。SDK 自动处理两跳重定向;直接调用 API 时请勿将
X-API-Key 透传至 CDN 域。
计费规则:两阶段事务 — 传输成功才扣费,中途断开自动回滚。携带匹配的
If-None-Match 时返回 HTTP 304,不下载正文、不扣流量。配额或余额不足返回 HTTP 402。
curl -OJ "https://quantdb.quantmind.cloud/api/v1/data/download?category_id=1&sub_category=daily_forward&symbol=600519.SH" \ -H "X-API-Key: qdb_abc..."
Python SDK
# 下载到本地
path = client.download_file("1", "daily_forward", symbol="600519.SH")
# 直接加载到 DataFrame(不落盘)
df = client.load_as_df("1", "daily_forward", symbol="600519.SH")
GET
/api/v1/data/download/manifest
10次/分
▶
获取分类在 COS 上的文件清单(含 layout、relative_path、ETag 与大小),用于批量下载和 V1/V2 选择。不计费。
files = client.query_manifest("1", "daily_forward", layout="v2")
print(f"共 {len(files)} 个文件")
GET
/api/v1/version
公开
▶
客户端版本检查,返回最新版本号和下载地址。
发布清单
V2 增量同步专用:按 release_id 获取增量发布包(含 daily 切片与 patch),SDK 据此做原子同步。
GET
/api/v1/data/releases
需鉴权
▶
获取 after_release 之后的增量发布包清单,可按 datasets 过滤。
| 参数 | 类型 | 说明 |
|---|---|---|
| after_release | string | 游标:只返回此 ID 之后的 release |
| datasets | string | 逗号分隔的数据集名,如 kline,financial |
result = client.sync_dataset("daily_forward", save_dir="D:/quantdb-data")
订阅与支付
套餐查询、下单与支付宝回调。
GET
/api/v1/subscription/plans
公开
▶
获取可用订阅套餐列表(名称、价格、流量额度、API Key 上限等)。
POST
/api/v1/subscription/orders
需鉴权
▶
创建支付订单,返回支付宝付款链接。
| 字段 | 类型 | 说明 |
|---|---|---|
| plan_id | string | 套餐 ID,如 monthly |
GET
/api/v1/subscription/orders/:id
需鉴权
▶
查询当前用户的订单详情。
Python SDK 快速入门
quantdb-sdk 是官方 Python SDK,一行代码即可调用全部接口。
安装:
pip install quantdb-sdk(依赖 requests、pandas、httpx、duckdb)
初始化
from quantdb_sdk import QuantDBClient # 方式一:API Key(推荐) client = QuantDBClient(api_key="qdb_abc123...") # 方式二:用户名密码登录 client = QuantDBClient(username="user", password="pass")
常用方法
| 方法 | 分类 | 说明 |
|---|---|---|
| get_usage() | 账户 | 查询流量用量、余额、剩余额度 |
| query_kline() | 数据查询 | 始终优先 V2 按日分区;有范围且覆盖不完整时回退 V1(消耗流量) |
| query_tick() | 数据查询 | 下载 Tick Parquet 切片后客户端解析(消耗流量) |
| query_stock_list() | 元数据 | 股票列表模糊搜索(不计流量) |
| query_calendar() | 元数据 | 交易日历查询(不计流量) |
| query_manifest() | 批量下载 | COS 文件清单 |
| preview_as_df() | 预览 | 预览 Parquet 尾部数据 |
| download_file() | 下载 | 流式下载 Parquet 到本地 |
| load_as_df() | 下载 | 远端 Parquet 直读 DataFrame |
| query_local() | 本地查询 | DuckDB SQL 查询已下载 Parquet |
| sync_dataset() | 增量同步 | 按 release cursor 原子同步 V2 daily/patch,缺 V2 时回退 V1 |
完整 SDK 文档请查看 Python SDK 文档。
更新日志
SDK v0.2.10
2026-08-06
当前版本
- 规范对齐与稳定性增强:与 QuantDB 0.7.0 规范全面对齐,优化 ETag 缓存比对与数据传输机制
SDK v0.2.9
2026-07-30
- CDN 直连重试路径修复:0.2.8 引入的重试逻辑缺失
import time/import asyncio,触发重试时抛NameError,已补齐导入
SDK v0.2.8
2026-07-30
- CDN 直连 302 相对 URL 修复:服务端 CDN 直连模式 Stage 1 返回相对 URL(
/api/v1/data/cdn-bridge?token=xxx),此前直接作为请求 URL 导致MissingSchema/UnsupportedProtocol,CDN 直连下载完全不可用;现在自动拼接api_host构造完整 URL - CDN 直连请求带重试:cdn-bridge 与 CDN 签名 URL 两跳请求均带 2 次重试(指数退避 1s/2s),网络抖动不再中断整个
sync_dataset - 302 重定向链路手动跟随:统一用重试循环跟随最多 3 跳(
/download→/cdn-bridge→ CDN 签名 URL),ETag 逐跳透传
SDK v0.2.7
2026-07-29
- V1 回退对纯 V2 数据集失效修复:
query_kline/a_query_kline无日期范围时不再默认走 V1。margin_trading、features_daily、l1_factors、l2_factors等 11 个纯 V2 数据集在 COS 上已无 V1 逐股票文件,V1 回退会 404。现在无范围时也走 V2 manifest 路径(全量下载所有分区),仅在有日期范围时才做日历完整性校验 - 异步客户端时区处理对齐:
AsyncQuantDBClient._normalise_kline补齐tz_convert逻辑,与同步客户端行为一致
SDK v0.2.6
2026-07-27
- 适配服务端 CDN 直连下载(302 跳转):修复异步客户端在 CDN 直连模式下下载/同步接口失效的问题
- 凭证保护:同步与异步客户端统一改为手动处理 302 + 无鉴权头裸请求直连 CDN,API Key 不会泄露给 CDN 域
- 302 响应中的 COS ETag 回填至 CDN 响应,保证进程内 ETag 缓存与 If-None-Match 304 逻辑一致
- [后端安全] 一次性下载令牌:302 模式改为两跳(令牌中转),防止签名 URL 被重复使用或分享
- [后端安全] 移除 ?direct=1 请求级覆盖,用户无法强制走 302 模式
- [数据架构] COS V2 数据集全面清理 V1 残留文件(~1.8 万对象),11 个 V2 数据集均为纯 V2 存储,ListObjects 分页效率提升 3-5 倍
- [数据架构] L1 日频因子(l1_factors)V2 全量上线:2565 个交易日分区(2016-01-04 ~ 至今),支持按日范围高效查询
- [数据架构] L2 高频因子(l2_factors)V2 上线:34 个交易日分区(2026-01-05 ~ 2026-02-27)
SDK v0.2.5
2026-07-27
- 异步客户端完善:全量 a_ 前缀方法、httpx 连接池复用、Semaphore 并发控制
- CLI 增强:quantdb check / usage / --version 子命令
- 下载工具函数重构:SHA-256 校验、原子 .part 临时文件、断点重试
- V1/V2 Manifest 回退与 release patch 下载兼容
- 批量下载建议 8 工作线程并发,每个 worker 使用独立客户端实例
SDK v0.2.4
2026-07-26
- V1 股票切片与 V2 日切片兼容;日期范围优先 V2,缺覆盖整次回退 V1
- release cursor 增量同步 V2 daily / patch,SHA-256 校验与原子落盘
- 下载 ETag 条件请求,HTTP 304 不传输正文、不扣流量
- API Key 全生命周期管理
- 滑动窗口限流
- Python SDK(同步 + 异步)
- Electron 桌面客户端
HTTP 状态码速查
| 码 | 含义 | 说明 |
|---|---|---|
| 200 | 成功 | 请求正常处理 |
| 400 | 参数错误 | 缺少必填参数或格式不正确 |
| 401 | 未认证 | JWT 过期 / API Key 无效 |
| 402 | 余额不足 | 下载时账户余额不足 |
| 403 | 无权限 | 邮箱未验证 / 账户禁用 / 免费用户访问模型训练数据集(第 6 大类) |
| 404 | 数据不存在 | Parquet 文件或 COS 对象不存在 |
| 409 | 冲突 | 用户名/邮箱已注册、API Key 已存在 |
| 429 | 限流 | 请求频率超限 |
| 500 | 服务端错误 | 内部错误 |
| 503 | 服务不可用 | COS/邮件未配置 |