CarrotQuant Data (carrotquant-data)
CarrotQuant Data (carrotquant-data) 是专为量化交易与回测设计的本地金融数据同步与管理工具,支持多源拉取、增量同步与高效列式存储。
🛠️ 特性 (Features)
- 多数据源支持:内置 Baostock、东方财富、通达信 (tdxpy) 等金融数据源驱动,支持灵活扩展。
- 灵活的存储格式:原生支持
csv与列式存储parquet格式。 - 增量与全量同步:基于时间戳水位线机制,支持断点续接(增量拉取)与全量覆盖更新。
- 多接入方式:
- React Web 终端:基于 Bun + Vite + React 19 构建,集成 TradingView Lightweight Charts (3-Pane 图表)、多维搜索与数据管理面板。
- Python SDK:直观的
import cq.dataAPI,支持高性能跨年份数据切片读取 (cq.data.read)、columns按需投影与元数据探查。 - 命令行工具 (CLI):统一的
cqdata命令行工具,提供数据同步 (cqdata sync)、数据表探索 (cqdata tables) 与服务启动 (cqdata server)。 - REST API 服务:基于 FastAPI 的 HTTP 服务,支持数据切片、任务调度与 SSE 实时日志流。
- 列式数据处理:使用 Polars 进行高效的数据清洗与结构转换。
📁 目录结构 (Project Structure)
CarrotQuant.Data/
├── cq/
│ └── data/ # 核心代码包 (import cq.data)
│ ├── entrypoints/ # 接入层 (python_api, cli, rest_api)
│ ├── config/ # 配置管理模块
│ ├── provider/ # 数据源驱动 (BaostockProvider, EastMoneyProvider, TDXProvider)
│ ├── service/ # 核心业务逻辑 (DataReader, MetadataReader, SyncManager 等)
│ ├── storage/ # 本地持久化存储 (CSVStorage, ParquetStorage)
│ └── utils/ # 通用工具箱
├── web/ # React Web 金融终端 (Bun + Vite 6 + React 19 + TradingView 3-Pane)
│ ├── src/ # 视图 View、组件 Component、Hooks 与转换服务
│ └── package.json
├── scripts/
│ ├── wizard.py # 交互向导脚本 (也可通过 cqdata wizard 运行)
│ └── download_tdx.py # 通达信数据下载脚本
├── tests/ # 单元测试与集成测试
├── config/ # 项目配置文件存放目录
├── logs/ # 系统运行日志目录
├── AGENTS.md # AI Agent 架构指南
└── pyproject.toml # 项目构建及依赖配置
🏗️ 系统架构
graph TB
subgraph Entrypoints["接入层 (cq/data/entrypoints)"]
PYTHON_API["python_api.py<br/>(Python SDK)"]
CLI["cli.py<br/>(Typer CLI)"]
REST["rest_api.py<br/>(FastAPI REST)"]
WIZARD["wizard.py<br/>(交互向导)"]
end
subgraph Service["业务逻辑层 (cq/data/service)"]
SM["SyncManager<br/>同步总调度"]
DR["DataReader<br/>切片与按列投影"]
MR["MetadataReader<br/>探查与过滤 API"]
TASK_PLANNER["TaskPlanner<br/>任务规划器"]
MM["MetadataManager<br/>元数据 IO"]
end
subgraph Provider["采集层 (cq/data/provider)"]
PM["ProviderManager"]
BP["BaostockProvider"]
EP["EastMoneyProvider"]
TDX_PROV["TDXProvider"]
end
subgraph Storage["存储层 (cq/data/storage)"]
SF["StorageFactory"]
CSV["CSVStorage"]
PQ["ParquetStorage"]
end
PYTHON_API --> DR
PYTHON_API --> MR
PYTHON_API --> SM
CLI --> SM
CLI --> MR
REST --> DR
REST --> MR
REST --> SM
WIZARD --> SM
SM --> TASK_PLANNER
SM --> PM
SM --> SF
TASK_PLANNER --> MM
SM --> MM
PM --> BP
PM --> EP
PM --> TDX_PROV
SF --> CSV
SF --> PQ
📊 支持的数据表 (Supported Tables)
| Table ID | 类型 | 说明 |
|---|---|---|
ashare.kline.1d.adj.baostock |
TS | A 股日线后复权 |
ashare.kline.1d.raw.baostock |
TS | A 股日线不复权 |
ashare.kline.5m.adj.baostock |
TS | A 股 5 分钟线后复权 |
ashare.kline.5m.raw.baostock |
TS | A 股 5 分钟线不复权 |
aindex.kline.1d.raw.baostock |
TS | A 股指数日线 |
ashare.adj_factor.baostock |
EV | A 股复权因子 |
ashare.concept.eastmoney |
EV | 概念板块成分股 |
ashare.industry.eastmoney |
EV | 行业板块成分股 |
ashare.dragon_tiger.eastmoney |
EV | 龙虎榜 |
ashare.inst_trade.eastmoney |
EV | 机构买卖每日统计 |
ashare.kline.1d.raw.tdx |
TS | A 股日线 (通达信) |
ashare.kline.5m.raw.tdx |
TS | A 股 5 分钟线 (通达信) |
ashare.kline.1m.raw.tdx |
TS | A 股 1 分钟线 (通达信) |
aindex.kline.1d.raw.tdx |
TS | 指数日线 (通达信) |
aindex.kline.5m.raw.tdx |
TS | 指数 5 分钟线 (通达信) |
aindex.kline.1m.raw.tdx |
TS | 指数 1 分钟线 (通达信) |
🛠️ 安装指南 (Installation)
环境要求:Python >= 3.12(支持 Python 3.12 / 3.13 / 3.14+)。
1. 通过 PyPI 安装 (推荐)
# 推荐使用 pip 直接安装
pip install carrotquant-data
# 或使用 uv 安装
uv add carrotquant-data
2. 源码克隆与本地开发安装
git clone https://github.com/CRThu/carrotquant-data.git
cd carrotquant-data
# 可编辑模式挂载命令行 cqdata
uv pip install -e .
⚙️ 配置说明 (Configuration)
CarrotQuant.Data 秉承 “显式胜于隐式 (Explicit is better than implicit)” 的配置契约,支持以下显式加载与覆盖方式(优先级从高到低):
- 代码程序化修改:直接设置单例属性
cq.data.settings.data_dir = "/path/to/data"或调用cq.data.configure("/path/to/config.yaml")(最高优先级)。 - 环境变量
CQDATA_DATA_DIR:如export CQDATA_DATA_DIR="/my/data/path"(适合 Docker / CLI / 自动化部署)。 - 环境变量
CQDATA_CONFIG_PATH:指定自定义 YAML 配置文件路径,如export CQDATA_CONFIG_PATH="/path/to/config.yaml"。 - 内置默认配置:默认存储路径
data_dir = "data",默认日志log_dir = "logs",log_level = "INFO"。
完整配置文件结构参考 config.yaml.sample:
# config.yaml
data_dir: "data" # 数据存储根目录
log_dir: "logs" # 日志输出目录
log_level: "INFO" # 日志级别 (DEBUG/INFO/WARNING/ERROR)
# OOP 访问层全局默认配置链
defaults:
source: "baostock"
format: "parquet"
🚀 快速开始 (Quick Start)
方式一:使用 Python SDK (import cq.data) - 推荐
在量化研究与 Python 策略脚本中直接读取本地清洗好的数据:
import cq.data
# 0. (可选) 从 YAML 配置文件加载全局配置
cq.data.configure("./config.yaml")
# 或者直接修改属性
cq.data.settings.data_dir = "./custom_data"
# 1. OOP 便捷读取 (界面极简,干净清爽)
df_kline = cq.data.ashare.kline.get(symbols="sh.600000", start_date="2024-01-01")
# 2. 查阅代码清单、时间跨度、Schema 映射与物理总行数
symbols = cq.data.list_symbols("ashare.kline.1d.raw.baostock")
start_dt, end_dt = cq.data.get_time_range("ashare.kline.1d.raw.baostock")
schema = cq.data.get_schema("ashare.kline.1d.raw.baostock") # {'timestamp': 'Int64', ...}
total_rows = cq.data.get_row_count("ashare.kline.1d.raw.baostock") # 13570685
# 3. 统一切片读取 K 线时序数据 (支持 columns 按需挑选列,极节省内存)
df = cq.data.read(
table_id="ashare.kline.1d.raw.baostock",
symbols=["sh.600000", "sz.000001"],
start_date="2024-01-01",
end_date="2024-06-30",
columns=["timestamp", "datetime", "symbol", "close", "volume"]
)
print(df)
# 4. 统一切片读取板块/龙虎榜事件数据
events_df = cq.data.read(
table_id="ashare.concept.eastmoney",
symbols=["sh.600000"]
)
# 5. 代码中触发全自动数据同步
cq.data.sync(table_ids=["ashare.kline.1d.raw.baostock"], formats=["parquet"])
方式二:使用统一 CLI 命令行工具 (cqdata)
可在终端或 Cron 定时任务中直接调用 cqdata 交互:
# 查看本地存储的所有数据表概览
cqdata tables
# 查看某张表的物理行数、代码列表与 Schema 详细元数据
cqdata info ashare.kline.1d.raw.baostock
# 触发自动增量同步
cqdata sync --tables "ashare.kline.1d.raw.baostock,ashare.adj_factor.baostock"
# 指定日期区间与保存格式进行全量强制更新
cqdata sync -t ashare.kline.1d.raw.baostock -f parquet -s 2023-01-01 -e 2023-12-31 --force
💡 通达信 (TDX) 最佳同步实践说明
通达信驱动支持 Local (离线 vipdoc 导包) 与 Online (在线 TCP 协议) 两种模式。两者的输出格式和字段完全对齐,落地在同一个 table_id 下,数据会自动无缝去重与合并。
- Local 离线模式读取能力:原生支持解析本地
vipdoc目录下的 日线 (.day)、5分钟线 (.lc5) 以及 1分钟线 (.lc1) 等所有离线二进制文件(包含通达信软件自行下载导出的分钟线文件)。 - 极速初始化脚本 (
cqdata tdx download):用于一键拉取并解压通达信官方服务器的全量日线行情包(hsjday.zip),实现数十年日线历史数据的秒级导入。
[!TIP] 强烈推荐的最佳实践流程:
- 首次极速初始化(Local 模式):通过
cqdata tdx download下载官方vipdoc日线离线包(或直接挂载本地已有的通达信客户端vipdoc目录)解析导入,秒级完成历史数据装载。- 日常增量更新(Online 模式):日常收盘后直接执行在线增量同步,系统会自动根据水位线补全最新几日的增量 K 线(支持 1d / 5m / 1m)。
# 步骤 1: 极速初始化 - 下载并解压通达信官方全量日线行情包 (hsjday.zip)
cqdata tdx download
# 或使用 uv 直接运行下载脚本 (也可通过 --tdx-vipdoc 指定本地已有通达信客户端目录)
uv run scripts/download_tdx.py
# 步骤 2: 日常盘后增量 - 触发通达信在线按水位线追加最新数据 (支持 1d 日线 / 5m / 1m 分钟线)
cqdata sync -t ashare.kline.1d.raw.tdx
命令行关键参数:
-t/--tables: 必填,要同步的表 ID,多表用逗号分隔。-f/--formats: 选填,保存格式(默认parquet,csv)。-s/--start&-e/--end: 选填,时间范围,留空则是自动接续水位线增量同步。--force: 选填,强制全量刷新覆盖。--limit: 选填,限制同步代码数量(调试用)。
方式三:使用终端交互向导 (Wizard)
cqdata wizard
方式四:一键启动服务器与 Web 终端 (支持 --open / -o 自动打开浏览器)
# 启动后端 API 服务并自动调起系统浏览器打开 Web 终端
cqdata server --port 8888 --open
# (也可使用 -c 指定配置文件: cqdata server -p 8888 -c ./config.yaml -o)
启动后内置托管 React Web 终端并提供基于 FastAPI 的 RESTful HTTP 接口(全量端点汇总):
| 端点 | 方法 | 说明 |
|---|---|---|
/ |
GET | 内置托管的 React Web 金融终端主界面 |
/api/v1/health |
GET | 系统健康检查与服务运行状态探针 |
/api/v1/tables |
GET | 列出本地所有数据表总览 (平铺列表,含 category 属性) |
/api/v1/tables/detailed |
GET | 获取所有数据表及其各存储格式 (Parquet / CSV) 独立物理元数据 |
/api/v1/tables/{table_id}/formats |
GET | 获取指定表已存储的物理格式列表 (['parquet', 'csv']) |
/api/v1/tables/{table_id}/symbols |
GET | 获取指定表已下载的股票/证券代码列表 |
/api/v1/tables/{table_id}/time_range |
GET | 获取指定表的时间跨度 tuple (start_datetime, end_datetime) |
/api/v1/tables/{table_id}/schema |
GET | 获取指定表的字段列名与类型字典 |
/api/v1/tables/{table_id}/row_count |
GET | 获取指定表的记录总条数/行数 |
/api/v1/tables/{table_id}/boards |
GET | 聚合板块概念/行业列表及各板块成分股计数,支持关键词搜索 |
/api/v1/query |
GET | 统一切片查询接口(支持 symbols, board_code, start_date, end_date, columns, page, page_size),按 table_id 自动智能路由 |
/api/v1/sync |
POST | 异步触发后台数据同步任务 |
/api/v1/tasks |
GET | 查询当前正在运行的同步任务列表 |
/api/v1/sync/status |
GET | 获取所有同步任务的详细进度状态(含百分比、当前代码与错误信息) |
/api/v1/logs/stream |
GET | SSE (Server-Sent Events) 实时系统与数据同步日志流 |
/api/v1/tdx/check |
GET | 检查通达信本地 vipdoc 目录有效性与代码统计 |
/api/v1/tdx/download |
POST | 后台从通达信官方服务器下载全量 hsjday.zip 日线包并自动解压 |
/api/v1/filesystem/list |
GET | 本地文件与目录探查接口 (供 Web 文件选择器使用) |
方式五:前端 UI 开发与热重载调试 (web/)
进行前端界面开发或组件调试时,可启动 Vite 热重载服务:
# 1. 启动后端 REST API 服务
cqdata server --port 8888
# 2. 在另一个终端启动 Vite 开发调试服务 (支持 HMR 热更新)
cd web
bun install
bun dev
打开浏览器访问 http://localhost:5173/ 体验 Vite HMR 极速实时编译调试。
详细使用指南与架构说明请参阅 docs/web_terminal_guide.md。
📚 相关文档 (Documentation)
📝 许可证 (License)
本项目遵循 Apache License 2.0 - 详细请参阅 LICENSE 文件。
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file carrotquant_data-1.3.1.tar.gz.
File metadata
- Download URL: carrotquant_data-1.3.1.tar.gz
- Upload date:
- Size: 241.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bc68622dd2f398a2c003636b0ee83d95d12e4d3a4aae197b56f488dad9c0c438
|
|
| MD5 |
f23374ef978c1025e9b261872b46a6f2
|
|
| BLAKE2b-256 |
ef563fcf0aaec86b7fa4b0611ac0fc98406356f1e18ed724c6312d0dc3b1d9b8
|
Provenance
The following attestation bundles were made for carrotquant_data-1.3.1.tar.gz:
Publisher:
workflow.yml on CRThu/carrotquant-data
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
carrotquant_data-1.3.1.tar.gz -
Subject digest:
bc68622dd2f398a2c003636b0ee83d95d12e4d3a4aae197b56f488dad9c0c438 - Sigstore transparency entry: 2495196189
- Sigstore integration time:
-
Permalink:
CRThu/carrotquant-data@d8053eee5c6d09dc6c4a7cf24456d8198a4fdbbd -
Branch / Tag:
refs/tags/v1.3.1 - Owner: https://github.com/CRThu
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
workflow.yml@d8053eee5c6d09dc6c4a7cf24456d8198a4fdbbd -
Trigger Event:
push
-
Statement type:
File details
Details for the file carrotquant_data-1.3.1-py3-none-any.whl.
File metadata
- Download URL: carrotquant_data-1.3.1-py3-none-any.whl
- Upload date:
- Size: 261.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7211ac1c6f4fa68ae0fba5247d9f797270fcf97b5e41114a32a0f38c66556b5f
|
|
| MD5 |
7f8b11526239181d472ddb400b4b0a1c
|
|
| BLAKE2b-256 |
9c8681391f174a6fd4618c2d4e57487c1b89c7e57aea501dc72d55928772dd9f
|
Provenance
The following attestation bundles were made for carrotquant_data-1.3.1-py3-none-any.whl:
Publisher:
workflow.yml on CRThu/carrotquant-data
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
carrotquant_data-1.3.1-py3-none-any.whl -
Subject digest:
7211ac1c6f4fa68ae0fba5247d9f797270fcf97b5e41114a32a0f38c66556b5f - Sigstore transparency entry: 2495196205
- Sigstore integration time:
-
Permalink:
CRThu/carrotquant-data@d8053eee5c6d09dc6c4a7cf24456d8198a4fdbbd -
Branch / Tag:
refs/tags/v1.3.1 - Owner: https://github.com/CRThu
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
workflow.yml@d8053eee5c6d09dc6c4a7cf24456d8198a4fdbbd -
Trigger Event:
push
-
Statement type: