跳转至

Recipe:DuckDB 与 Polars

同一份 Parquet 湖可以按三种方式消费:load() 负责带语义的研究查询,DuckDB 负责跨数据集 SQL,Polars scan() 负责 LazyFrame 管道。选择入口,不要复制一份“调整后数据湖”。

DuckDB:跨数据集聚合

cne query --config configs/cnequity.toml --sql "
  SELECT symbol, max(trade_date) AS last_date, avg(adj_close) AS avg_hfq_close
  FROM daily_bars_adj
  WHERE trade_date >= DATE '2024-01-01'
    AND adj_is_exact
  GROUP BY symbol
  ORDER BY avg_hfq_close DESC
  LIMIT 20
"

daily_bars_adj 是只读视图,带 adj_*adj_is_exactcne query 只接受单条 SELECT,适合把 SQL 交给脚本或 MCP agent。

Polars:LazyFrame 特征管道

import polars as pl

from cnequity.query import scan

bars = (
    scan(
        "daily_bars",
        start="2024-01-01",
        adjust="hfq",
        strict_adj=True,
    )
    .filter(pl.col("symbol").is_in(["600519.SH", "000001.SZ"]))
    .sort(["symbol", "trade_date"])
    .with_columns(
        pl.col("adj_close").pct_change().over("symbol").alias("daily_return")
    )
)

features = bars.select(
    ["symbol", "trade_date", "adj_close", "daily_return"]
).collect()

大窗口优先保留 LazyFrame,利用 Hive 日期分区裁剪。strict_adj=True 会在因子覆盖不完整时失败,避免特征管道悄悄混入未复权价格。

连接到 AI agent

cne mcp --config /abs/path/to/cnequity.toml

MCP 服务只读,返回值会声明 origin、截断状态、复权与 PIT 口径;采集和维护仍由 cne CLI 执行。其它 MCP 客户端可复用同一条 command / args 配置,完整工具契约见 MCP 参考