BagelQuant Data 是面向量化研究的本地数据湖框架。它以 Polars 作为 DataFrame 引擎,以 Parquet 作为标准分析存储格式,以 SQLite 保存可变的运行状态和元数据,并通过 DataLake.open(...) 暴露稳定的 Python API。

这个框架围绕两个核心思想设计:

  • 数据源适配器负责获取数据,但不决定核心数据湖架构。
  • 数据集行为由声明式规格定义,因此普通数据集的新增不应要求修改存储、查询、财务处理或管理模块。

文档导航

  • 架构:系统分层、存储区域、元数据、标准字段和 point-in-time 语义。
  • 配置:数据湖根目录、凭证、可选依赖和本地环境。
  • 管理 API:数据源注册、数据集注册、状态查询、检查和删除操作。
  • 提取 API:标准原始记录、单字段长面板、多字段、引用数据和观察网格。
  • 财务 API:point-in-time 对齐和通用可组合财务变换。
  • 增量更新:更新流程、暂存、标准提交、manifest 和 V1 限制。
  • Tushare 数据源:内置 Tushare 适配器、凭证、数据集规格和标准时间映射。
  • 新增数据源:如何实现新的数据源适配器。
  • 新增数据集:如何编写数据集 YAML 并选择策略。
  • 实施计划:设计目标和路线图说明。

第一个示例

import polars as pl

from bagelquant_data import DataLake, DatasetSpec

lake = DataLake.open("data")

spec = DatasetSpec(
    name="daily",
    source="custom",
    source_dataset="daily",
    category="market",
    field_mapping={"ts_code": "ts_code", "trade_date": "trade_date"},
    required_columns=("asset_id", "time"),
    primary_key=("asset_id", "time"),
    asset_column="ts_code",
    time_column="trade_date",
    partition_strategy="year_month",
    deduplication="primary_key_last",
    sort_columns=("time", "asset_id"),
)

lake.ingest_frame(
    spec,
    pl.DataFrame(
        {
            "trade_date": ["20250102", "20250103"],
            "ts_code": ["000001.SZ", "000001.SZ"],
            "open": [11.20, 11.31],
            "close": [11.25, 11.37],
        }
    ),
)

close = lake.query.field("daily", "close", source="custom", collect=True)
print(close)

输出是只有三列的长面板:

time        asset_id    close
2025-01-02  000001.SZ   11.25
2025-01-03  000001.SZ   11.37

设计边界

BagelQuant Data 不保留旧数据湖布局,也不兼容旧公开 API。当前框架是一次干净的新 API 和新存储设计。它也不提供 eps_ttm()roe_ttm() 这类硬编码财务指标,而是提供滚动聚合、比率、存量平均和 point-in-time 对齐等通用积木。

开发检查

uv run pytest
uv run pyright