报告解剖

EigenLedger 报告里到底有什么:17 项指标、8 张图与 PDF 输出

调一次 portfolio_analysis(),你拿到的不是一张图,而是一组字段和一批图片文件。本页把「报告里有什么」拆成可核对的三部分:指标表、图表、结果对象。

所有指标名与口径都按源码逐条核对,并标注哪些数字在什么前提下才有意义。

收益序列
17 项指标
结果对象
8 张图
PNG 落盘
PDF 归档
示意图:报告的三层产出(指标表 / 图表 / 结果对象)。本页不含真实收益截图。
EigenLedger · 指标表

EigenLedger 报告里的 17 项指标分别是什么?

表格顺序与源码中的 data 字典完全一致,指标名就是你运行时看到的英文标签。

指标(报告中的标签)计算口径适用场景注意点
Annual return按日频复合年化(CAGR)横向比较不同组合的收益水平区间短于三年时年化极不稳定
Cumulative return区间累计收益回答「这一段时间赚了多少」必须与起止日期同时给出
Annual volatility日收益标准差 × 年化因子衡量组合抖动幅度与优化器的 max_vol 是两套口径
Winning day ratio上涨日数 ÷ 总天数直观感受胜率高胜率可与负收益并存
Sharpe ratio超额收益 ÷ 波动,rf 默认 0风险调整后绩效对比rf=0 会系统性抬高数值
Calmar ratio年化收益 ÷ 最大回撤关注「赚的钱够不够抵回撤」回撤极小时该值会异常大
Information ratio超额收益 ÷ 跟踪误差(对基准)评估相对基准的稳定性强依赖基准选择,基准错了它就没意义
Stability收益序列回归拟合的 R²看收益曲线是否「平滑向上」对极端值敏感,不能单独作为结论
Max Drawdown历史最大回撤幅度衡量最坏持有体验只给幅度,不给修复时间
Sortino ratio超额收益 ÷ 下行波动更关注亏损波动的场景与夏普口径不同,不能直接比大小
Skew收益分布偏度识别收益是否偏向单侧样本少时噪声大
Kurtosis收益分布峰度识别肥尾与极端行情暴露常与偏度一起读,不要单独判断
Tail Ratio右尾分位 ÷ 左尾分位粗略衡量盈亏不对称性受尾部个别样本影响明显
Common sense ratio尾部比率与盈亏比的组合口径综合看尾部风险收益比不是通用指标,跨平台比较前先对齐定义
Daily value at risk默认 sigma=1, confidence=0.95估日常极端亏损量级报告里必须注明置信度与参数
Alpha对基准回归的截距项判断收益是否来自选股能力基准不同结论可能相反
Beta对基准回归的斜率项衡量组合对市场的敏感度Beta≈1 说明组合基本跟随市场

报告不含交易次数、胜率(按交易计)、盈亏比、换手率、持仓集中度、分年度收益明细表。要做策略层面的评估,这些指标得另外补。

EigenLedger · 图表

EigenLedger 一次分析会画出哪几张图?

同一份数据,report 参数不同,出图清单也不同——这点源码里写得很清楚。

图表默认模式(report=False)PDF 模式(report=True)看图时要注意什么
组合权重饼图显示显示并保存 allocation.png权重为 0 的标的会被直接从组合里剔除
收益柱状图显示(标题 Returns)保存 ret.png红涨绿跌与国际惯例相反,按源码配色为蓝/灰
累计收益 vs 基准显示保存 retbench.png基准口径由 benchmark 参数决定
分年度收益显示保存 y_returns.png首年与末年常为不完整年份,勿直接比较
月度收益热力图显示保存 heatmap.png该图对 QuantStats 版本敏感,历史上多次报参数错误
回撤曲线显示保存 drawdown.png看形状比看终值更有信息量
回撤区间显示保存 d_periods.png能回答「回撤修复了多久」
滚动 Beta显示保存 rbeta.png需要足够长的窗口,短区间噪声大
滚动波动率 / 滚动夏普源码中被注释,不显示滚动夏普会保存为 rsharpe.pngPDF 分支引用的 rvol.png 实际不会生成,见下节
图表会直接写入当前工作目录,文件名固定(ret.pngheatmap.png 等)。在项目根目录批量跑多份报告时,后一次会静默覆盖前一次;务必每次切换独立目录或提前备份。
EigenLedger · PDF 输出

