Quant Buffet API

错误与排查

沙箱可能返回的每种错误、真实原因与修复方法。

IDE 会给出错误类型、错误信息,通常还有行号。本页把每一种映射到它的真实原因。Ask AI for syntax 按钮能为下列任何情况生成可直接粘贴的修复代码。

错误类型

类型抛出位置典型原因
SyntaxErrorAST 解析无效 Python。包含行号与列号。
ContractError契约检查make_on_day 缺失或不可调用。
ValueError校验与运行阶段被禁 import、非白名单标的、ASSETS 为空、超过 15 个标的、源码过大、async 语法、信号从未就绪、历史过短。
ImportError受限的 __import__运行时触达了被禁模块。
RuntimeErrorload_daily_prices没有任何标的加载到价格数据。
TypeErrorKeyErrorNameError你的代码普通 Python bug,会附带你的行号。
BadPayload运行器入口stdin 上的 JSON 格式错误(仅在直接脚本化调用时出现)。

契约类失败

错误信息原因修复
*Define ASSETS = ['SPY', ...] at module level…*ASSETS 缺失,或被嵌在函数内部把它移到文件顶层
*Missing make_on_day(prices)…*函数不存在、拼写错误,或被变量遮蔽在模块级定义 def make_on_day(prices):
TypeError: cannot unpack non-sequencemake_on_day 只返回了 on_day改为 return on_day, ready
*Signal never ready — check lookbacks / ASSETS history.*readyNoneNaT缩短回看窗口,或移除历史过短的标的
*Equity curve too short — strategy may never trade.*估值日不足 20 天检查 on_day 是否真的执行到 set_target_weights

数据与资产池类失败

错误信息原因修复
*Symbol 'X' is not in the Quant Buffet whitelist.*个股,或不受支持的 ETF(如 UUP替换为「资产池」页中的白名单代理
*Too many symbols (max 15).*去重后 ASSETS 仍过长对资产池切片,例如 COUNTRY_DM[:12]
*ASSETS is empty after validation.*空列表,或只有空字符串至少提供一个有效标的
*Not enough price history for the selected assets/start date.*加载后不足 30 行start 提前,或移除最新的标的
*No price data loaded. Errors: …*所有标的均下载失败检查网络;改用 data_cache/ 中已有的标的

沙箱限制类失败

错误信息修复
*Import blocked: 'os'…*删除它 —— 文件与进程访问按设计不可用
*Import blocked: 'from scipy'…*改用 numpy / pandas 表达,它们已覆盖多数需求
*Call to 'open()' is not allowed in the sandbox.*不支持文件 I/O;把参数写成模块常量
*Async code is not supported in the sandbox.*改写为同步代码
*Code too long (max 80KB).*精简注释与无用代码,或改为委托给模板
NameError: name 'any' is not defined改用 series.any() —— any / all 未被注入

你自己代码中的运行时 bug

错误常见原因修复
KeyError: Timestamp(...)索引的序列在 dt 这一行不存在series.reindex(prices.index).ffill(),或先判断 dt in series.index
KeyError: 'XLC'假定每个 ASSETS 项都变成了列cols = [c for c in ASSETS if c in prices.columns]
*truth value of a Series is ambiguous*在 pandas 对象上使用 and / or / if改用逐元素运算符配合 .any() / .all()
ZeroDivisionErrorpicks 为空时仍除以 len(picks)加上 if not picks: return
ValueError: cannot convert float NaN to integer对 NaN 指标调用 int()先检查 pd.notna(x)
运行始终不结束on_day 内部重复计算指标把计算移入 make_on_day

一套有效的调试顺序

  1. 阅读行号栏中的行号 —— 它指向你的源码,而非 pandas 内部。
  2. 确认契约:模块级 ASSETS,且 make_on_day 返回 (on_day, ready)
  3. 点击 Ask AI for syntax 获取解释与补丁。
  4. 把问题缩小:ASSETS 只留两个标的、start 设得更晚,可以迅速隔离数据问题。
  5. print() 可用且输出会进入运行日志 —— 信号可疑时,打印 ready 与某一天的 dt 数据行。
  6. 对照「示例」页 —— 多数 bug 都是对其中某个范式的偏离。