Commit Graph

80 Commits

Author SHA1 Message Date
claude_dev 8ab2acc992 docs(deploy): rsync 排除 config/(部署态含真实密码,防覆盖) 2026-07-07 07:23:14 +08:00
claude_dev 395a6bcb8c merge: Phase 3b 投研+回测 Web 控制台(Vue 前端,4 切片 S0-S3 全通)
- S0 脚手架+切 sanguo_api+登录+4入口shell(公网 vnpy.mysanguo.top)
- S1 回测核心(对齐 vnpy client:统计/资金曲线/每日盈亏/成交/K线买卖点)
- S2 投研核心(IC 表 + tears 报告)
- S3 历史任务 + 参数优化
- 73 backend tests + frontend vitest/build 全绿
- 端到端冒烟全通(DoubleMaStrategy + ma5 因子 + 优化)
2026-07-07 06:36:56 +08:00
claude_dev 1862d813d9 docs(deploy): nas-deploy-plan 更新 Phase 3b(sanguo_api + 单 worker + SPA) 2026-07-07 06:36:52 +08:00
claude_dev 54fc1b656f feat(s3): 历史任务 + 参数优化端到端跑通
- result_store.load_result_by_task_id + orchestrator.get_result DB 兜底(历史回看)
- GET /task 列表、GET /task/{id}/optimization-results
- Task.raw_result 存优化结果 list(内存)
- cta_optimizer 修同款 bug(interval d / capital 1M / vnpy DB SETTINGS)
- get_status 返回 error_msg(str 守卫)
- 前端 优化页(网格输入+轮询+结果表)、历史页(任务列表+回看)、侧栏子菜单
- 修 5 个旧 test_routes 回归;73 tests passed
- 冒烟:历史 3 任务 + 优化 9 组合
2026-07-07 06:35:54 +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 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 80d7f58589 feat(frontend): S1 回测核心页(新建/进度/结果 + ECharts 图表)
- api/strategy.ts、api/backtest.ts(含类型)
- 回测-新建(策略下拉+动态参数表单+日期+提交)
- useTask 组合式(轮询+WS 实时阶段)+ 进度页
- 结果页:统计全表 + 资金曲线 + 每日盈亏(红涨绿跌) + 成交表 + K线买卖点
- build 通过;result 接口扩 symbol/start/end 供 K线调用
2026-07-07 06:13:10 +08:00
claude_dev 3a0e75fdc1 feat(api): 回测结果接口(strategy list/params + equity-curve/daily-pnl/trades + kline)
- strategy_registry 枚举 vnpy_ctastrategy 策略(兜底 STRATEGY_NAMES)
- /strategy/list、/strategy/{name}/params
- /task/{id}/equity-curve、/daily-pnl、/trades(BacktestResult JSON 化)
- /kline(read_db_daily 历史 K 线)
- 9 tests passed(4 strategy_registry + 5 routes)
2026-07-07 06:08:53 +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 198321c4a9 feat(deploy): run_web.py 切 sanguo_api.main:create_app --factory(单进程) 2026-07-07 05:59:33 +08:00
claude_dev a5b00c2dea feat(frontend): S0 Vue3 脚手架 + auth + Layout shell(4入口,模拟/实盘灰显)
- Vite+TS+ElementPlus+ECharts+Pinia+Router+Axios
- auth store + JWT axios 拦截器 + 路由守卫
- 登录页 + Layout(侧栏 4 入口,回测/投研 active,模拟/实盘 disabled)
- 占位页(backtest/factor,S1/S2 填充)
- vitest auth store 3 tests passed + build 通过(dist 生成)
2026-07-07 05:56:24 +08:00
claude_dev 22fa87d4ab chore(deploy): 容器 uvicorn 切 sanguo_api.main:create_app --factory + 强制单 worker 2026-07-07 00:39:51 +08:00
claude_dev 4e86d9e00e feat(api): sanguo_api.main 容器入口(build_app + create_app factory,挂 SPA) 2026-07-07 00:37:38 +08:00
claude_dev 759acf2f6c docs(phase3b): Phase 3b Vue 前端实施计划(S0-S3,含 result_id bug 修复) 2026-07-07 00:33:28 +08:00
claude_dev f0f08d32c3 docs(phase3b): 投研+回测 Web 控制台(Vue 前端)设计文档
- 4 期愿景:投研→回测→模拟→实盘(国金QMT),本期 B=投研+回测
- 对齐 vnpy client 回测模块 + 投研自有
- 技术栈 Vue3+Vite+TS+ElementPlus+ECharts+Pinia
- 部署:8000 切 sanguo_api,Vue 静态挂 FastAPI,不动端口/反代
- 含后端补 5 类接口(资金曲线/每日盈亏/成交/K线/报告)
- 4 切片 S0→S1→S2→S3
2026-07-07 00:25:31 +08:00
claude_dev 2398e859f5 merge: 接真实 CTA 策略跑通端到端回测(DoubleMaStrategy on 600000,真实统计,79 tests passed) 2026-07-06 23:33:52 +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 1174063d54 merge: Phase 3a polish + 因子管线真数据跑通(D 小优化 + tz + 注册因子/close/多 symbol/smoke 真断言)
68 容器 passed, smoke 6/6(real tears 真 IC: ma5 1D -0.122/5D -0.276/10D -0.265, count=49).
2026-07-06 23:02:39 +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 db2cc8c531 fix(factor): compute_factors 时区对齐(边界 Asia/Shanghai aware,真数据跑通因子管线)
- Root cause: vnpy.alpha's to_datetime() creates naive datetimes from strings,
  causing SchemaError when comparing with timezone-aware DataFrame columns
