245 lines
20 KiB
JSON
245 lines
20 KiB
JSON
{
|
||
"module": "strategy",
|
||
"version": "2.0",
|
||
"purpose": "策略研究模块。策略版本管理、回测、温区自适应路由、资格评估(标准A)、手动可用性把关、三状态模型、自我进化机制(数据归纳假设+B组挖掘),以及研究 Tab 的版本迭代对比表格(含综合/普适评分体系)。",
|
||
"human_help": {
|
||
"title": "策略研究(版本迭代对比)",
|
||
"description": [
|
||
"本模块是 MoFin 的策略研究面板:管理所有策略版本的迭代历史、回测结果、温区自适应路由(A股/港股独立温区)。",
|
||
"策略版本按【适应温区】展开成 6 张表(A股当前市/港股当前市/A股其余2市/港股其余2市)——每个策略只在它的适应温区(best_regime)表显示一行,所有列(胜率/平均收益/笔数/均持仓/年化/综合/夏普/盈亏比/普适/回撤)都是该策略在【适应温区】的数据,与所选周期一致。",
|
||
"策略有三种状态:🟢 激活(当前温区匹配 + 手动可用 + 三项资格达标)/ 🔵 可用(手动可用 + 长期+近期达标,当下待观察)/ 📚 不可用(手动不可用或长期不合格或已证伪)。",
|
||
"数据每日自动更新:strategy_period_rollup(17:05 派生 1y/2y/5y 窗口统计)+ regime_perf_daily(17: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.5,10笔→0.25,5笔→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.0;2~5→0.9;5~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/universality;regime_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万%)",
|
||
"资格评估(标准A,strategy_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/unavailable,current 置 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 version(DB-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串行跑引擎+预计算"
|
||
]
|
||
}
|
||
} |