报错排查

EigenLedger 报错排查:先看报错原文属于哪一类

这个项目的报错有个共同特点:报错信息往往指向下游库,而不是问题本身。取不到数据会报 IndexError,pandas 过新会报频率非法,优化失败会报 PyPortfolioOpt 的错误。

本页按「报错原文 → 根因 → 处理」组织,内容来自仓库 issue 记录与本站隔离环境实测,每条都给出可核对的线索。

报错原文
判断层级
最小复现
依赖 / 数据 / 参数
逐层排除
记录环境
示意图:排查的三个层级。先判断是依赖、数据还是参数问题,再动手改。
EigenLedger · 速查

拿着 EigenLedger 报错原文怎么对号入座?

左列是你在终端里看到的文字(实测原文或 issue 原文),右列是处理方向。

报错原文(节选)所属层级根因处理方向
error: invalid command 'bdist_wheel'依赖 / 安装构建 fpdf 源码包时缺少 wheelpip install wheel 再装
ModuleNotFoundError: No module named 'pytz'依赖 / 导入yfinance 0.1.96 需要 pytz,依赖清单未声明pip install pytz
IndexError: single positional indexer is out-of-bounds数据 / 取数行情返回空表,源码未做空表保护先验证该代码能否取到数据
ValueError: attempt to get argmax of an empty sequence数据 / 取数基准收益为空(较新版 pandas 上的表现)确认基准能联网取到
ValueError: Invalid frequency: A依赖 / 版本QuantStats 0.0.62 用了 pandas 已移除的频率别名降低 pandas 版本,或改用无绘图路径
ValueError: at least one of the assets must have an expected return exceeding the risk-free rate数据 / 优化优化器拿到的价格数据为空或全为常数先解决取数,再谈优化
KeyError: 'Not an accepted rebalancing schedule'参数rebalance 字符串不在允许列表内改用表内 14 个写法之一
KeyError: 'Date Range does not encompass rebalancing interval'参数区间不足一个完整周期拉长区间或缩短周期
KeyError: "the rebalance dates and start date doesn't match"参数自定义日期表首列不等于 start_date让首列等于起点
AssertionError: Expected return method: ... not supported yet!参数expected_returns 传了白名单外的值只填三个允许的方法名
AssertionError: Risk model: ... not supported yet!参数risk_model 传了白名单外的值只填八个允许的方法名
ValueError: Weights and stocks lists must have the same length.参数权重数量与标的数量不一致逐项核对数量与顺序

最后三条是源码里显式写的校验信息,看到它们说明参数确实不合法,按提示改即可;而前面几条要么指向下游库、要么指向网络,属于「报错文字与根因不在同一层」的情况。

EigenLedger · 安装与导入

EigenLedger 装不上、import 不了怎么按顺序排除?

这一层的排查成本最低,也最容易被误判成「项目坏了」。

现象排查顺序判断依据出处 / 备注
pip 安装直接失败看报错里出现的是哪个包名报错包名就是缺构建工具的包本站实测:fpdf 1.7.2
提示无法构建 wheel(PEP 517)确认是否需要编译依赖社区历史记录中含 scs 构建失败issue #24 / #25
import 时报缺模块按报错里的模块名逐个补装常见是传递依赖未声明本站实测:pytz
Windows 安装报编译错误确认 C++ 构建工具是否已装官方 README 明确要求官方 README
Mac M1 安装失败换用 conda 或原生 ARM 解释器社区报告过该平台问题issue #76
Python 3.12 安装异常降到 3.10 / 3.11 重试社区报告版本探测组件失效issue #120
安装报错但信息很少-v 重跑,或先单独装报错里的包可定位到具体构建环节通用做法
一个判断技巧:如果报错里出现了另一个库的名字,先怀疑是那个库的版本或构建问题,而不是 EigenLedger 本身。本项目大量逻辑是封装,报错层级天然偏下游。
EigenLedger · 取数与数据

能导入 EigenLedger 但跑不出结果,问题在哪?

取不到数据时,报错不会说「网络问题」,而是抛出一个看起来像代码 bug 的异常。

