feat: 双轨同源规范——新建strategy模块spec(含综合/普适公式+三状态+每日更新说明)+研究Tab挂?/§按钮
This commit is contained in:
@@ -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=<all|a|hk>",
|
||||
"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=<v>&period=<6m>&market=<all|a|hk>&capital=<1000000>",
|
||||
"returns": "{trades[], summary{}, insights[], year_dist{}} — 回测结果",
|
||||
"description": "运行指定策略版本回测。end_date 固定 2026-07-24(数据完整截止日),universe=market 支持 A股/港股"
|
||||
},
|
||||
{
|
||||
"method": "GET",
|
||||
"path": "/api/research/analysis?strategy=<v>",
|
||||
"returns": "因子归因分析结果",
|
||||
"description": "指定策略版本的因子归因分析"
|
||||
},
|
||||
{
|
||||
"method": "GET",
|
||||
"path": "/api/research/trades?strategy=<v>",
|
||||
"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 — 进化闭环设计"
|
||||
]
|
||||
}
|
||||
}
|
||||
+2
-1
@@ -2136,7 +2136,8 @@ function renderResearch() {
|
||||
el.innerHTML =
|
||||
'<div class="flex gap-2 items-center mb-3">' +
|
||||
'<span class="text-sm font-semibold text-slate-300">📋 策略研究</span>' +
|
||||
'<span class="text-xs text-slate-500">按温区自适应展开 · 每策略每温区一行 · 🟢=当前温区激活</span>' +
|
||||
'<span class="spec-btns"><span class="spec-btn help" onclick="showModuleHelp(\'strategy\',\'human\')">?</span><span class="spec-btn ai" onclick="showModuleHelp(\'strategy\',\'ai\')">§</span></span>' +
|
||||
'<span class="text-xs text-slate-500">按温区分组 · 每策略每温区一行 · 🟢=当前温区激活</span>' +
|
||||
'</div>' +
|
||||
'<div id="rsub-strategy">' +
|
||||
'<div id="evo-box" class="mb-3 bg-slate-800/60 border border-slate-700 rounded-lg p-3"><div class="text-xs text-slate-500">🧬 进化模块加载中...</div></div>' +
|
||||
|
||||
Reference in New Issue
Block a user