Quant Buffet API
概览
Quant Buffet 回测 API 是什么、沙箱免费提供了哪些对象,以及一次运行的完整流程。
Quant Buffet 策略运行在基于自研 backtest.* 包的 Python 沙箱 中。你只需编写日频调仓逻辑;平台负责加载价格、按佣金与滑点模拟成交、跟踪净值并计算绩效指标。同一份代码既能在每个策略页的浏览器 IDE 中运行,也能作为本地脚本运行。
一屏看完整个 API
| 模块 | 提供什么 | 你何时调用 |
|---|---|---|
backtest.data | load_daily_prices、load_price_panel | 很少 — 实验室会替你加载 ASSETS |
backtest.engine | PortfolioEngine、EngineConfig、Trade、BacktestResult | 每天通过 set_target_weights 调用 |
backtest.metrics | compute_metrics | 很少 — 实验室会替你计算指标 |
backtest.templates | 九个 make_* 工厂函数与 build_strategy | 想直接复用成熟模式时 |
backtest.universes | 命名 ETF 资产池与 WHITELIST | 选择 ASSETS 时 |
你需要写的部分
- 模块级 `ASSETS` — 白名单内的 ETF / 加密货币代码列表(1–15 个)。
- `make_on_day(prices)` — 基于价格面板构建信号,返回
(on_day, ready)。 - `on_day(engine, dt)` — 每个交易日调用一次;用
engine.set_target_weights()调仓。 - `ready` — 信号首次有效的日期,通常在你最长回看窗口之后。
python
# 1. Module-level ASSETS — the sandbox reads this before running anything
ASSETS = ["SPY", "BIL"]
# 2. Factory: precompute every indicator here, exactly once
def make_on_day(prices: pd.DataFrame):
# 3. Daily callback: cheap lookups only
def on_day(engine: PortfolioEngine, dt: pd.Timestamp) -> None:
engine.set_target_weights(dt, {"SPY": 1.0})
# 4. Warmup date: the backtest starts here
ready = prices.index[0]
# 5. Always return the pair, in this order
return on_day, ready沙箱免费提供的对象
以下名称已预先注入命名空间,因此实验室策略可以完全不写 import:
| 注入名称 | 绑定到 |
|---|---|
pd、pandas | pandas 模块 |
np、numpy | numpy 模块 |
math、json | 对应标准库模块 |
PortfolioEngine、EngineConfig | backtest.engine 中的类 |
load_daily_prices | backtest.data.load_daily_prices |
compute_metrics | backtest.metrics.compute_metrics |
执行流程
backtest/lab_sanitize.py剥离提交源码中的 CLI 引导片段(sys.path、__main__、文件头 docstring)。validate_source()用 `ast` 解析代码,拒绝被禁的 import、被禁的调用、async语法,以及超过 80 KB 的文件。- 源码在受限命名空间中被
exec,仅注入 安全 builtins 子集。 extract_assets()读取模块级ASSETS,逐个校验白名单、去重,并强制 15 个标的上限。load_daily_prices(ASSETS, start=…)加载复权收盘价(优先读缓存),随后丢弃全为 NaN 的行。make_on_day(prices)只执行一次,并且必须返回(on_day, ready)。PortfolioEngine.run(on_day, start=ready)遍历交易日:先调用on_day,再按当日收盘估值。- 构建 SPY 买入持有基准,运行
compute_metrics,并对净值曲线降采样用于绘图。
默认运行环境
| 设置 | 取值 |
|---|---|
| 初始资金 | 100,000 美元 |
| 佣金 | 每笔成交额 5 bps |
| 滑点 | 每个方向 2 bps |
| 方向 | 仅做多,无杠杆,不支持做空 |
| 频率 | 日频 K 线,复权收盘价 |
| 默认起始日 | 2000-01-01,或 IDE 中选择的日期 |
| 基准 | SPY 买入持有,若无则用 ASSETS[0] |
最小可运行策略
python
from __future__ import annotations
import numpy as np
import pandas as pd
from backtest.data import load_daily_prices
from backtest.engine import EngineConfig, PortfolioEngine
from backtest.metrics import compute_metrics
ASSETS = ["SPY", "QQQ", "TLT", "GLD", "BIL"]
def make_on_day(prices: pd.DataFrame):
cols = [c for c in ASSETS if c in prices.columns]
sma = prices[cols].rolling(200, min_periods=200).mean()
state = {"last": None}
def on_day(engine: PortfolioEngine, dt: pd.Timestamp) -> None:
if sma.loc[dt].isna().all():
return
key = (dt.year, dt.month)
if state["last"] == key:
return
state["last"] = key
long = [s for s in cols if prices.at[dt, s] > sma.at[dt, s]]
w = 1.0 / len(long) if long else 0.0
engine.set_target_weights(dt, {s: w for s in long})
ready = sma.dropna(how="all").index.min()
return on_day, ready文档导航
- 实验室契约 — 必需符号、函数签名、
ready语义与反模式。 - 语法手册 — 构建信号、排名、权重与调仓节奏所需的 pandas / numpy 惯用法。
- 数据 API —
load_daily_prices、缓存机制与面板约定。 - 引擎 API —
PortfolioEngine、权重归一化规则、成交算法与Trade。 - 指标 API —
compute_metrics的每个字段及其计算方式。 - 模板 — 九个
make_*工厂函数及其精确参数名。 - 资产池 — 全部 81 个白名单标的与命名资产池。
- 沙箱规则 — 允许的 import、可用的 builtins 与硬性上限。
- 实验室运行 API — 运行器的 JSON 契约与 HTTP 端点。
- 错误 — 你可能遇到的每种错误及其原因与修复。
- 示例 — 完整可运行的策略范式。