65021bd32c
alphalens-reloaded create_full_tear_sheet 内部每个 tear sheet 末尾调 GridFigure.close()→plt.close(fig),Agg 后端下 figure 被销毁,plt.savefig 只能拿到最后一个空占位 figure(实证 2.3KB 空 PNG);原代码 savefig 存 .png 却把 report_paths 记成 .html,report endpoint os.path.exists 失败 返回 404,iframe 加载空白(回退到 SPA 首页标题)。 monkey-patch GridFigure.close 收集 figure 而非销毁(同 empyrical/demean 适配思路,不改 alphalens 源码),跑完把所有 figure savefig 成 base64 嵌入 真 HTML 文件,report_paths 指向该 html。 浏览器端到端验证(VPS factor_2d01a718):report endpoint 404→200,iframe 渲染 4 张 tearsheet 图(returns/information/turnover/quantile table,2.4MB), naturalWidth>0 确认非 broken,console 无报错。