IDE 会给出错误类型、错误信息,通常还有行号。本页把每一种映射到它的真实原因。Ask AI for syntax 按钮能为下列任何情况生成可直接粘贴的修复代码。
错误类型
| 类型 | 抛出位置 | 典型原因 |
|---|
SyntaxError | AST 解析 | 无效 Python。包含行号与列号。 |
ContractError | 契约检查 | make_on_day 缺失或不可调用。 |
ValueError | 校验与运行阶段 | 被禁 import、非白名单标的、ASSETS 为空、超过 15 个标的、源码过大、async 语法、信号从未就绪、历史过短。 |
ImportError | 受限的 __import__ | 运行时触达了被禁模块。 |
RuntimeError | load_daily_prices | 没有任何标的加载到价格数据。 |
TypeError、KeyError、NameError 等 | 你的代码 | 普通 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-sequence | make_on_day 只返回了 on_day | 改为 return on_day, ready |
| *Signal never ready — check lookbacks / ASSETS history.* | ready 为 None 或 NaT | 缩短回看窗口,或移除历史过短的标的 |
| *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() |
ZeroDivisionError | picks 为空时仍除以 len(picks) | 加上 if not picks: return |
ValueError: cannot convert float NaN to integer | 对 NaN 指标调用 int() | 先检查 pd.notna(x) |
| 运行始终不结束 | 在 on_day 内部重复计算指标 | 把计算移入 make_on_day |
一套有效的调试顺序
- 阅读行号栏中的行号 —— 它指向你的源码,而非 pandas 内部。
- 确认契约:模块级
ASSETS,且 make_on_day 返回 (on_day, ready)。 - 点击 Ask AI for syntax 获取解释与补丁。
- 把问题缩小:
ASSETS 只留两个标的、start 设得更晚,可以迅速隔离数据问题。 print() 可用且输出会进入运行日志 —— 信号可疑时,打印 ready 与某一天的 dt 数据行。- 对照「示例」页 —— 多数 bug 都是对其中某个范式的偏离。