Skip to main content

CarrotQuant Data (carrotquant-data)

PyPI version Python Version License

CarrotQuant Data (carrotquant-data) 是专为量化交易与回测设计的本地金融数据同步与管理工具,支持多源拉取、增量同步与高效列式存储。

🛠️ 特性 (Features)

  • 多数据源支持:内置 Baostock、东方财富、通达信 (tdxpy)、StockDB (free-stockdb) 等金融数据源驱动,支持灵活扩展。
  • 灵活的存储格式:原生支持 csv 与列式存储 parquet 格式。
  • 增量与全量同步:基于时间戳水位线机制,支持断点续接(增量拉取)与全量覆盖更新。
  • 多接入方式:
    • React Web 终端:基于 Bun + Vite + React 19 构建,集成 TradingView Lightweight Charts (3-Pane 图表)、多维搜索与数据管理面板。
    • Python SDK:直观的 import cq.data API,支持高性能跨年份数据切片读取 (cq.data.read)、columns 按需投影、cq.data.ashare / cq.data.aetf / cq.data.aindex 命名空间访问与元数据探查。
    • 命令行工具 (CLI):统一的 cqdata 命令行工具,提供数据同步 (cqdata sync)、数据表探索 (cqdata tables) 与服务启动 (cqdata server)。
    • REST API 服务:基于 FastAPI 的 HTTP 服务,支持数据切片、任务调度与 SSE 实时日志流。
  • 列式数据处理:使用 Polars 进行高效的数据清洗与结构转换。

📁 目录结构 (Project Structure)

CarrotQuant.Data/
├── cq/
│   └── data/         # 核心代码包 (import cq.data)
│       ├── entrypoints/  # 接入层 (accessors/, python_api, cli, rest_api)
│       ├── config/       # 配置管理模块
│       ├── provider/     # 数据源驱动 (Baostock, EastMoney, TDX, StockDB)
│       ├── service/      # 核心业务逻辑 (DataReader, MetadataReader, SyncManager, Wizard 等)
│       ├── storage/      # 本地持久化存储 (CSVStorage, ParquetStorage)
│       └── utils/        # 通用工具箱
├── web/              # React Web 金融终端 (Bun + Vite 6 + React 19 + TradingView 3-Pane)
│   ├── src/          # 视图 View、组件 Component、Hooks 与转换服务
│   └── package.json
├── 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: cqdata)"]
        REST["rest_api.py<br/>(FastAPI REST)"]
    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"]
        SP["StockDBProvider"]
    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
    PM --> SP
    SF --> CSV
    SF --> PQ

📊 支持的数据表 (Supported Tables)

Table ID 类型 说明 数据源
ashare.kline.1d.adj.baostock TS A 股日线后复权 Baostock
ashare.kline.1d.raw.baostock TS A 股日线不复权 Baostock
ashare.kline.5m.adj.baostock TS A 股 5 分钟线后复权 Baostock
ashare.kline.5m.raw.baostock TS A 股 5 分钟线不复权 Baostock
aindex.kline.1d.raw.baostock TS A 股指数日线 Baostock
ashare.adj_factor.baostock EV A 股复权因子 Baostock
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 股日线 (通达信) TDX
ashare.kline.5m.raw.tdx TS A 股 5 分钟线 (通达信) TDX
ashare.kline.1m.raw.tdx TS A 股 1 分钟线 (通达信) TDX
aindex.kline.1d.raw.tdx TS 指数日线 (通达信) TDX
aindex.kline.5m.raw.tdx TS 指数 5 分钟线 (通达信) TDX
aindex.kline.1m.raw.tdx TS 指数 1 分钟线 (通达信) TDX
ashare.kline.1d.raw.stockdb TS A 股日线全截面多因子 StockDB (free-stockdb)
ashare.kline.1m.raw.stockdb TS A 股 1 分钟线 StockDB (free-stockdb)
ashare.adj_factor.stockdb EV A 股复权因子 StockDB (free-stockdb)
ashare.concept.stockdb EV 同花顺概念成分股 StockDB (free-stockdb)
ashare.industry.stockdb EV 申万行业成分股 StockDB (free-stockdb)
aetf.kline.1d.raw.stockdb TS 场内 ETF 日线 StockDB (free-stockdb)
aetf.kline.1m.raw.stockdb TS 场内 ETF 1 分钟线 StockDB (free-stockdb)
aetf.adj_factor.stockdb EV 场内 ETF 独立复权因子 StockDB (free-stockdb)