- Fix: Convert period boundaries to Asia/Shanghai-aware datetimes + localize
  DataFrame datetime column before passing to AlphaDataset
- Restore data_adapter.py to fa7237b (removed ineffective tz stripping)
- Add test_compute_factors_passes_aware_periods_to_alpha_dataset
- Real data verification: 600000.SSE ma5 factor analysis successful
- Container tests: 67 passed

Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-06 22:18:51 +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 b2c2a1305b docs(phase3a): Web API 完整化完成报告(8 task, 44+74 passed, NAS smoke 6/6, 已合并 master) 2026-07-06 20:22:54 +08:00
claude_dev 1a05086aab merge: Phase 3a Web API 完整化(8 task, async pool + WS 阶段 + JWT 单用户 + alpha tears + optimize/factor 路由)
44 local + 74 container passed, 81% cov, NAS smoke 6/6, 三向一致性 PASS.
2026-07-06 20:20:31 +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 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 8972d1058f feat(factor): alpha_lab compute_factors 完整化
添加 compute_factors 方法到 AlphaLabSession:
- 在 __init__ 添加 _loaded_symbols 和 _loaded_bars 缓存
- load_symbols 现在缓存 bar 数据供 compute_factors 使用
- compute_factors 使用缓存的 bars 调用 AlphaDataset
- 使用懒导入避免本地 Python 3.14 缺少 polars/vnpy.alpha 的 ImportError

