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| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
symbols | list[str] | — | 要加载的标的,例如 ["SPY", "TLT"]。 |
start | str | "2000-01-01" | 含起始日的 ISO 日期。 |
end | str | None | None | 可选结束日;None 表示至最新可得。 |
use_cache | bool(仅关键字) | True | 读写 CSV 缓存。 |
strict | bool(仅关键字) | False | 为 True 时首个标的失败即抛异常,而非跳过。 |
返回值
- 一个 `pd.DataFrame`,索引为已排序、不带时区的 `DatetimeIndex`。
- 每个成功加载的标的一列浮点值 —— 失败的标的直接缺列(除非
strict=True)。 - 每列独立前向填充,因此该标的的空缺被补齐,而其 IPO 之前的历史仍为
NaN。 - 当部分标的失败时,原因会附加到 `prices.attrs["load_errors"]`。
- 若没有任何标的加载成功,会抛出
RuntimeError并列出前几条错误。
磁盘缓存
| 方面 | 行为 |
|---|---|
| 位置 | backtest/data_cache/ |
| 文件名 | {SYMBOL}_{start}_{end or 'latest'}.csv |
| 列 | Date、AdjClose |
| 复用条件 | 文件存在且大于 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 会对标的列表去重、始终以非严格模式运行,并显式返回缺失标的。适合用在「希望报告缺口而不是直接崩溃」的脚本中。
可以放心依赖的面板约定
| 保证 | 对你代码的意义 |
|---|---|
| 索引升序排列 | rolling 与 shift 行为符合预期 |
| 索引不带时区 | 比较时无需 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}
# 当回测起始日远晚于预期时,先检查这个字典