数据
数据层目前分成两层:
- 接口层:
zelqor.data.interfaces - 具体实现:
zelqor.data.clickhouse
也就是说:
interfaces.py负责定义稳定的 provider 协议clickhouse.py负责真正读取 ClickHouse 数据
当前已经固定了两类返回结果:
ProviderFrameBarsdict[str, pandas.DataFrame]ProviderNumpyBarsdict[str, BarSeries]
另外,全市场批量查询接口会直接返回整张表格式结果:
get_market_bars(...)- 默认返回
polars.DataFrame - 可切换为
pandas.DataFrame get_market_daily_bars(...)- 默认返回
polars.DataFrame - 可切换为
pandas.DataFrame
并提供了这些辅助函数:
is_frame_barsis_numpy_barsrequire_frame_barsrequire_numpy_bars
当前 ClickHouseProvider 还会在关键节点输出日志,包括:
- provider 初始化
- 交易日查询
- universe 查询
get_bars(...)get_daily_bars(...)
日志级别由:
ZELQOR_LOG_LEVEL
控制。
其中 get_trading_dates(...) 现在会先检查 stock_day 的最大可用日期,再用这个日期截断你传入的 end_date。
因此返回的交易日列表不会超出当前实际可用的日线数据范围。
如果你只是想取股票日线数据,当前推荐直接使用 ClickHouseProvider:
from zelqor.models import ClickHouseConfig
from zelqor.data.clickhouse import ClickHouseProvider
config = ClickHouseConfig.from_file("config.toml")
provider = ClickHouseProvider(config)
bars = provider.get_daily_bars(
codes=["000001.SZ"],
start_date="2025-03-01",
end_date="2025-03-25",
as_numpy=False,
)
frame = bars["000001"]
如果你要取“截至某天最近 N 根日线”:
bars = provider.get_bars(
codes=["sh600000"],
end_date="2025-03-25",
count=20,
as_numpy=True,
)
series = bars["600000"]
如果你要先把某个交易日的全市场日线整体拉回本地,再做批量筛选:
market_frame = provider.get_market_bars(
trade_date="2025-03-25",
as_polars=True,
)
如果你要拉取某个区间的全市场日线:
market_frame = provider.get_market_daily_bars(
start_date="2025-03-24",
end_date="2025-03-28",
as_polars=True,
)
Provider 接口
zelqor.data.interfaces
MarketFrame = MarketPolarsFrame | MarketPandasFrame
module-attribute
全市场批量查询可能返回的表格结果。
MarketPandasFrame = pd.DataFrame
module-attribute
全市场批量查询返回的 pandas.DataFrame。
MarketPolarsFrame = pl.DataFrame
module-attribute
全市场批量查询返回的 polars.DataFrame。
ProviderBars = ProviderFrameBars | ProviderNumpyBars
module-attribute
provider 可能返回的 bars 结果联合类型。
ProviderFrameBars = dict[str, pd.DataFrame]
module-attribute
按股票代码分组的 pandas.DataFrame 结果。
ProviderNumpyBars = dict[str, BarSeries]
module-attribute
按股票代码分组的结构化 NumPy 结果。
MarketDataProvider
Bases: Protocol
统一的行情数据 provider 协议。
get_bars(codes, end_date, count, *, as_numpy=False)
get_bars(codes: list[str], end_date: str, count: int, *, as_numpy: Literal[False] = False) -> ProviderFrameBars
get_bars(codes: list[str], end_date: str, count: int, *, as_numpy: Literal[True]) -> ProviderNumpyBars
返回截至 end_date 的最近 count 根日线。
get_daily_bars(codes, start_date, end_date, *, as_numpy=True)
get_daily_bars(codes: list[str], start_date: str, end_date: str, *, as_numpy: Literal[False]) -> ProviderFrameBars
get_daily_bars(codes: list[str], start_date: str, end_date: str, *, as_numpy: Literal[True] = True) -> ProviderNumpyBars
返回指定区间内的全部日线。
get_market_bars(trade_date, *, as_polars=True)
get_market_bars(trade_date: str, *, as_polars: Literal[True] = True) -> MarketPolarsFrame
get_market_bars(trade_date: str, *, as_polars: Literal[False]) -> MarketPandasFrame
返回指定交易日的全市场日线。
get_market_daily_bars(start_date, end_date, *, as_polars=True)
get_market_daily_bars(start_date: str, end_date: str, *, as_polars: Literal[True] = True) -> MarketPolarsFrame
get_market_daily_bars(start_date: str, end_date: str, *, as_polars: Literal[False]) -> MarketPandasFrame
返回指定区间内的全市场日线。
get_next_trading_date(trade_date, offset=1)
返回给定交易日之后的第 offset 个交易日。
get_trading_dates(start_date, end_date)
返回指定区间内的交易日列表。
get_universe(trade_date)
返回指定交易日可用的股票 universe。
is_frame_bars(value)
判断 provider 结果是否为 pandas.DataFrame 形式。
is_numpy_bars(value)
判断 provider 结果是否为 BarSeries 形式。
require_frame_bars(value)
将 provider 结果收窄为 pandas.DataFrame 形式。
require_numpy_bars(value)
将 provider 结果收窄为 BarSeries 形式。
ClickHouse Provider
zelqor.data.clickhouse
ClickHouseProvider
基于 ClickHouse 的历史行情读取实现。