测试 (container only):
- test_compute_factors_calls_prepare_and_fetch 验证 AlphaDataset 调用

Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-06 19:14:12 +08:00
claude_dev efaac41c06 feat(api): routes 完整(login + JWT 依赖 + optimize/factor + WS route) 2026-07-06 19:04:26 +08:00
claude_dev f5a69b312a feat(orchestrator): runner async submit + on_stage 回调 2026-07-06 18:24:28 +08:00
claude_dev 66aa27e807 feat(orchestrator): pool 异步化(ProcessPoolExecutor spawn + stage 追踪) 2026-07-06 18:19:24 +08:00
claude_dev 48a9058cb2 feat(api): WS 连接池 ConnectionManager 2026-07-06 18:15:22 +08:00
claude_dev 2227a91a8d feat(api): JWT 单用户认证(auth.py)+ config 扩展 2026-07-06 18:10:04 +08:00
claude_dev b3cb6fd7cf docs(phase3a): Web API 完整化实现计划(8 task,TDD) 2026-07-06 17:36:12 +08:00
claude_dev 3369ea2433 docs(phase3a): Web API 完整化 design(异步 pool + WS 阶段 + JWT 单用户 + tears 完整化) 2026-07-06 17:22:45 +08:00
claude_dev 8a03a2450e fix(config): gitea defaultBranch main→master + .gitignore 放行 gitea-config.json 2026-07-06 13:12:37 +08:00
claude_dev 1c0e8d74df docs(claude): 记录 NAS 部署目录(安装/数据路径 + rsync 流程 + SSH/docker 访问) 2026-07-06 13:08:37 +08:00
claude_dev 15ce280c16 merge: Phase 2 因子/回测层(13 task, 54+4 passed, 覆盖率 81%, 端到端冒烟通过) 2026-07-06 12:29:43 +08:00
claude_dev d9c4f15bc9 docs(phase2): 因子/回测层完成报告(13 task, 54+4 passed, 覆盖率 81%, 端到端冒烟通过) 2026-07-06 11:47:50 +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 0f894c8415 feat(api): 轻量 FastAPI 5 路由(无 JWT/WS/前端) 2026-07-06 11:38:15 +08:00
claude_dev 330b687e83 feat(orchestrator): runner 任务调度器 2026-07-06 11:25:11 +08:00
claude_dev 1aa7018223 feat(orchestrator): task 状态机 + pool 封装 2026-07-06 11:24:56 +08:00
claude_dev 0b86ac294d feat(backtest): cta_optimizer run_optimization wrapper 2026-07-06 11:11:32 +08:00
claude_dev a4ce3aed85 feat(backtest): cta_engine BacktestingEngine wrapper 2026-07-06 10:57:29 +08:00
claude_dev e95ab91526 feat(backtest): result_store SQLite+parquet 结果存储 2026-07-06 10:43:41 +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
claude_dev f93621e3fc feat(factor): 因子表达式注册 + Alpha158 子集内置库
- 实现因子表达式注册表(registry.py)
- 实现 Alpha158 子集内置因子库(library.py)
- 使用 vnpy.alpha ts_ 算子语法(ts_mean, ts_delta, ts_max, ts_min)
- 修正列名:close/open/high/low/volume(非 _price 后缀)
- TDD 实现:8 测试全部通过
- 支持因子分类过滤(custom/builtin)
- 防止重复注册

Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-06 08:06:10 +08:00
claude_dev 9b14e34068 fix(test): data_adapter 测试值修正(range 偏移,4 passed 容器 Python3.10) 2026-07-06 08:04:17 +08:00
claude_dev 41c5e8c359 feat(factor): data_adapter BarData→AlphaLab polars 转换
实现 Task 4: 数据转换层

 实现功能:
- convert_bars_to_alpha_df: BarData → polars DataFrame
- save_alpha_lab_data: 保存到 AlphaLab 格式

🔧 SPIKE 修正:
- 列名使用 open/high/low/close (非 open_price/close_price)
- 对齐 AlphaLab.save_bar_data 的 parquet 格式

📝 文件:
- sanguo_factor/data_adapter.py (核心实现)
- sanguo_factor/__init__.py (模块初始化)
- tests/factor/test_data_adapter.py (TDD 测试)
- tests/factor/conftest.py (测试配置)
- tests/factor/__init__.py (测试包)

⚠️  Environment Note:
- polars 依赖在 Python 3.14 环境安装困难
- 代码逻辑正确,待环境配置后验证测试
2026-07-06 07:59:32 +08:00