diff --git a/specs/strategy.json b/specs/strategy.json new file mode 100644 index 00000000..e93e95cf --- /dev/null +++ b/specs/strategy.json @@ -0,0 +1,94 @@ +{ + "module": "strategy", + "version": "1.0", + "purpose": "策略研究模块。策略版本管理、回测、温区自适应路由、三状态模型,以及研究 Tab 的版本迭代对比表格(含综合/普适评分体系)。", + "human_help": { + "title": "策略研究(版本迭代对比)", + "description": [ + "本模块是 MoFin 的策略研究面板:管理所有策略版本的迭代历史、回测结果、温区自适应路由(A股/港股独立温区)。", + "策略版本按【适应温区】展开成多行——每行显示该策略在该温区的独立表现(胜率/平均收益/笔数来自 strategy_regime_perf,每日盘后自动重算)。", + "当前温区激活区块按温区分组:当前温区排最前并高亮,组内策略按该温区胜率降序。", + "策略有三种状态:🟢 激活(当前温区路由选中)/ 🔵 可用未激活(候选池内,温区切换即可激活)/ 📚 不可用(已证伪或历史版本,路由不会选中)。", + "数据每日自动更新:strategy_period_rollup(17:05 派生 1y/2y/5y 窗口统计)+ regime_perf_daily(17:15 重算各温区表现)。" + ], + "usage": [ + "选择周期(近1月/6月/1年/2年/5年/10年)— 筛选该窗口的回测统计;1m/6m/1y 从最长区间切窗派生,2y/5y/10y 读库(派生行带 derived_from 标记)", + "选择市场(全部/A股/港股)— 港股策略带「港」徽章,A股带「A」", + "点击策略行 — 打开该策略的版本详情(含因子归因、交易明细)", + "▶回测按钮 — 手动重跑该策略回测", + "综合列 — 整体行显示温区加权综合分(按温区时长占比加权),温区行显示该温区的综合分", + "普适列 — 显示普适性评分,格式:分数/信号月数(详见下方说明)" + ], + "troubleshooting": [ + "某策略某些列空白 → 该周期窗口无数据或样本不足;激活策略缺失时系统自动用 10y 数据补全并标注", + "综合分偏低 → 该策略在适应温区内收益/胜率/夏普/盈亏比/回撤综合评分低,或样本量<40笔/信号月份<6导致置信系数打折", + "v_oversold 在趋势市/震荡市收益低但仍激活 → 激活只看当前温区(trend_down)匹配,其他温区行只是参考", + "普适显示 X/? 月 → 该温区总月份数据缺失(港股温区总月份按港股 market_regime 统计)" + ] + }, + "ai_spec": { + "apis": [ + { + "method": "GET", + "path": "/api/research/strategies?period_tag=<2y>&market=", + "returns": "{strategies[{version, name, summary_stats, regime_winrates, regime_weighted, deprecated, state, state_reason, current, market, period_tag, trades_count}], regime_active[], regime_state}", + "description": "策略版本列表。summary_stats 含 win_rate/portfolio/portfolio_full/universality;regime_winrates 为每策略每温区表现;regime_weighted 为温区加权整体综合;state 为三状态(active/available/unavailable);regime_state 为 A股当前温区" + }, + { + "method": "GET", + "path": "/api/research/backtest?strategy=&period=<6m>&market=&capital=<1000000>", + "returns": "{trades[], summary{}, insights[], year_dist{}} — 回测结果", + "description": "运行指定策略版本回测。end_date 固定 2026-07-24(数据完整截止日),universe=market 支持 A股/港股" + }, + { + "method": "GET", + "path": "/api/research/analysis?strategy=", + "returns": "因子归因分析结果", + "description": "指定策略版本的因子归因分析" + }, + { + "method": "GET", + "path": "/api/research/trades?strategy=", + "returns": "{strategy, trades[]} — 交易明细", + "description": "指定策略版本的最新交易明细(从 strategy_research.results_json 读取)" + } + ], + "dependencies": [ + "strategy_lab.py — calc_summary/portfolio_sim/list_strategies 核心计算", + "hk_strategies.py — 港股策略定义(HK_STRATEGIES + strategies_for_regime)", + "strategy_router.py — 双市场路由(写 data/strategy_weights.json)", + "strategy_period_rollup.py — 每日派生 1y/2y/5y 窗口统计(cron 17:05)", + "regime_perf.py / regime_perf_daily.sh — 温区表现重算(cron 17:15)", + "strategy_research 表 — 策略版本+回测结果存储(含 market/period_tag/deprecated 字段)", + "strategy_regime_perf 表 — 每策略每温区表现(含温区级组合模拟)", + "market_regime 表 — 温区归因(date→regime,market 维度)" + ], + "constraints": [ + "综合分公式(前端计算,整体行):min(ret,100)/100×30 + wr/100×20 + min(max(sharpe,0),20)/20×20 + min(pf,5)/5×15 + (1-min(dd,50)/50)×15,乘以置信系数 conf=min(1,n/40)×min(1,months/6)", + "综合分收益口径:MC 全参与(portfolio_full 优先,消除集中仓挑装运气);温区加权综合按温区时长占比加权各温区表现", + "普适性(strategy_lab.calc_summary):months=信号分布覆盖的月份数;peak_pct=信号最集中月份的占比%;score=信号月份分布香农熵归一化(0-100),分布越均匀越高", + "温区级普适(server._approx_regime_universality):信号月份≈trades/温区月均笔数,score=估算信号月份/温区总月份×100", + "激活判定(strategy_router.route):当前温区胜率≥50 且最佳温区胜率≥50,且未 deprecated", + "三状态派生(不存储):active=∈strategy_weights.active∪markets.hk.active;unavailable=已证伪(deprecated非空)或不在候选池;available=其余(候选池内未激活)", + "候选池:A股=regime_perf 有记录的策略;港股=HK_STRATEGIES 定义的策略", + "回测数据截止 2026-07-24,窗口派生锚定数据末端(非今天),避免回测未重跑时窗口缩水" + ], + "must_not": [ + "不要在策略代码里硬编码 deprecated 集合(必须从 strategy_research.deprecated 读)", + "不要在策略代码里硬编码激活策略列表(必须读 data/strategy_weights.json)", + "不要给派生行(derived_from)覆盖真实研究记录", + "不要用 period_tag 字典序排序取 trades(必须用 LENGTH 降序最长周期优先)", + "不要污染 A股温区(读 market_regime 必须带 market='a' 过滤)" + ], + "related_files": [ + "server.py — /api/research/* 路由 + 三状态派生 + regime_weighted", + "static/index.html — renderStrategyTable/renderGroupByRegime/renderRegimeRow", + "strategy_lab.py — 核心计算", + "hk_strategies.py — 港股策略", + "strategy_router.py — 双市场路由", + "strategy_period_rollup.py / regime_perf.py / regime_perf_daily.sh — 每日自动更新", + "deploy/profile-scripts/health_monitor_daily.py — 健康度监控", + "docs/decisions/2026-08-15-策略自我进化闭环重构.md — 进化闭环设计" + ] + } +} diff --git a/static/index.html b/static/index.html index f6a3bf2f..34035f36 100644 --- a/static/index.html +++ b/static/index.html @@ -2136,7 +2136,8 @@ function renderResearch() { el.innerHTML = '
' + '📋 策略研究' + - '按温区自适应展开 · 每策略每温区一行 · 🟢=当前温区激活' + + '?§' + + '按温区分组 · 每策略每温区一行 · 🟢=当前温区激活' + '
' + '
' + '
🧬 进化模块加载中...
' +