EigenLedger 的 PDF 报告能不能直接交付?

report=True 会调用 fpdf 拼一份 PDF,但源码里有几处硬编码会让它在中文环境下翻车。

限制源码依据后果可行的绕法
字体写死为 arialpdf.set_font("arial", "B", 14)fpdf 内置字体不含 arial,也未注册中文字体,中文标的与说明会乱码或直接报字体未定义先出 PNG 再自行排版,或改用支持中文的 PDF 工具
强制引用 rvol.pngPDF 分支 pdf.image("rvol.png", ...),而生成该图的调用被注释工作目录里没有这个文件时会抛图片读取错误,PDF 生成中断先手工放置一个同名图片,或放弃 PDF 分支
封面 logo 走远程链接pdf.image("https://user-images.githubusercontent.com/...png", ...)离线环境无法生成封面提前下载该图片或跳过封面
产出散落在工作目录多张 PNG 以固定文件名写盘仓库被图片文件污染,且便于覆盖在独立临时目录中运行
图表文件名固定ret.png / heatmap.png 等为硬编码文件名多次运行会静默覆盖上一次的图每次运行切换独立目录并留存副本
指标值是字符串result 的字段统一转成带单位的字符串直接参与后续计算会报错或得到错误结果先清洗成数值再进入下游流程

如果仍要生成 PDF,建议的执行顺序:

  • 切到空目录再运行,filename 显式指定成带日期的文件名,避免覆盖历史报告。
  • 确认 rvol.png 存在(可先手工补一张),否则这一步必然失败。
  • 确认能访问 GitHub 图片 CDN,否则封面会失败。
  • 生成后逐页检查中文是否可读,有乱码就改走「PNG + 自行排版」路线。
EigenLedger · 结果对象

EigenLedger 返回值里有哪些字段可以直接取用?

PortfolioAnalysisResult 是一个空类,全部字段在运行中动态挂载——所以只有跑过才知道有什么。

字段内容适用场景注意点
df报告指标的原始字典想把指标写成表格或写进数据库不是 DataFrame,需要自己转
CAGR / CUM / VOL年化、累计、波动拼接自定义摘要均为带单位的字符串
SR / CR / IR / SOR夏普、Calmar、信息比率、Sortino做多组合打分对比字符串类型,参与计算前要转 float
MD / VAR / TA / CSR回撤、VaR、尾部比率、常识比率风险报告VaR 带百分号字符串
AL / BTAAlpha 与 Beta收益归因的第一步基准变化会同时改变这两个值
returns / creturns日收益序列与累计净值序列自己再画图或做二次统计索引为交易日期,可直接接 pandas
benchmark基准收益序列画相对强弱来源可能是 yfinance 或本地数据
orderbook再平衡下的各期权重表;无再平衡时退化为资产-权重表查「每一期到底配了什么」两种形态来源不同,处理前先判断形状
SK / KU / win_ratio / STABILITY偏度、峰度、上涨日占比、稳定性分布特征与体验描述字符串,且部分数值被包成列表字符串
注意:这些字段名大小写与源码一致(如 SRBTA),且不是稳定的公开 API——项目处于低频维护状态,升级后字段可能变化,依赖它们时要自己加断言保护。
EigenLedger · 读音顺序

拿到 EigenLedger 报告后按什么顺序读?