🛠️ 安装指南 (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)” 的配置契约,支持以下显式加载与覆盖方式(优先级从高到低):

  1. 代码程序化修改:直接设置单例属性 cq.data.settings.data_dir = "/path/to/data" 或调用 cq.data.configure("/path/to/config.yaml")(最高优先级)。
  2. 环境变量 CQDATA_DATA_DIR:如 export CQDATA_DATA_DIR="/my/data/path"(适合 Docker / CLI / 自动化部署)。
  3. 环境变量 CQDATA_CONFIG_PATH:指定自定义 YAML 配置文件路径,如 export CQDATA_CONFIG_PATH="/path/to/config.yaml"。
  4. 内置默认配置:默认存储路径 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)

🚀 快速开始 (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 便捷读取 (默认 raw 零开销直读,显式 adj='adj' 自动触发向量化动态后复权)
df_raw = cq.data.ashare.kline.get(symbols="sh.600000", start_date="2024-01-01")
df_adj = cq.data.ashare.kline.get(symbols="sh.600000", adj="adj", start_date="2024-01-01")

# 场内基金与 ETF 便捷读取 (支持 StockDB 1m 高频线与动态后复权)
etf_df = cq.data.aetf.kline.get(symbols="sz.159919", freq="1m", adj="raw", start_date="2025-01-02")
etf_adj = cq.data.aetf.kline.get(symbols="sz.159919", adj="adj")

# 2. 查阅可用数据源驱动、代码清单、时间跨度、Schema 映射与物理总行数
sources = cq.data.list_sources()                                    # ['baostock', 'eastmoney', 'tdx', 'stockdb']
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. 写入与导入外部自定义数据 (支持 Parquet / CSV,自动生成/更新元数据)
import polars as pl
df_custom = pl.DataFrame({
    "symbol": ["BTC.USDT", "ETH.USDT"],
    "date": ["2024-01-01", "2024-01-01"],
    "close": [42500.0, 2280.0]
})
cq.data.write(
    table_id="crypto.kline.1d.binance",
    df=df_custom,
    formats=["parquet", "csv"]
)

# 6. 代码中触发全自动数据同步
cq.data.sync(table_ids=["ashare.kline.1d.raw.baostock"], formats=["parquet"])

方式二:使用统一 CLI 命令行工具 (cqdata)

可在终端或 Cron 定时任务中直接调用 cqdata 交互:

# 查看系统支持的所有数据源及其数据表
cqdata sources

# 查看本地存储的所有数据表概览
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

# 导入外部 CSV 或 Parquet 文件到自定义数据表
cqdata import my_factors.csv --table custom.factors.momentum --formats parquet,csv

💡 通达信 (TDX) 最佳同步实践说明

通达信驱动支持 Local (离线 vipdoc 导包) 与 Online (在线 TCP 协议) 两种模式。两者的输出格式和字段完全对齐,落地在同一个 table_id 下,数据会自动无缝去重与合并。

  • Local 离线模式读取能力:原生支持解析本地 vipdoc 目录下的 日线 (.day)、5分钟线 (.lc5) 以及 1分钟线 (.lc1) 等所有离线二进制文件(包含通达信软件自行下载导出的分钟线文件)。
  • 极速初始化脚本 (cqdata tdx download):用于一键拉取并解压通达信官方服务器的全量日线行情包(hsjday.zip),实现数十年日线历史数据的秒级导入。
# 步骤 1: 极速初始化 - 下载并解压通达信官方全量日线行情包 (hsjday.zip)
cqdata tdx download
# (也可通过 --vipdoc 指定下载目标路径: cqdata tdx download --vipdoc C:\new_tdx\vipdoc)

# 步骤 2: 日常盘后增量 - 触发通达信在线按水位线追加最新数据 (支持 1d 日线 / 5m / 1m 分钟线)
cqdata sync -t ashare.kline.1d.raw.tdx

💡 StockDB 本地时序数据库同步实践说明

StockDB (free-stockdb) 是一款基于 LevelDB 高性能时序引擎的本地金融数据库,支持 A 股个股与退市股全量覆盖、场内 ETF 独立覆盖、1 分钟超高频行情与全截面基本面多因子。

  • 极速探针与连接:系统内嵌 stockdb.pyd 原生 C++ 客户端并具备 <50ms TCP 7899 端口状态探针,本地服务启动后即插即用;
  • A 股与 ETF 物理隔离:分别维护 ashare.* 与 aetf.* 独立命名空间与专属复权因子表。
# 同步 StockDB A 股日线全截面多因子与 1 分钟线
cqdata sync -t ashare.kline.1d.raw.stockdb,ashare.kline.1m.raw.stockdb

# 同步 StockDB 场内基金与 ETF 数据及独立复权因子
cqdata sync -t aetf.kline.1d.raw.stockdb,aetf.kline.1m.raw.stockdb,aetf.adj_factor.stockdb

# 同步 StockDB 同花顺概念与申万行业板块平铺表
cqdata sync -t ashare.concept.stockdb,ashare.industry.stockdb

命令行关键参数:

  • -t / --tables: 必填,要同步的表 ID,多表用逗号分隔。
  • -f / --formats: 选填,保存格式(默认 parquet,csv)。
  • -s / --start & -e / --end: 选填,时间范围,留空则是自动接续水位线增量同步。
  • --force: 选填,强制全量刷新覆盖。
  • --limit: 选填,限制同步代码数量(调试用)。
  • --log-dir: 选填,日志持久化存储目录(默认 logs)。
  • --log-level: 选填,日志输出级别(默认 INFO,可选 DEBUG/INFO/WARNING/ERROR)。

方式三:使用终端交互向导 (Wizard)

cqdata wizard

方式四:一键启动服务器与 Web 终端 (支持 --open / -o 自动打开浏览器)

# 启动后端 API 服务并自动调起系统浏览器打开 Web 终端
cqdata server --port 8888 --open

# (也可使用 -c 指定配置文件: cqdata server -p 8888 -c ./config.yaml -o)
# (支持 --log-dir 与 --log-level 指定日志落盘路径与日志级别)

启动后内置托管 React Web 终端并提供基于 FastAPI 的 RESTful HTTP 接口(全量端点汇总):

端点 方法 说明
/ GET 内置托管的 React Web 金融终端主界面
/api/v1/health GET 系统健康检查与服务运行状态探针 (含 data_dir, log_dir, log_level)
/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/sync/stream GET SSE (Server-Sent Events) 任务同步进度与状态实时主动推流通道
/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 文件。

Metadata

Release files for carrotquant-data 1.7.4

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for carrotquant-data 1.7.4
File Size Uploaded
carrotquant_data-1.7.4.tar.gz 263.4 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for carrotquant-data 1.7.4
File Interpreter ABI Platform
carrotquant_data-1.7.4-py3-none-any.whl Python 3 none any Details

Total release size: 552.8 kB

Release files / carrotquant_data-1.7.4.tar.gz

Download URL carrotquant_data-1.7.4.tar.gz
Size 263.4 kB
Tags Source
SHA-256 checksum
How to use checksums
c05615bb5becb38568ebcee3c5465d146b933e57d8741cda9211639466cbd67d
BLAKE2b-256 checksum
How to use checksums
dcfeda44c0103d912a9e1d69941e718d07984f0b676f6f57306ec57655e88a19
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 5, 2026.

Transparency log

Release files / carrotquant_data-1.7.4-py3-none-any.whl

Download URL carrotquant_data-1.7.4-py3-none-any.whl
Size 289.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
cfc2e85fdb425c29854e6ad953ac75c6aa5383df92f4ed20c27ea254d79d8104
BLAKE2b-256 checksum
How to use checksums
a1ae495b04c9047493cda218a782dd32978c8062b579f93cd9beb977f6ed9eab
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 5, 2026.

Transparency log

Release history Release notifications | RSS feed

1.8.0

2 release files

1.7.9

2 release files

1.7.8

2 release files

1.7.7

2 release files

1.7.6

2 release files

1.7.5

2 release files

This release

1.7.4 This release

2 release files

1.7.3

2 release files

1.7.2

2 release files

1.7.1

2 release files

1.7.0

2 release files

1.6.0

2 release files

1.5.0

2 release files

1.4.0

2 release files

1.3.1

2 release files

1.3.0

2 release files

1.2.3

2 release files

1.2.2

2 release files

1.2.1

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page