支持本地数据导入、参数可调(MA周期 / 动量周期 / 仓位矩阵 / 共识算法), 前端自动计算 MA20、20 日动量与四象限,折线图背景标注象限区域与切换点,全视图实时联动。
python -m http.server 8123 后访问
http://127.0.0.1:8123/index.html,可加载完整历史(2021 年至今)并获得全部按需数据。
支持导入真实日线数据(CSV / JSON),前端自动计算 MA、动量与四象限。也可继续使用内置演示数据。
MA周期 + 动量周期 个交易日才能计算完整指标YYYY-MM-DD 或 MM/DD · 建议使用前复权数据
调整计算参数与策略设置,点击 「应用配置」 后全视图自动重算。所有参数保存在浏览器本地。
纵轴为价格相对 MA 的位置(结构),横轴为动量(动能)。卡片底部显示当前选中指数的实际天数。
折线图背景色块标注各象限区间,菱形标记标识象限切换点。叠加 MA 线与动量副图;单指数视图可切换叠加 5 / 10 日短动量线(固定周期、只服务读盘,不改「动量周期」参数,也不参与象限与回测)。开启 准入门标记 后,每只品种会按所选区间标出「在场日基准复合 − 空仓日基准复合」是否为正(R6 判据),同样只是标注:不改象限、不改仓位、不改回测 —— 它的事前考试结论(五门槛 2/5 未上线)在「方案评估 → 考试台账」。在多指数对比视图里它还顺手做减法:判为「剔除」的品种从折线图与时间线里整行隐藏(共识行仍按全宇宙计算),行尾折叠条或图例上的金色划线项可一键展开成淡出对照;单指数视图与重叠共识视图不受影响。
—
行为沪深300总环境象限,列为风格指数象限,单元格为建议仓位。金色边框为 当前状态。 这是人工执行参考:矩阵只驱动本面板,不参与任何回测(回测仓位一律走上面的仓位状态机)。
总仓位由沪深300控制,风格指数只能收缩、不能扩张
把全部 申万二级板块拆到成分股层:每只板算上涨率、涨停数、等权/加权涨幅与
绑架度(绑架度 = 流通市值加权 − 等权:正 = 指数被权重扛着、多数股没涨;
负 = 小票普涨、权重在拖)。数据来自盘后成分股截面(腾讯现役名单 ∪ 申万官方科创板归属),
全部数值由数据侧一次算好,本面板只做投影、不另算一套指标。
跨日趋势迷你图需攒满 3 个盘后档才渲染,不足期间只显示当日截面;
本表不跟随顶部「分类显示/隐藏」筛选(与数据源卡片同类处理);
点板块名可把主图切到该板块(pt01 板块码)。
把选中的板块再往下拆一层:前 5 大流通市值(含各自占板块市值的比例 ——
集中度的微观来源、「绑架度是谁贡献的」直接可读)、当日涨停名单与
当日最强 / 最弱个股。全部取自盘后成分股截面的预聚合投影,
本面板只做投影、不另算一套指标;前 5 市值占比合计恒等于广度表的
「前5集中」列(同一口径,两侧只差四舍五入)。
在这里换板块只影响本面板,不会切主图(要切就去上面的广度表点板块名);
本面板不跟随顶部「分类显示/隐藏」筛选。
「查看全部成分」按需加载当日全市场名单(约 5 千只,单独 JSON、不进页面本体)——
文件缺失时按钮自动降级,不影响上面的结构画像。
持仓清单里点板块结构格的 ⤵ 会直接跳到本面板并选中该板块。
把全部品种在读数日的目标仓位摊成一张执行清单:主表只列仓位 > 0 的,其余收进下方折叠。
仓位一律取自 singleIndexPos() —— 与回测、图表仓位带、tooltip 同一个入口;
本面板不产生新信号,也不采用上面那张人工矩阵的仓位(矩阵只驱动它自己的面板、不参与任何回测)。
时序是 T+1:读数日的收盘信号由次日承担收益,所以这张表读的是
「下一个交易日开盘前该拿哪些、各拿多少」。
读数日随所选区间移动(默认「按年 · 当年」= 区间末日即最新交易日;把区间拖到历史段就是那段的末日);
若该日 bar 来自盘中刷新,信号尚未收盘确认,读数会继续变。
「合计目标仓位」是各指数独立口径相加、不是组合权重:超过 100% 意味着要杠杆才能全额执行,
等比铺平请按「各自仓位 ÷ 合计」折算。
最右「板块结构」列是申万二级行对应的盘后成分截面投影(集中度 / 涨停数 / 成分变动 / 当日龙头,
仅覆盖申万二级、不跟随顶部分类筛选):结构数值的 asof 以列头标签与画像页为准,
与读数日、detail 档可能不同日;点行内 ⤵ 跳到该板块的结构画像,
持仓板块的当日龙头(= 该板流通市值 top1)见本列「龙头」段,其历史表现见回测区「板块龙头组合回测」。
基于当前数据的简化回测,参数来自上方配置面板。信号在当日收盘确认、次一交易日承担收益(T+1),调仓成本记在信号日。回测结果为 示意性,实盘需完整样本外验证。
另提供板块龙头组合回测:每个申万二级板块买流通市值龙头(top1 × 124 板等权、月度调仓),基准为 124 板块指数等权——
龙头身份为样本内口径(当前截面排名套历史,无数据源可消除该偏差),同面板的成交额龙头是全 PIT 干净对照线,两线之差即身份偏差的上限估计。
前端自动计算 MA 与动量,按双轴划分四象限。
四状态逐日推演基础仓位,再由 ATR 波动率缩放为实际仓位,仓位变动触发调仓。
逐日调仓,按仓位变动计算交易成本。
分象限统计收益,区分仓位择时与指数本身收益。
策略:仓位状态机择时 · 基准:当前指数买入持有
ⓘ 单指数回测由 EMPTY / TRIAL / HOLD / REDUCE 四状态机给出当日基础仓位 (试仓 30% → 一步满仓 → 减半 → 归零),再经 ATR 波动率缩放得到实际承担收益的仓位: 实际仓位 = 基础仓位 × min(1, 目标年化波动 / ATR 隐含年化波动),目标波动与免调带在上方「仓位状态机」区块配置(目标 0 = 关闭缩放),ATR 周期默认 14 日。ATR 同时参与减仓触发(单日跌幅 > 1.5×ATR)与清仓触发(自持仓峰值回撤 > 2.5×ATR),参数默认值在代码内,暂未在面板暴露。不受仓位矩阵影响;建仓需连续 2 日 bull 且动量达标,清仓另由「跌破 MA 缓冲+动量转负 / 象限转坏连续 3 日 / 峰值回撤 8%」触发,之后冷却 0 个交易日。参数在上方「仓位状态机」区块调整,图内底部金色面积即当前仓位带(已含 ATR 缩放)。 基准 = 当前选中指数的买入持有,切换指数时基准同步切换;上文仓位矩阵只驱动「多指数冲突矩阵与仓位建议」面板,不参与任何回测。 净值图另画一条同暴露无择时灰点线(恒定仓位 = 本指数的日均在场,全程不调仓、与买入持有同样不记成本): 它与金色线的差才是买卖点的功过,与蓝色满仓线的差里绝大部分只是「没在场」。 低暴露参数在「vs 买入持有」口径下必然被判成大负超额,请先看这条线再下结论。 另有动量绝对水平减仓(默认 6%,面板设 0 即关闭):持仓中动量跌破设定值即减半。 51 只实测它是唯一「更少在场、更少换手、收益与择时α同时更好」的改动 (均值总收益 4.25%→6.28%、择时α +3.56→+5.62pp、夏普 0.07→0.11、在场 16.7%→13.8%), 机理是「动量水平」在横截面上仍有预测力,而「价涨动量跌」的背离形态没有; v6 起阈值 4%→6%(申万二级 124 只全样本单参数夏普 +0.04,与试仓一步满仓并列最佳)。
另有一条默认关闭的实验分支「5 日快线离场」(面板设 0 = 关闭):持仓中 5 日动量跌破
−该值即清仓,与图上那条 5 日线同口径。加它的依据是持仓段实测(npm run report:mom)——
段内 5 日首次转负比真清仓中位早 8 个交易日,20 日线只早 1 天、还有 46.2% 的段全程不转负;
但同一份记录里「转负就走」的中位收益 −0.98%(有利)、均值 +0.12%(被错过主升的右尾吃掉)。
它已经考过了:结论是不成立(npm run report:fastexit,指纹 9361a1c3)——
0.5% / 2% / 4% 三档在拼接样本外的择时α 全输默认档(−1.78 / −0.93 / −0.82pp vs −0.55pp),
逐折α差平均全为负,连样本内都不如默认档。领先 ≠ 有增益。
所以默认关着,只在参数对比表里以三档扰动出现,供你手动试;
完整判定与出处见「方案评估 → 考试台账」。
基于当前选中指数区间
把持仓清单的规则逐日重放:区间内每个交易日都按同一规则生成全部品种的目标仓位,等权聚合、T+1 复合。 基准 = 同清单等权买入持有;灰点线 = 同暴露无择时——它与金线的差才是调仓时点的功过,与蓝线的差绝大部分只是「没在场」。
基于当前区间
每日目标仓位 > 0 的只数(面积)与合计目标仓位(折线)
主线(闸门版):只在板块满足上升推进时才持有该板龙头——闸门与「持仓清单」同一入口(状态机仓位,
空仓 30% → 试仓 30% → 持仓 100% → 减仓 地板 20%);权重按在位板块归一化(满仓运作),
月度调仓、T+1、单边 0.15% 成本。
无闸门对照三线:A = 流通市值龙头全仓(top1 × 124 板等权,样本内口径)、B = 成交额龙头(全 PIT)、
基准 = 124 板块指数等权买入持有(不含成本)。闸门的可执行性边界(年化换手 / 区间成本)在指标卡与注记里。
在同一区间下把每个会被回测内核消费的参数单独扰动一档,重跑全部 175 只指数的状态机+回测,
看结论会不会翻。看的是盘面稳不稳(离散度、跑赢只数、分年度胜负),
不是找最漂亮的一行。跑完可导出 JSON / CSV 存档(带基线配置与结果指纹),
命令行侧 npm run report:pc 走同一套内核,产出的记录与这里逐位相同。
从逻辑严谨性、可执行性、数据可得性、抗过拟合、风险控制、流动性适配六个维度打分。
方案的双层架构与参数化设计思路正确,冲突处理规则清晰,具备工程可实施性。 参数可调提升了抗过拟合能力,但仍需样本外滚动验证确认。 科创50择时效果存疑与流动性约束两项风险需在实盘前解决。
npm run report:pc 落盘复跑
这一轮把四个想法各自考了一遍。判据、折切分、成本倍率全部走页面自己的内核
(pcWalkScan + pcWfGatesOf,五条上线门槛事前写死),
所以这里的数字与面板「参数对比 → 样本外滚动验证」同源。
日线每天在长,绝对值会漂 —— 引用时请连指纹一起记,指纹变了就是数变了。
读数层它确实领先:持仓段内 5 日首次转负比真清仓中位早 8 个交易日,
10 日早 3 天,20 日只早 1 天,且 46.2% 的段 20 日线全程不转负;
清仓那天 20 日动量还为正占 56.9%。但把它写成规则(阈值 0.5% / 2% / 4% 三档),
拼接样本外择时α −1.78 / −0.93 / −0.82pp,全输默认档的 −0.55pp,
逐折相对默认的α差平均 −0.35 / −0.14 / −0.05pp,连样本内都不如默认档;
换手 722%→906%、在场 13.8%→9.7%。
教训:领先 ≠ 有增益。参数 smFastMomExit 默认 0 = 关闭
(回归钉着「默认配置下零触发、仓位与现网逐位一致」的惰性合同),面板上仍可手动开。
npm run report:mom 指纹 4d68277b ·
npm run report:fastexit 指纹 9361a1c3图上那两条线(右上「短动量」开关)只进显示层:不进 config、不碰象限与状态机 (开关前后回测净值逐位相同,有回归断言)。把它们正负拼成 8 种组合状态, 在 60,027 个「指数·交易日」观测上看有没有预测力:描述侧极干净 —— 三周期同正的日子持仓率 81.2%、三负只有 1.0%,1,276 次建仓 88% 落在三同上, 清仓事件后 10 日 −0.36%(说明卖点方向是对的)。但预测侧基本是空的: 持仓语境里可比的 12 个格子,前后对半同号的只有 2 个(17%), 而纯噪声下这个比例本就接近一半。 ⇒ 组合状态用来解释买卖点,不用来生成买卖点。
npm run report:combo 指纹 149d673c先验来自 §评估区那条老判断 —— α 的正负写在品种属性里(与基准年化波动相关 +0.571), 所以该修的是准入不是参数。事前检验(属性只允许用考核窗之前的数据、8 条规则事前写死) 里 7 条规则的样本外α增益为正,但只有 R6「在场日基准复合 − 空仓日基准复合 > 0」 同时满足三块同号 + 反向成立 + 名单稳定(相邻复核重叠 85%~90%)。 五门槛考试(名单工坊窗冻结、38/51 只):样本外α从 −0.55pp 收窄到 −0.15pp,成本 2× 由 −0.22% 翻正到 +0.09%,回撤 −3.53%→−2.71%; 但 G1(样本外正α)与 G2(不输买入持有)仍不过,门槛通过数 2/5。 代价在表外:被剔的 13 只(红利、银行、煤炭、石化、军工…)同期被动年化 7.39%, 高于保留组 5.87% —— 这是拿 −1.52pp 的 beta 换 α 改善。 另外别拿样本内那个 +11.33pp 说事:它是"低波动品种拖累"的构成效应,不是新增信息。
npm run report:admit 指纹 f5e10bb4 ·
npm run report:admit:oos 指纹 36e70eb5
现实里清单要复核,所以把 R6 改成每 21 交易日用「复核日之前」的数据重算
(51 槽位等权、未准入品种当日置零为现金,三档走同一个 pcWalkScan)。
结果更好一点但没跨过门槛:样本外α −0.55pp → 冻结 −0.15pp → 滚动 −0.02pp,
2× 成本 +0.20%,逐折Δα平均 +0.31pp(3/4 为正),而复核扰动极小
(23 次复核、名单进出合计 28 人次)。门槛通过数仍 2/5。
复核周期敏感性 5 / 21 / 63 / 120 日 → α −0.27 / −0.02 / −0.05 / +0.01pp:
周复核最差(追噪声);120 日那档 G1 擦线转正是同一块 OOS 上挑最优,不算结论。
npm run report:admit:roll(可 REVIEW=5|21|63|120)指纹 5c6685cc五阶段推进,每阶段有明确产出与验收标准。
修正象限命名、明确复权方式、定义边界与unknown处理规则。
MA、动量、四象限、连续区间全部由前端自动计算。
参数面板可调,共识算法可切换,配置与数据支持导入导出。
回测区块已内置「参数对比」:单参数扰动 + 成本 1×/2×/3× 压力测试, 输出 175 只等权聚合的离散度与跑赢只数(在完整样本上直接可用)。 区间不足约 3 年时拒绝运行,避免在短样本上产出参数结论。 结果现在能沉淀成记录:面板导出 JSON / CSV / 剪贴板,命令行 npm run report:pc 落盘同一份,每条记录带「区间 + 基线配置 + 指纹」, 同指纹=可复现,DIFF=存档 可逐组比对。 扰动集本身也补齐了盲区:现在覆盖单指数内核消费的全部 25 个参数 (止盈 / 减仓地板 / 动量回落 / 波动免调带 / 量能条件 / MA 斜率 …), 并由回归与 npm run probe:pc 盯着两件事 —— 不许有「与基线逐位相同」的死扰动,不许把共识层的字段当被扰过。 最后一块也补上了:同一批仓位按市场状态(宽基锚 MA120 切的牛 / 震荡 / 熊段, 尺子固定不参与扰动)和品种属性(基准年化波动二分高 / 低两组)两条正交轴重算, 直接量化「换种行情还成不成立」—— 实测 45 个扰动档里 32 档至少在一种行情里与全样本反号, 而低波动组 α 在 45/45 档全为负(高波动组 0/45 为负)。 剩下的样本外滚动属于第 5 阶段。
训练窗 3 年 → 检验窗半年滚动 4 折(选择只看训练窗,拼接 OOS 467 个交易日), 成本 1×/2×/3× 各测一遍,五条门槛事前写死。 实测 2/5 通过 —— 未达上线门槛:默认参数在样本外 α −0.55pp(样本内是 +5.67pp), 跑输同段买入持有 5.42pp,成本翻倍后 OOS 年化转为 −0.22%。 结论是「不上、继续纸面跟踪」,而不是再调一档参数。