17 个数字一起看会失焦。按下面的顺序读,能最快发现「这份报告值不值得信」。

  1. 先看区间与标的

    区间是否覆盖了完整的牛熊?标的里有没有上市时间明显晚于起点的票?这两点决定后面所有数字的成色。

  2. 再看累计收益与最大回撤这一对

    累计收益配最大回撤,才构成完整体验描述。只看收益等于只看硬币的一面。

  3. 然后拆 Alpha 与 Beta

    Beta 接近 1 时,高收益大概率来自市场本身;Alpha 才是选股或配置带来的部分,并且要检查它在不同区间是否稳定。

  4. 接着看分布类指标

    偏度、峰度、尾部比率告诉你「收益是不是靠几次极端行情堆出来的」,这类组合的可持续性通常更差。

  5. 最后看基准相关信息比率

    信息比率衡量相对基准的稳定性,基准选错时它没有意义;确认基准与组合同市场、同币种后再读。

EigenLedger · 对照

报告类工作,EigenLedger 与本机技能怎么分工?

EigenLedger 强在「固定格式 + 可重跑」,本机技能强在「不写代码就能问」。

报告需求EigenLedger 路线本机技能路线建议
固定 17 项指标的批量报告一次调用得到完整指标表指标集合由各技能自行组织要格式统一选前者
单只票的体检曲线救国,需自建单标的组合a-share-metrics-card 直接输出体检卡单标的场景选后者
图要更好看图表样式写在源码里,改样式要改代码chart-image 可生成多种出版级图交付图选后者,回测图选前者
PDF 归档有 PDF 分支但有字体与缺图限制无内置 PDF 模板两边都建议先出图再排版
指标解释需要自己读源码与文档可要求技能解释指标含义教学场景选后者
结果可复现脚本 + 版本号即可复现依赖对话上下文,复现性较弱正式研究选前者

披露:本机技能目录已核验(29 个技能),但 EigenLedger 与 EasyClaw 无已证实集成,上表为能力对照,不表示可以互相调用或结果一致。

FAQ

关于报告内容的常见问题

为什么报告里没有交易次数和胜率?

因为这套分析的对象是「收益序列」而不是「交易记录」。源码从复权价格和权重直接算组合收益,没有成交事件的概念,因此无法统计交易次数、按笔胜率、盈亏比等指标。要这些数据得在策略层自行记录,以官方实现为准。

月度热力图为什么容易报错?

该图由 QuantStats 提供,历史上多次因 QuantStats 参数签名变化而报参数错误(社区 issue 中有明确记录)。项目把 QuantStats 锁定在 0.0.62,正是为了规避这类问题,因此升级依赖前务必先跑一遍出图流程。

report=True 生成的 PDF 为什么可能是空白的?

常见原因是执行目录里没有 rvol.png——PDF 分支会引用这张图,但生成它的调用在源码中被注释掉了。此外封面 logo 走远程链接、字体写死 arial,都会在离线或中文环境下失败。建议先出 PNG 再排版,以官方实现为准。

结果对象能直接转成 DataFrame 吗?

可以,但需要自己写:result.df 是字典结构(含指标名与数值两列),先 pd.DataFrame(result.df) 再设索引即可。注意多数指标值是带单位的字符串,参与计算前要先清洗,以官方实现为准。

零权重的标的会怎样?

源码会在分析时把权重为 0 的标的从组合列表中删除,也就是这一刻起引擎对象被修改了。若你在同一次会话里复用同一个 Engine 再分析一次,看到的组合已经不是最初那个。想复用请用 copy.deepcopy

报告的图能直接放进对外材料吗?

技术上讲可以,但要注意图的默认样式是源码写死的(尺寸 30×8 等),且不标注数据来源与区间。正式对外材料建议自己据此重绘,并注明区间、数据源与假设,避免被误读为收益承诺。

和券商 App 里的收益曲线为什么对不上?

常见原因:券商按持仓市值与现金流计算,而这里按复权价格与固定权重计算;券商计入手续费、税费与实际分红,这里不计;券商的区间是自然日历,这里默认到运行当天。对齐这三项后再比较,以双方各自的口径说明为准。

报告的图看完了,EigenLedger 怎么换成我自己的数据?

A 股、港股代码怎么写,本地 CSV 怎么接,数据缺失怎么办——都在数据接入页。