claude_dev
|
65021bd32c
|
fix(factor): tears iframe 渲染——patch GridFigure.close 收集 figure 生成 HTML
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 无报错。
|
2026-07-17 14:38:03 +08:00 |
|
claude_dev
|
3b116b63f9
|
fix(factor): patch alphalens demean 兼容 pandas2,tears 报告跑通
alphalens-reloaded 的 demean_forward_returns 用 groupby.transform(lambda x: x-x.mean()),pandas2 走 _transform_general → concat 空(No objects to concatenate),tears 崩。
monkey-patch alphalens.utils.demean_forward_returns:改 transform("mean") 走 _transform_fast(广播组均值不 concat)再相减,等价且兼容。不改 alphalens 源码(同 empyrical np.NINF 适配思路)。
验证: 单点 patch 无 cascade,tears create_full_tear_sheet 全链跑通,report 生成,IC + tears 报告都出。
|
2026-07-17 13:21:18 +08:00 |
|
claude_dev
|
b3ea8e7b04
|
fix(factor): 因子分析端到端修复(依赖缺失+vt_symbol+IC/tears解耦)
根因链:
1. alphalens + scikit-learn 没装 → analyzer:76 软错误 return {error:alphalens not installed}(已 pip 装 alphalens-reloaded 0.4.6 + scikit-learn 1.7.2,requirements-lock 已锁)。
2. symbols 传 vt_symbol(600000.SSE)但 read_db_daily 查 DB 用裸代码 → bars 空 → factor/prices 全空 → alphalens infer_trading_calendar weekmask 全零 → busdaycal 崩。
3. statistics 含 date/numpy(之前 optimize 已修 result_store _json_default)。
4. alphalens-reloaded × pandas2 的 groupby.transform 兼容:demean_forward_returns tears 崩 No objects to concatenate。
适配修复(不动 vnpy/alphalens 源码):
- symbols 归一:vt_symbol → 裸代码(split '.'),read_db_daily 能查到。
- IC/tears 解耦:IC 算完先存 ic_summary success,tears 独立 try(失败标 tears_error 不覆盖 IC)——IC 核心数值可用,tears 报告作为已知限制。
- error 加 traceback 字段(调试友好)。
验证: 3 symbol(600000/000001/600519) ma5 因子 IC 成功(1D/5D/10D mean/icir/t_stat count=49),浏览器 /factor/result 页表格渲染。单 symbol IC NaN 是截面用法(需≥2标的),非 bug。
|
2026-07-17 11:51:08 +08:00 |
|
claude_dev
|
212ad6426d
|
feat(s2): 投研核心端到端跑通(IC 表 + tears 报告)
- Task 加 raw_result 字段;orchestrator get_raw_result(内存存 FactorReport)
- 路由 /factor/list、/task/{id}/ic-summary、/task/{id}/report/{factor}(query token 给 iframe)
- analyzer cfg=None 时加载 data_platform.yaml(修 API 路径 read_db_daily 崩)
- get_status 返回 error_msg(调试+前端 failed 展示)
- 前端 投研-新建(多因子/多标的/日期)+ 结果页(IC 表 + tears iframe)
- factor 冒烟通过:ma5 → IC 1D/5D/10D 真实数据
|
2026-07-07 06:28:01 +08:00 |
|
claude_dev
|
24ead05b3f
|
fix(factor): 因子管线真数据跑通(注册因子 + close 时区 + 多 symbol + smoke 真断言)
端到端修复因子分析在真实 A 股数据上的多层问题:
- __init__ 引入 library 触发 _register_all(ma5 等内置因子注册)
- read_db_daily 用裸 symbol(600000 非 600000.SSE),匹配 DB 存储
- analyzer 单独读 close 价格 + tz_localize Asia/Shanghai 对齐 factor_df aware 日期
- smoke 用 >=2 symbol(alphalens IC 是横截面分析,单 symbol 分位为空 -> concat 报错)
- smoke 真断言 IC 非空(杀掉之前的假阳性 PASS)
- 修 status 引用未定义的 use_cumsum_fallback
验证:容器 smoke 6/6 PASS,real tears 出真 IC
(ma5: 1D mean=-0.122/icir=-0.22, 5D mean=-0.276, 10D mean=-0.265, count=49)
容器 68 tests passed。
|
2026-07-06 23:00:48 +08:00 |
|
claude_dev
|
fa7237b996
|
feat(polish): 因子报告 IC 提取 + periods 提参 + 缓存上限 + 代码整洁
- analyzer.py: 提取 IC 值到 ic_summary (mean/std/icir/t_stat),periods 提参 (默认 1,5,10)
- alpha_lab.py: _loaded_bars 缓存 LRU 上限 (_MAX_CACHED_SYMBOLS=50)
- runner.py: 统一阶段文案 (参数优化中/因子分析中),worker 类型标注,_wait_future 文档
- pool.py: submit_work 添加 task_id debug 日志
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-07-06 21:32:27 +08:00 |
|
claude_dev
|
30897aa28d
|
fix(factor): analyzer tears review 修复(cumsum 警告 + per-factor report_paths + 错误可见性)
|
2026-07-06 19:39:45 +08:00 |
|
claude_dev
|
ff0d535fe8
|
feat(factor): analyzer tears pipeline 完整化
|
2026-07-06 19:32:36 +08:00 |
|
claude_dev
|
2379159818
|
feat(factor): AlphaLab 封装 + Alphalens 分析器
- 新增 alpha_lab.py: AlphaLabSession 类(lazy import vnpy.alpha)
- 新增 analyzer.py: run_factor_analysis + FactorReport(lazy import alphalens)
- 测试: test_alpha_lab.py (2 passed) + test_analyzer.py (3 passed)
- 策略: 本地无 alphalens/polars,函数内 lazy import 避免 ImportError
- 骨架: run_factor_analysis 返回 FactorReport,alphalens 集成待完整实现
|
2026-07-06 10:36:46 +08:00 |
|