现象源码行为怎么确认处理方向
首只标的下不到数据空价格表直接进入 assets.iloc[0]单独下载该代码并打印行数换代码、换后缀或改用本地数据
提示某只标的初始状态不可用首日价格为 NaN 即抛错检查价格表首行是否有空值把区间起点后移到数据齐全日
基准相关指标全是 NaN基准收益为空,回归无法进行单独下载基准代码验证换成可取的基准,或先解决可达性
提示数据源读取失败历史版本曾依赖 pandas_datareader确认当前版本依赖链升级用法,改用当前的数据获取方式
行情接口返回空数据旧版 yfinance 与上游接口不匹配与社区现象对照注意:项目把 yfinance 钉在 <0.2,升级前需评估兼容性
饼图里出现未上市标的缺失价格被填充为 1 后仍参与计算核对标的上市日期与区间调整区间或剔除该标的

本机实测结论:yf.download 返回 0 行时不抛异常,问题要到后续计算才暴露。因此「先单独下载一只标的、打印行数与首末日期」是这一步最有效的动作。相关社区记录见 issue #29、#131、#43。

EigenLedger · 版本冲突

EigenLedger 跑一半崩掉,为什么多半是依赖版本?

这个项目的依赖范围很窄,和「更新派」环境天然冲突。

报错 / 现象冲突双方为什么处理方向
Invalid frequency: AQuantStats 0.0.62 × pandas ≥2.2旧的年度频率别名已被移除降低 pandas 版本;或避免触发该绘图
monthly_heatmap() missing 1 required positional argument: 'benchmark'QuantStats 版本 × 调用方式函数签名变化导致参数不匹配锁定 0.0.62 并避免混装其它版本
volatility() got an unexpected keyword argument 'trading_year_days'QuantStats 新旧接口参数在新版中被移除按锁定版本对应的调用方式使用
TypeError: float() argument must be ... not 'DataFrame'pandas 返回类型变化单标的下载可能返回 DataFrame 而非 Series先在代码里统一类型再计算
字符串与时间戳比较报错日期类型不统一区间参数与数据索引类型不一致统一成 YYYY-MM-DD 字符串
绘图后端报非法值matplotlib 环境变量变量值带了多余空格在代码里设置,不要手拼命令行字符串
numpy 相关 ABI 报错numpy <2 约束 × 其它库要求 numpy≥2二进制接口不兼容为它单独建环境
上面这些冲突的共同修法是隔离环境 + 锁定版本,而不是逐个打补丁。把 EigenLedger 装进独立虚拟环境,是最省时间的做法。
EigenLedger · 参数与逻辑

参数写对了,EigenLedger 结果为什么仍不合预期?

这一层没有报错,只有「结果不对」,最难排查。

