Quant Buffet API

数据 API

load_daily_prices、load_price_panel、磁盘缓存与价格面板约定。

市场数据位于 `backtest.data`。实验室使用来自 Yahoo Finance 的日频复权收盘价auto_adjust=True),并以 CSV 缓存在 backtest/data_cache/,使重复运行既快速又可复现。

load_daily_prices

python
prices = load_daily_prices(
    ["SPY", "TLT", "GLD"],   # symbols: list[str]
    "2010-01-01",            # start: str = "2000-01-01"
    None,                    # end: str | None = None
    use_cache=True,          # keyword-only: read/write backtest/data_cache/
    strict=False,            # keyword-only: raise on first failure
)
# -> pd.DataFrame, DatetimeIndex rows, one float column per loaded ticker
参数类型默认值说明
symbolslist[str]要加载的标的,例如 ["SPY", "TLT"]
startstr"2000-01-01"含起始日的 ISO 日期。
endstr | NoneNone可选结束日;None 表示至最新可得。
use_cachebool(仅关键字)True读写 CSV 缓存。
strictbool(仅关键字)FalseTrue 时首个标的失败即抛异常,而非跳过。

返回值

  • 一个 `pd.DataFrame`,索引为已排序、不带时区的 `DatetimeIndex`
  • 每个成功加载的标的一列浮点值 —— 失败的标的直接缺列(除非 strict=True)。
  • 每列独立前向填充,因此该标的的空缺被补齐,而其 IPO 之前的历史仍为 NaN
  • 当部分标的失败时,原因会附加到 `prices.attrs["load_errors"]`
  • 没有任何标的加载成功,会抛出 RuntimeError 并列出前几条错误。

磁盘缓存

方面行为
位置backtest/data_cache/
文件名{SYMBOL}_{start}_{end or 'latest'}.csv
DateAdjClose
复用条件文件存在且大于 50 字节
缓存键注意点不同的 start 会生成不同文件 —— 并触发重新下载

load_price_panel

python
from backtest.data import load_price_panel

prices, missing = load_price_panel(["SPY", "TLT", "XYZ"], start="2010-01-01")
# prices:  已成功加载部分的 pd.DataFrame
# missing: ["XYZ"] — 无数据的标的

load_price_panel 会对标的列表去重、始终以非严格模式运行,并显式返回缺失标的。适合用在「希望报告缺口而不是直接崩溃」的脚本中。

可以放心依赖的面板约定

保证对你代码的意义
索引升序排列rollingshift 行为符合预期
索引不带时区比较时无需 tz_localize
列顺序遵循 ASSETS但若某标的失败,列数可能更少
值为复权收盘价拆股与分红已处理完毕
全 NaN 行已被运行器丢弃面板首行至少有一个真实价格
python
# 每个策略都值得写上的防御性开头
cols = [c for c in ASSETS if c in prices.columns]
if not cols:
    raise ValueError("No ASSETS loaded")

first_valid = {s: prices[s].first_valid_index() for s in cols}
# 当回测起始日远晚于预期时,先检查这个字典