Commit Graph

13 Commits

Author SHA1 Message Date
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 28aea67232 feat(s1): 回测核心端到端跑通(vnpy client 对齐)
- 修 submit_cta/optimize 策略字符串→类解析(get_strategy_class)
- cta_engine: worker 进程设 vnpy DB→quant_trading.db(修 0 根数据)
- equity_curve 取自 calculate_result 的 daily_df(修 get_all_daily_results 对象问题)
- kline 补 cfg(find_config_path 共享)
- 端到端冒烟通过:DoubleMaStrategy 600000 → equity111/pnl111/trades1/kline117
2026-07-07 06:21:17 +08:00
claude_dev 510f77e6ea fix(backtest): result_id 用 DB 行 id + equity/trades 落 JSON(S1.1+S1.2)
- BacktestResult 加 id;save_result 设 result.id=lastrowid(修 get_result bug)
- runner._on_done 用 result.id(getattr 兜底 FactorReport)
- cta_engine 构建 equity_curve/trades DataFrame;save 传 file_dir
- result_store parquet→JSON(去 pyarrow 依赖,本机/容器都稳)
- 16 tests passed
2026-07-07 06:06:10 +08:00
claude_dev cb220619ef feat(backtest): 接真实 CTA 策略跑通端到端回测(DoubleMaStrategy on 600000)
修复 cta_engine 在真数据上的多个 bug(Phase 2 未在真数据验证):
- interval "1d" -> "d"(vnpy Interval.DAILY.value)
- capital 0 -> 1_000_000(0 致首笔交易即爆仓,统计全 0)
- statistics 改用 calculate_statistics(df)(旧代码误用 calculate_result 拿 DataFrame)
- statistics JSON-safe(vnpy 可能含 Timestamp)
- test_cta_engine mock 匹配新流程(calculate_statistics 返回统计字典)

验证:diag_cta.py 真实回测 DoubleMaStrategy on 600000 (2024H1, 111 天)
→ 真实统计 total_return -0.017% / sharpe -1.03 / max_drawdown -2.17 / 1 trade
容器 79 tests passed。
2026-07-06 23:33:24 +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 4723554e29 fix(api): auth 用 bcrypt 直调替代 passlib(修复容器 __about__ 缺失致登录失败)
- 替换 passlib.context.CryptContext 为直接 bcrypt 调用
- hash_password: bcrypt.hashpw + gensalt
- verify_password: bcrypt.checkpw + 异常处理
- 保持公共接口不变(hash_password/verify_password/create_token/verify_token)
- 移除 passlib 导入,直接使用 bcrypt 模块
- 现有 $2b$12$... bcrypt hash 仍可验证通过

修复问题:
- passlib 1.7.4 探测 bcrypt.__about__.__version__ 导致 AttributeError
- 现代 bcrypt 移除了 __about__ 属性
- 致使容器内密码验证失败,登录跳过

验证结果:
- 本地 test_auth.py: 3/3 PASS
- 容器 test_auth.py: 3/3 PASS
- 容器 smoke JWT LOGIN: PASS(之前 SKIP)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-06 19:55:06 +08:00
claude_dev effd3caa4a test(phase3a): 端到端冒烟 + multiprocessing guard 修复 + 覆盖率
Created comprehensive Phase 3a smoke test (scripts/smoke_phase3a.py) with:
- sys.path config (auto-detects local vs container)
- JWT login + protected route auth (with graceful bcrypt skip)
- Orchestrator async (ProcessPoolExecutor confirmed)
- WS stage wiring (on_stage callback verified)
- Real factor tears pipeline (multiprocessing fix validated)

Multiprocessing blocker resolved:
- Added if __name__ == "__main__": guard to enable vnpy.alpha spawn
- Tested in container - factor pipeline runs end-to-end
- max_workers=1 still spawns processes (guard required regardless)

Test coverage:
- Local: 44/44 tests passed, 82% coverage (sanguo_api + orchestrator)
- Container: 30/30 tests passed (factor + backtest)
- Smoke: All 6 sections passed in container

Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-06 19:50:34 +08:00
claude_dev 8041d4a9a5 test(phase2): 端到端冒烟通过(result_store+因子+API+data_adapter 真实 A 股 117 bars) 2026-07-06 11:44:22 +08:00
claude_dev ee4bccb06b spike(s2): run_optimization PASS(vnpy_ctastrategy 1.4.1 + spawn pool + max_workers) 2026-07-06 07:45:47 +08:00
claude_dev 9a257994b3 spike(s1): vnpy.alpha A 股支撑度 PASS(AlphaLab 存取 + ts_mean 因子计算) 2026-07-06 07:40:38 +08:00
claude_dev b325109df6 spike(s3): peewee 冲突验证 PASS(alphalens 0.4.6 + vnpy_sqlite peewee 4.1.1 共存) 2026-07-06 07:33:47 +08:00
claude_dev 6da8a55b5e docs(phase1): 数据层完成报告 + 端到端冒烟脚本 2026-07-05 23:47:07 +08:00
claude_dev 36ec0d38e3 chore: 添加 .gitkeep 保持目录结构
- tests/.gitkeep
- scripts/.gitkeep
- examples/.gitkeep

确保空目录在 Git 中被追踪。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-01 21:21:57 +08:00