Files
MoFin/specs/strategy.json
T

245 lines
20 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"module": "strategy",
"version": "2.0",
"purpose": "策略研究模块。策略版本管理、回测、温区自适应路由、资格评估(标准A)、手动可用性把关、三状态模型、自我进化机制(数据归纳假设+B组挖掘),以及研究 Tab 的版本迭代对比表格(含综合/普适评分体系)。",
"human_help": {
"title": "策略研究(版本迭代对比)",
"description": [
"本模块是 MoFin 的策略研究面板:管理所有策略版本的迭代历史、回测结果、温区自适应路由(A股/港股独立温区)。",
"策略版本按【适应温区】展开成 6 张表(A股当前市/港股当前市/A股其余2市/港股其余2市)——每个策略只在它的适应温区(best_regime)表显示一行,所有列(胜率/平均收益/笔数/均持仓/年化/综合/夏普/盈亏比/普适/回撤)都是该策略在【适应温区】的数据,与所选周期一致。",
"策略有三种状态:🟢 激活(当前温区匹配 + 手动可用 + 三项资格达标)/ 🔵 可用(手动可用 + 长期+近期达标,当下待观察)/ 📚 不可用(手动不可用或长期不合格或已证伪)。",
"数据每日自动更新:strategy_period_rollup17:05 派生 1y/2y/5y 窗口统计)+ regime_perf_daily17:15 重算各温区表现,含按周期预计算 regime_perf_by_period)。",
"自我进化机制(研究Tab顶部进化中心):方向一=数据归纳优化假设(从最新交易归纳盈利/亏损模式,如'RSI≥38时胜率仅57%应规避',非拍脑袋参数调整);方向二=B组策略挖掘(由果及因按温区扫描因子组合,与A组对照)"
],
"usage": [
"选择周期(近1月/6月/1年/2年/5年/10年)— 筛选该窗口的回测统计;1m/6m/1y 从最长区间切窗派生,2y/5y/10y 读库",
"选择市场(全部/A股/港股)— 港股策略带「港」徽章,A股带「A」",
"点击策略行 — 打开该策略的版本详情(含因子归因、交易明细)",
"▶回测按钮 — 手动重跑该策略回测",
"【资格列】三个符号 = 长期/近期/当下 三项达标(详见下方「资格评估」说明)",
"【可用列】勾选框 = 手动可用性开关(激活只能是可用的策略;取消勾选 → 立即降级为不可用)",
"表头【✅全可用/🚫全不可用】按钮 — 批量设置当前温区表所有策略的可用性",
"表头【大盘基准: 1y/2y/10y】— 显示当前大盘年化阈值(资格评估的对比基准)",
"⚠️警告文字(黄色)= 可用策略近期转差(2y 年化已跌破大盘),提示关注;🔄(绿色)= 不可用策略近期回升(1y 年化重回大盘上方),提示可考虑重新启用",
"🧪 数据归纳优化假设(方向一)— 每个激活策略基于最新交易归纳的规避条件,带数据证据(分组胜率对比)",
"🔬 B组候选挖掘(方向二)— 由果及因扫描的候选策略(温区+因子组合+好果率),与A组对照待融合",
"📊 策略温区资格 — 每个激活策略在各温区的长期/近期/当下达标状态(✅✅✅)"
],
"qualification": [
"资格评估 = 策略在【适应温区】的年化 vs 大盘基准,分三个时间尺度:",
"✅/❌ 第一个符号(长期)= 适应温区 10y 年化 > 大盘 10y(当前约 2.4%",
"✅/❌ 第二个符号(近期)= 适应温区 2y 年化 > 大盘 2y(当前约 16.8%",
"✅/❌ 第三个符号(当下)= 适应温区 1y 年化 > 大盘 1y(当前约 5.3%",
"悬停每个符号可看具体数值(该尺度年化 vs 大盘基准)",
"三项全过(✅✅✅)= 激活资格;长期+近期过(✅✅❌)= 可用;长期不过(❌❌❌)= 历史",
"当前温区是下跌市(trend_down)时,只有 best_regime=trend_down 的策略在下跌市表显示;其他温区的策略(如趋势市 v7.1)三项全过但在各自温区表显示",
"",
"策略评分分级(2026-08-17 老莫定稿,基于资格叉数 + 综合分排名):",
" ❌❌ / ❌❌❌(≥2个叉) = 不合格",
" ❌(1个叉) = 待观察",
" ✅✅✅ + 综合分60-74 = 合格",
" ✅✅✅ + 综合分75-84 = 良好",
" ✅✅✅ + 综合分≥85 = 优秀",
"综合分 = (收益30+胜率20+夏普20+盈亏比15+回撤15) × 置信系数 × 效率因子(详见「综合」列说明)",
"状态(已激活/未激活)与评分是独立概念:状态=是否被择优选中实盘运行;评分=策略质量等级"
],
"troubleshooting": [
"某策略某些列空白 → 该周期窗口无数据或样本不足;激活策略缺失时系统自动用 10y 数据补全并标注",
"某策略「激活」但被降级(显示 🔵可用 或 📚不可用)→ 查看 state_reason:可能是手动不可用,或资格未三项达标(如近期 2y 年化跌破大盘)",
"⚠️警告出现 → 该策略 2y 年化已低于大盘(近期转差),虽然长期仍合格,建议关注是否手动停用",
"v_oversold 在下跌市表当下❌(1y 年化负)但仍显示 → 它长期+近期达标(✅✅),当下样本少(2笔)待观察,状态为可用而非激活",
"普适显示 X/? 月 → 该温区总月份数据缺失(港股温区总月份按港股 market_regime 统计)"
],
"columns": {
"version": {
"label": "版本",
"desc": "策略版本标识。命名规则:v前缀=传统迭代版(v7.1/v8.1…),s2_=S家族恐慌扫描,hk_=港股专用,b_=B组融合候选,evo_=进化引擎变体。A=适配A股,港=适配港股。",
"see": "点击整行打开该策略的版本详情(因子归因+交易明细)"
},
"name": {
"label": "名称",
"desc": "策略的人话名称,概括其选股逻辑(如「S2恐慌买超跌」= 大盘极端恐慌日买被错杀的强势票)。悬停可看 hypothesis 完整假设。⚠️标记=样本不足40笔。",
"see": "悬停名称查看策略假设"
},
"qualification": {
"label": "资格",
"desc": "三项资格达标徽章:✅✅✅ = 长期(10y)/近期(2y)/当下(1y) 三项年化均跑赢大盘基准。三个符号从左到右 = 长期/近期/当下。悬停每个符号看该尺度年化 vs 大盘的具体数值。",
"see": "大盘基准:A股 1y5.3%/2y16.8%/10y2.4%;港股按下跌市时段分段。三项全过=激活资格;长期+近期过=可用;仅长期过或全不过=历史/不合格"
},
"manual_available": {
"label": "可用",
"desc": "手动可用性开关(勾选=可用)。铁律:激活的只能是可用的策略,可用与否是手动的——取消勾选立即降级为不可用(手动停用),即使资格达标也不会被激活。",
"see": "表头有「✅全可用/🚫全不可用」批量开关"
},
"win_rate": {
"label": "胜率",
"desc": "盈利笔数占比。温区表 = 该策略在该温区的回测胜率(信号级)。判断参考:胜率>=50% 绿色、<50% 红色。注意:胜率不是唯一标准,要结合盈亏比看(高胜率+低盈亏比可能总收益不高)。",
"see": "信号级统计(含未成交信号),非实际交易胜率"
},
"avg_profit": {
"label": "平均收益",
"desc": "每笔交易的平均收益率(%)。正值=平均每笔赚钱。与胜率结合看:平均收益高+胜率高 = 高质量策略;平均收益为正但胜率低 = 靠少数大赢家。",
"see": "信号级统计(含未成交信号)"
},
"trades": {
"label": "成交/信号",
"desc": "两个数字:成交数(组合模拟10等分仓位下实际入场笔数)/ 信号数(策略触发的全部信号)。比值=信号/成交。健康策略该比值应接近1-2;比值过大(如10+)说明大量信号未被实际成交——可能是信号太密集(每日几十个抢10个仓位槽)或持仓重叠导致。",
"see": "这是2026-08-16升级的核心关注列:通过「每日top-N截断」把高比策略压到2以内。悬停看完整说明"
},
"hold": {
"label": "均持仓",
"desc": "平均持仓天数。短线策略(5-20天)vs 波段策略(40-60天)。持仓越短资金周转越快,但交易成本占比越高。",
"see": "回测出场规则决定(tp止盈/sl止损/max_hold最长持有)"
},
"cagr": {
"label": "年化",
"desc": "年化收益率。温区表 = 该策略在【该温区】trades 按实际时间跨度复利年化(2026-08-16修正:原来线性放大对高频策略失真,如 b_td1 曾显示1547%假象)。",
"see": "⚠️小样本(<40笔)年化不可信,参考5y/10y长期口径"
},
"composite": {
"label": "综合",
"desc": "综合评分(0-100),多维度均衡度。完整公式:\n综合 = (收益分30 + 胜率分20 + 夏普分20 + 盈亏比分15 + 回撤分15) × 置信系数 × 效率因子\n各分项:收益分=min(总收益%,100)/100×30;胜率分=胜率%/100×20;夏普分=min(max(夏普,0),20)/20×20;盈亏比分=min(盈亏比,5)/5×15;回撤分=(1-min(回撤%,50)/50)×15。\n⚠️ 置信系数(样本可信度,具体打折方式):\n置信 = min(1, 成交笔数/40) × min(1, 覆盖月份/6)\n - 成交笔数<40 线性递减:20笔→0.510笔→0.255笔→0.125\n - 覆盖月份<6月 线性递减:3月→0.5,1月→0.17\n - 两者相乘:成交20笔×覆盖3月 = 0.5×0.5 = 0.25(打2.5折)\n - 成交≥40笔 且 覆盖≥6月 → 置信=1(不打折)\n⚠️ 效率因子(2026-08-17 新增,信号/成交比惩罚):\n效率 = 信号/成交比 ≤2→1.02~5→0.95~10→0.75>10→0.5\n - 比值过大 = 大量信号未实际成交(信号密集抢仓位/持仓重叠),质量打折\n - 例:b_td1 信号5000/成交353(比14.2)→ 效率0.5,综合分直接减半",
"see": "分数高=多维度均衡好。对比策略时优先看综合分+普适分;小样本(<40笔)/单窗口(<6月)/信号比(>10) 都会大幅扣分"
},
"sharpe": {
"label": "夏普",
"desc": "夏普比率 = 每承担1单位波动获得的超额收益。>2 优秀,1-2 良好,<1 一般。注意:回测夏普可能虚高(未计实盘滑点/流动性),12+ 的夏普是高频短线信号的典型特征,不可全信。",
"see": "信号级统计;高频短线策略夏普天然偏高"
},
"profit_factor": {
"label": "盈亏比",
"desc": "总盈利/总亏损 的比率。>1.5 良好,>2 优秀。<1 说明亏的比赚的多。与胜率互补:盈亏比2.0+胜率50% = 好策略;盈亏比1.2胜率70% = 平庸。",
"see": "信号级统计(平均盈利/平均亏损)"
},
"universality": {
"label": "普适",
"desc": "跨独立年份的有效性(0-100分):每年胜率>50%的年份占比 × 覆盖年数因子。100分=策略在覆盖的每个独立年份都有效,不是靠某次历史特例。50分=只有一半年份有效(可能靠某次大行情)。显示格式:分数 + 有效年/总年。",
"see": "2026-08-17重构:原「覆盖月份占比」无法识别特例策略(s2_panic曾虚高100分实际只靠2个月)。现在去掉最好一年仍有效的策略才算真普适(附 leave1 检验)"
},
"max_dd": {
"label": "回撤",
"desc": "组合模拟的最大回撤(%):资金从峰值到谷底的最大跌幅。回撤越低越稳。10%以内=稳健,20%+=高风险。温区表显示该温区组合模拟的回撤。",
"see": "组合模拟(10等分仓位)口径,非单笔"
},
"full_return": {
"label": "全参与",
"desc": "「全参与」模拟的总收益:不设10仓位上限(100槽近似),所有信号都参与。反映策略的原始信号质量,但实盘无法做到(资金/流动性限制)。",
"see": "与「最终资产」(10仓位模拟)对比看:差距大=信号质量好但仓位瓶颈大"
},
"capital_final": {
"label": "最终资产",
"desc": "组合模拟(10等分仓位、含交易费用0.2%)的期末资产,起始100万。这是更接近实盘的口径(仓位限制+成本)。",
"see": "10仓位组合模拟,含COST_RATE往返费用"
}
}
},
"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, best_regime, qualification, manual_available, qual_warning, trades_count}], regime_active[], regime_state}",
"description": "策略版本列表。summary_stats 含 win_rate/portfolio/portfolio_full/universalityregime_winrates 为每策略每温区表现(按 period_tag 从预计算表读);best_regime=适应温区;qualification={long_ok,mid_ok,short_ok,cagr_10y,cagr_2y,cagr_1y,bench_*}manual_available=手动可用性;qual_warning=警告文本;state 为三状态(active/available/unavailable"
},
{
"method": "GET",
"path": "/api/research/availability",
"returns": "{version: {available: bool, note, updated_at}}",
"description": "查询全部策略的手动可用性状态"
},
{
"method": "POST",
"path": "/api/research/availability",
"body": "{version, available, note?}",
"returns": "{updated, entry}",
"description": "设置单个策略的手动可用性(激活只能是可用的策略)"
},
{
"method": "POST",
"path": "/api/research/availability?batch=1",
"body": "{versions[], available, note?}",
"returns": "{updated: {version: entry}, count}",
"description": "批量设置策略可用性(前端「全可用/全不可用」按钮调用)"
},
{
"method": "POST",
"path": "/api/research/availability?init=1",
"returns": "{initialized: [[version, available]...], count}",
"description": "按标准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 核心计算",
"strategy_qualify.py — 资格评估(标准A) + 手动可用性 json 管理(data/strategy_availability.json",
"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_by_period.py / regime_perf_daily.sh — 温区表现重算(cron 17:15,按周期预计算)",
"strategy_research 表 — 策略版本+回测结果存储(含 market/period_tag/deprecated 字段)",
"strategy_regime_perf_by_period 表 — 每策略每温区每周期表现(含温区级组合模拟+线性年化)",
"market_regime 表 — 温区归因(date→regime,market 维度)+ 大盘基准年化",
"data/strategy_availability.json — 手动可用性状态(git 可追踪)",
"evolution/hypothesis_miner.py — 数据归纳假设引擎(方向一)",
"evolution/b_group_miner.py — B组策略挖掘管线(方向二,由果及因)",
"evolution/precompute_evolution.py — 进化中心预计算(假设/B组/资格 → evolution_center.json",
"data/evolution_center.json — 进化机制快照(研究Tab展示)",
"data/b_group_candidates.json — B组候选列表"
],
"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 优先);温区加权综合按温区时长占比加权各温区表现",
"温区年化(线性放大,非复利):温区组合总收益 × (窗口交易日数 / 该温区窗口内天数)——体现『如果全年都是该温区,策略年化收益率』;消除 portfolio_sim 复利在短跨度时的爆炸(如 v_lurk_bull 5笔同日曾算成 463万%",
"资格评估(标准Astrategy_qualify.evaluate_strategy):长期=10y适应温区年化>大盘10y;近期=2y>大盘2y;当下=1y>大盘1y。大盘基准从 market_regime 指数 close 现算",
"激活判定(strategy_router.route):三项资格达标(long_ok&&mid_ok&&short_ok)且手动可用(is_available)——替代旧『胜率≥50』标准",
"state 派生(server.py,不存储):active=∈active_set且手动可用且三项达标;available=手动可用且长期+近期达标;unavailable=手动不可用或长期不合格或已证伪或不在候选池",
"路由激活但资格不足的策略:降级为 available/unavailablecurrent 置 False(前端不高亮),state_reason 说明原因(如『路由激活但未三项达标(长期✓/近期✗/当下✗)』)",
"警告标记:可用策略 2y 年化<大盘 → ⚠️近期转差;不可用策略 1y 年化>大盘 → 🔄近期回升(提示可重新启用)",
"手动可用性(data/strategy_availability.json):新策略按标准A初始化(长期合格默认可用);未标记策略默认可用;激活只能是可用策略",
"候选池:A股=regime_perf 有记录的策略;港股=HK_STRATEGIES 定义的策略",
"1m/6m 周期温区数据映射到 1y 预计算表(_pt_chain);list_strategies 切窗版本集=静态字典∪strategy_research DISTINCT versionDB-only 策略如 s2_panic/v_lurk_*/v_mr* 不丢)",
"回测数据截止 2026-07-24,窗口派生锚定数据末端(非今天)",
"B组候选验证门槛(2026-08-16 教训):由果及因扫描的好果率提升(如60日前20%占比34.5%)≠策略能赚钱——必须通过模拟交易验证(tp10%/sl5%/maxh20,胜率≥50%且均收益>0)才算候选,否则标注为扫描噪声剔除"
],
"must_not": [
"不要在策略代码里硬编码 deprecated 集合(必须从 strategy_research.deprecated 读)",
"不要在策略代码里硬编码激活策略列表(必须读 data/strategy_weights.json + strategy_qualify 资格判定)",
"不要给派生行(derived_from)覆盖真实研究记录",
"不要用 period_tag 字典序排序取 trades(必须用 LENGTH 降序最长周期优先)",
"不要污染 A股温区(读 market_regime 必须带 market='a' 过滤)",
"不要让手动不可用的策略成为 active(激活必须是可用的策略)",
"不要用 portfolio_sim 复利年化作为温区年化(必须用线性放大,否则短跨度爆炸)"
],
"related_files": [
"server.py — /api/research/* 路由 + 资格评估 + 三状态派生 + 手动可用性",
"static/index.html — renderStrategyTable/renderRegimeTable/renderRegimeRow + 资格列/可用性开关/批量按钮",
"strategy_qualify.py — 资格评估 + 可用性管理(deploy/profile-scripts/",
"strategy_lab.py — 核心计算",
"hk_strategies.py — 港股策略",
"strategy_router.py — 双市场路由(matched 用标准A",
"strategy_period_rollup.py / regime_perf.py / regime_perf_by_period.py / regime_perf_daily.sh — 每日自动更新",
"deploy/profile-scripts/health_monitor_daily.py — 健康度监控",
"docs/decisions/2026-08-15-策略自我进化闭环重构.md — 进化闭环设计",
"evolution/hypothesis_miner.py / b_group_miner.py / precompute_evolution.py — 自我进化两方向",
"evolution/evolution_engine.py — 退化检测+假设验证+推送",
"deploy/profile-scripts/evolution_daily.py — 每周六22:00串行跑引擎+预计算"
]
}
}