Quant Buffet API

概览

Quant Buffet 回测 API 是什么、沙箱免费提供了哪些对象,以及一次运行的完整流程。

Quant Buffet 策略运行在基于自研 backtest.* 包的 Python 沙箱 中。你只需编写日频调仓逻辑;平台负责加载价格、按佣金与滑点模拟成交、跟踪净值并计算绩效指标。同一份代码既能在每个策略页的浏览器 IDE 中运行,也能作为本地脚本运行。

一屏看完整个 API

模块提供什么你何时调用
backtest.dataload_daily_pricesload_price_panel很少 — 实验室会替你加载 ASSETS
backtest.enginePortfolioEngineEngineConfigTradeBacktestResult每天通过 set_target_weights 调用
backtest.metricscompute_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:

注入名称绑定到
pdpandaspandas 模块
npnumpynumpy 模块
mathjson对应标准库模块
PortfolioEngineEngineConfigbacktest.engine 中的类
load_daily_pricesbacktest.data.load_daily_prices
compute_metricsbacktest.metrics.compute_metrics

执行流程

  1. backtest/lab_sanitize.py 剥离提交源码中的 CLI 引导片段(sys.path__main__、文件头 docstring)。
  2. validate_source()`ast` 解析代码,拒绝被禁的 import、被禁的调用、async 语法,以及超过 80 KB 的文件。
  3. 源码在受限命名空间中被 exec,仅注入 安全 builtins 子集。
  4. extract_assets() 读取模块级 ASSETS,逐个校验白名单、去重,并强制 15 个标的上限。
  5. load_daily_prices(ASSETS, start=…) 加载复权收盘价(优先读缓存),随后丢弃全为 NaN 的行。
  6. make_on_day(prices) 只执行一次,并且必须返回 (on_day, ready)
  7. PortfolioEngine.run(on_day, start=ready) 遍历交易日:先调用 on_day,再按当日收盘估值。
  8. 构建 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 惯用法。
  • 数据 APIload_daily_prices、缓存机制与面板约定。
  • 引擎 APIPortfolioEngine、权重归一化规则、成交算法与 Trade
  • 指标 APIcompute_metrics 的每个字段及其计算方式。
  • 模板 — 九个 make_* 工厂函数及其精确参数名。
  • 资产池 — 全部 81 个白名单标的与命名资产池。
  • 沙箱规则 — 允许的 import、可用的 builtins 与硬性上限。
  • 实验室运行 API — 运行器的 JSON 契约与 HTTP 端点。
  • 错误 — 你可能遇到的每种错误及其原因与修复。
  • 示例 — 完整可运行的策略范式。