现象可能原因验证方式处理方向
手填权重没生效同时设了优化器,权重被覆盖打印 pf.weights 看实际值二者只留一个,或在报告里注明来源
单只标的组合报错单标的走单独分支,行为与多标的不同用两只标的复现对比研究场景尽量避免单标的组合
指定 rebalance 后无法运行周期名、区间长度或日期表起点不合规对照三条例外信息逐项检查见「再平衡机制」页的报错清单
优化器字符串写错但不报错不在允许列表的值会被当作自定义优化器,构造期不校验打印权重看是否等权只使用四个大写关键字,或传真正的函数
再次分析同一对象结果不同零权重标的会被就地删除,引擎对象被修改打印 pf.portfolio 是否变短复用前先深拷贝
结果每次都变未写死 end_date,区间随当天生长打印起止日期显式固定两端日期
回测结束日期早于预期启用了 risk_manager,序列被提前截断对比设置前后的结束日期分清「触发风控」与「数据缺失」
社区 issue 中与再平衡相关的记录较多(#65、#70、#71、#78、#118),说明这一块的边界情形比文档描述的更多。遇到再平衡相关异常时,建议先退回到「不写 rebalance」确认基础链路是否正常。
EigenLedger · 提 issue 前

给 EigenLedger 维护者的最小复现应该包含什么?

项目处于低频维护状态,信息完整的 issue 更容易得到回应。

  1. 一条最小代码

    只保留能复现问题的最少行数,去掉无关的自定义逻辑。

  2. 完整报错堆栈

    包括最底层的异常类型与消息,不要只截最后一行。

  3. 环境版本

    Python 版本 + pip freeze 中相关包的版本。

  4. 数据与区间

    标的代码、起止日期、是否使用本地数据。

  5. 使用的参数

    optimizer、rebalance、benchmark、weights 的完整取值。

  6. 已尝试的做法

    说明你排查过的步骤,避免重复建议。

排查需求EigenLedger 路线本机技能路线建议
本机依赖问题定位需自己读堆栈与版本可把报错贴进对话让技能协助判断不确定方向时先问技能
数据是否可取需自己写下载脚本验证可由取数类技能直接验证验证数据用技能更快
参数是否合规可对照源码断言信息可对照本站整理的白名单两者结论一致
结果是否符合预期需自己做区间与口径复核可要求技能做交叉计算重要结论建议双向核对
判断报错属于依赖还是参数可对照本站四层排查表可把报错贴进对话一起判断两个方向的结论可以互相印证
复现同一故障给他人需提供最小代码与环境版本需提供对话上下文报 issue 优先用脚本路线的最小复现

披露:本机技能目录已核验(29 个技能),EigenLedger 与 EasyClaw 无已证实集成;上表为排查场景的分工建议,不代表二者能互相调用。

FAQ

关于报错排查的常见问题

报错里全是别的库的名字,怎么判断责任方?

按「谁抛出、谁缺依赖」判断:报错栈最底层的包是抛出方,但根因往往在上一层的调用参数或数据。经验做法是先把报错栈里涉及的包版本贴出来,再对照本站的版本冲突表;本项目把若干依赖钉在旧版本,冲突概率高于一般库,以官方实现为准。

所有问题都能靠降版本解决吗?

不能。降版本只对「依赖版本冲突」这一类有效;取数失败、数据首日为空、周期名写错这些问题降版本无效。先用「报错原文速查表」判断层级,再决定是否动版本,否则容易把环境改乱还找不到原因。

为什么取不到数据却不报「网络错误」?

因为数据层把「下载失败」与「下载成功但没有数据」都表现为空表,之后的计算才抛异常。本站实测中表现为 IndexError(新版 pandas)或 attempt to get argmax of an empty sequence(较旧 pandas)。因此看到这两类报错时,第一反应应该是「数据到手了吗」,而不是「算法错了吗」。

能靠升级 yfinance 修好取数吗?

不能直接升。发布包的约束是 yfinance <0.2,且新版 yfinance 默认不再返回名为 Adj Close 的列,源码里多处直接按该列名取值,升级会导致 KeyError 类问题。这对使用者意味着:在项目发新版之前,取数问题更现实的解法是换数据源并通过本地数据接入。

报错信息里出现「没有接受的再平衡调度」是什么意思?

这是源码里的固定提示,对应 Not an accepted rebalancing schedule,表示传入的周期字符串不在允许的 14 个写法内。它和「区间太短」「日期表起点不对」是三种不同的再平衡异常,三种的原始提示语都可以在本站再平衡页核对,以官方实现为准。

环境已经被改乱了怎么办?

删掉虚拟环境重建是最省时间的做法:这个项目的依赖组合(numpy<2、yfinance<0.2、ipython<8、quantstats 0.0.62)与常见新环境差异较大,逐个修依赖不如重建。重建时按本站安装页给出的顺序执行即可。

这些问题未来会修吗?

取决于项目是否继续发布新版本。当前 PyPI 最新版为 2024-10-28 发布的 2.1.6,仓库主分支在 2025-09 后仍有提交(含基准处理与 pandas 兼容改动),但两者源码已不一致,且 2026 年提交的社区 PR 未见合并。因此判断依据应以官方仓库的提交与发布记录为准,本文结论只代表 2026-09 的实测状态。

排查通了,回到审计清单确认结论站得住

报错解决只是第一步,交付前还要过一遍区间敏感性、集中度与成本声明这八项检查。