{
 "generated": "2026-11-06",
 "data_through": "2026-11-06",
 "roadmap": [
  {
   "round": 1,
   "title": "数据管道与指数级策略",
   "status": "done",
   "date": "2026-11-06",
   "scope": "接入创业板公开行情，重建回测引擎，指数级策略全部重跑。"
  },
  {
   "round": 2,
   "title": "创业板个股横截面因子",
   "status": "done",
   "date": "2026-11-06",
   "scope": "接入创业板个股日线面板，回测动量、反转、低波动与非流动性四个价格类因子；市值因子因缺历史股本未做，退市样本不可得，偏差已在因子研究页披露。"
  },
  {
   "round": 3,
   "title": "参数稳健性与压力测试",
   "status": "planned",
   "date": "",
   "scope": "滚动窗口、成本冲击、极端行情分段，给每条策略标注失效边界。"
  },
  {
   "round": 4,
   "title": "机器学习基线",
   "status": "planned",
   "date": "",
   "scope": "Alpha158 特征集 + 梯度提升树，严格按时间切分做样本外验证。"
  },
  {
   "round": 5,
   "title": "组合与容量",
   "status": "planned",
   "date": "",
   "scope": "把通过检验的信号组合起来，估算容量与冲击成本。"
  },
  {
   "round": 6,
   "title": "实盘跟踪框架",
   "status": "planned",
   "date": "",
   "scope": "信号每日更新、纸面跟踪、与回测的偏差归因。"
  }
 ],
 "rounds": [
  {
   "round": 2,
   "date": "2026-11-06",
   "title": "接入个股面板，做第一轮横截面因子检验",
   "status": "已完成",
   "summary": "指数级策略已经摊开，但“策略能不能下沉到个股”一直没有答案。本轮抓取创业板全部上市公司的后复权日线与成交额，按月末信号、次日建仓、等权五分位、实际换手计 10bp 成本，对动量、反转、低波动与非流动性四个价格类因子做分组、IC 与样本内外检验，结果单独成页。市值因子因为拿不到历史股本没有做，退市样本也拿不到——两项偏差都写在页面上，不藏。",
   "items": [
    "新增 build/fetch_universe.py：抓取创业板板块全部个股日线（东财公开接口，fqt=2 后复权），按最后缓存日期增量追加，缓存为 data/cn/stocks/*.csv。",
    "新增 build/cross_section.py：月末收盘形成信号、次一交易日建仓、等权五分位、按实际换手扣单边 10bp，输出多头/多空/同池等权/秩 IC/分组收益/样本内外，合并进 results.json 的 cross_section 段。",
    "新增 /factors.html 与导航入口：四个因子各有一段净值、分组与样本外表，另有“同池等权”基准行，避免把等权与小票效应算成因子 alpha。",
    "/upgrade.html 验证记录增加横截面因子表；部署自检与 sitemap 加入 /factors.html。",
    "小市值与机器学习两个文献策略的状态改为如实描述：面板已接入，但缺历史股本与财务数据，仍然不给收益数字。",
    "同步更新首页结论区、关于页的数据与局限、README 的数据口径与脚本清单。"
   ],
   "checks": [
    "factors"
   ],
   "next": "第 3 轮：对通过初测的因子做参数稳健性与成本压力测试，标出失效边界，而不是继续加因子。"
  },
  {
   "round": 1,
   "date": "2026-11-06",
   "title": "从美股因子库转向中国创业板",
   "status": "已完成",
   "summary": "站点原本回测的是 Kenneth French 的美股因子与行业组合。本轮把数据源、回测引擎、策略库与全部文案整体换成中国创业板：6 条公开行情序列、10 个可回测策略、2 个文献策略，并新增稳健性检验与这页迭代日志。",
   "items": [
    "新增 build/fetch_cn.py：从东方财富公开行情接口抓取并缓存 6 条日频序列（创业板指、创业板R、沪深300、中证500、国债指数、GC001），回测本身完全离线。",
    "重写 build/backtest.py：信号按当日收盘计算、次日生效，符合 T+1；无风险利率改用 GC001 实际利率，不再用美国 RF。",
    "策略库改为 10 个可回测 + 2 个文献策略，全部围绕创业板；旧的 14 个美股策略与文案下线。",
    "新增稳健性检验：200 日趋势的 6 组均线窗口、5 档成本假设、4 个分区间。",
    "新增本页 /upgrade.html 与 /assets/data/upgrade.json，记录每轮改了什么、验证了什么。"
   ],
   "checks": [
    "trend_ma",
    "cost_bps",
    "subperiods"
   ],
   "next": "第 2 轮：接入创业板成分股日度面板，回测小市值与横截面动量因子。"
  }
 ],
 "validation": {
  "parameter_sweep": {
   "trend_ma": [
    {
     "ma": 50,
     "full_sharpe": 0.455,
     "full_cagr": 0.1075,
     "oos_sharpe": 0.471
    },
    {
     "ma": 100,
     "full_sharpe": 0.266,
     "full_cagr": 0.0622,
     "oos_sharpe": 0.254
    },
    {
     "ma": 150,
     "full_sharpe": 0.187,
     "full_cagr": 0.0436,
     "oos_sharpe": 0.094
    },
    {
     "ma": 200,
     "full_sharpe": 0.374,
     "full_cagr": 0.0893,
     "oos_sharpe": 0.36
    },
    {
     "ma": 250,
     "full_sharpe": 0.525,
     "full_cagr": 0.1285,
     "oos_sharpe": 0.374
    },
    {
     "ma": 300,
     "full_sharpe": 0.509,
     "full_cagr": 0.1253,
     "oos_sharpe": 0.35
    }
   ],
   "cost_bps": [
    {
     "bps": 0,
     "full_cagr": 0.0928,
     "full_sharpe": 0.388
    },
    {
     "bps": 5,
     "full_cagr": 0.0893,
     "full_sharpe": 0.374
    },
    {
     "bps": 10,
     "full_cagr": 0.0859,
     "full_sharpe": 0.36
    },
    {
     "bps": 20,
     "full_cagr": 0.0791,
     "full_sharpe": 0.333
    },
    {
     "bps": 40,
     "full_cagr": 0.0655,
     "full_sharpe": 0.278
    }
   ]
  },
  "subperiods": [
   {
    "label": "2010-06 → 2015-12",
    "days": 1356,
    "strategies": {
     "market": {
      "cagr": 0.2168,
      "sharpe": 0.66,
      "max_dd": -0.5483
     },
     "trend": {
      "cagr": 0.1727,
      "sharpe": 0.642,
      "max_dd": -0.493
     },
     "ma60": {
      "cagr": 0.1599,
      "sharpe": 0.605,
      "max_dd": -0.4948
     },
     "dual": {
      "cagr": 0.2358,
      "sharpe": 0.748,
      "max_dd": -0.5483
     },
     "voltarget": {
      "cagr": 0.182,
      "sharpe": 0.674,
      "max_dd": -0.5014
     },
     "voltrend": {
      "cagr": 0.187,
      "sharpe": 0.899,
      "max_dd": -0.248
     },
     "relmom": {
      "cagr": 0.0849,
      "sharpe": 0.324,
      "max_dd": -0.5483
     },
     "indmom": {
      "cagr": 0.0279,
      "sharpe": 0.129,
      "max_dd": -0.5611
     },
     "riskparity": {
      "cagr": 0.0572,
      "sharpe": 0.554,
      "max_dd": -0.1203
     },
     "eqw": {
      "cagr": 0.1217,
      "sharpe": 0.52,
      "max_dd": -0.3835
     }
    }
   },
   {
    "label": "2016-01 → 2019-12",
    "days": 975,
    "strategies": {
     "market": {
      "cagr": -0.0956,
      "sharpe": -0.355,
      "max_dd": -0.5488
     },
     "trend": {
      "cagr": -0.0798,
      "sharpe": -0.746,
      "max_dd": -0.4201
     },
     "ma60": {
      "cagr": -0.0957,
      "sharpe": -0.736,
      "max_dd": -0.4366
     },
     "dual": {
      "cagr": -0.0202,
      "sharpe": -0.275,
      "max_dd": -0.3073
     },
     "voltarget": {
      "cagr": -0.0906,
      "sharpe": -0.479,
      "max_dd": -0.537
     },
     "voltrend": {
      "cagr": -0.0635,
      "sharpe": -0.753,
      "max_dd": -0.3796
     },
     "relmom": {
      "cagr": -0.0121,
      "sharpe": -0.089,
      "max_dd": -0.3525
     },
     "indmom": {
      "cagr": 0.0692,
      "sharpe": 0.324,
      "max_dd": -0.2226
     },
     "riskparity": {
      "cagr": 0.0347,
      "sharpe": 0.178,
      "max_dd": -0.0209
     },
     "eqw": {
      "cagr": -0.0268,
      "sharpe": -0.268,
      "max_dd": -0.31
     }
    }
   },
   {
    "label": "2020-01 → 2021-12",
    "days": 486,
    "strategies": {
     "market": {
      "cagr": 0.3818,
      "sharpe": 1.168,
      "max_dd": -0.2286
     },
     "trend": {
      "cagr": 0.2735,
      "sharpe": 0.897,
      "max_dd": -0.3032
     },
     "ma60": {
      "cagr": 0.1823,
      "sharpe": 0.7,
      "max_dd": -0.2249
     },
     "dual": {
      "cagr": 0.3818,
      "sharpe": 1.168,
      "max_dd": -0.2286
     },
     "voltarget": {
      "cagr": 0.413,
      "sharpe": 1.468,
      "max_dd": -0.1661
     },
     "voltrend": {
      "cagr": 0.334,
      "sharpe": 1.235,
      "max_dd": -0.2271
     },
     "relmom": {
      "cagr": 0.2648,
      "sharpe": 0.9,
      "max_dd": -0.2106
     },
     "indmom": {
      "cagr": 0.2428,
      "sharpe": 0.838,
      "max_dd": -0.2106
     },
     "riskparity": {
      "cagr": 0.0564,
      "sharpe": 1.837,
      "max_dd": -0.0097
     },
     "eqw": {
      "cagr": 0.181,
      "sharpe": 0.937,
      "max_dd": -0.1234
     }
    }
   },
   {
    "label": "2022-01 → 2026-11",
    "days": 1172,
    "strategies": {
     "market": {
      "cagr": -0.0524,
      "sharpe": -0.076,
      "max_dd": -0.5278
     },
     "trend": {
      "cagr": 0.0788,
      "sharpe": 0.36,
      "max_dd": -0.2955
     },
     "ma60": {
      "cagr": 0.1293,
      "sharpe": 0.571,
      "max_dd": -0.2072
     },
     "dual": {
      "cagr": -0.0018,
      "sharpe": 0.036,
      "max_dd": -0.4471
     },
     "voltarget": {
      "cagr": -0.0858,
      "sharpe": -0.348,
      "max_dd": -0.5542
     },
     "voltrend": {
      "cagr": 0.073,
      "sharpe": 0.416,
      "max_dd": -0.1946
     },
     "relmom": {
      "cagr": -0.0602,
      "sharpe": -0.183,
      "max_dd": -0.4853
     },
     "indmom": {
      "cagr": -0.063,
      "sharpe": -0.278,
      "max_dd": -0.4148
     },
     "riskparity": {
      "cagr": 0.0435,
      "sharpe": 1.135,
      "max_dd": -0.0191
     },
     "eqw": {
      "cagr": -0.0116,
      "sharpe": -0.087,
      "max_dd": -0.3213
     }
    }
   }
  ]
 }
}