# A/B 分档路由 · 个股用 B30 · ETF 用 A30

> 2026-09-13 定版 · 全市场 3555 只（2020-02→2026-09）+ 22 只 ETF（2018-06 起）· 持有 30 日 · 灾难线 −30% · 成本双边 0.15%

|KPI|个股→B30|净公平 Calmar **1.23**（含状态仓位）|每笔 +4.21% · 胜率 56.0% · 灾难线仅 3.8%|
|KPI|ETF→A30|ETF 上完胜 B30|每笔 +2.8% vs B30 +1.85%；跑赢死拿 16/21 vs 14/21|
|KPI|口径修正|**已交付公式B 漏了清洗条件**|信号 12,548→57,139（4.5×），每笔 +4.21%→+3.20%|
|KPI|接入|每日扫描已就绪|`python3 /root/.hermes/scripts/ab_daily_scan.py scan`|

## 01|路由表

| 标的类型 | 策略 | 买入条件（副图同口径） | 卖出 | 仓位 |
|---|---|---|---|---|
| **个股** | **B30 筹码跳升** | 获利筹码 ≤30 + 单日跳升 ≥8pp + 量比 ≥1.0 + 主力清洗转进场 | 持有 30 日到期卖；成本 −30% 灾难线 | 单席 = 总资金/20 × 系数（牛 1.0 / 防守 0.7） |
| **ETF** | **A30 低位回升** | 获利筹码 ≤30 + 环比回升 >0 + 量比 ≥1.2 + 主力清洗转进场 | 同上 | 同上 |

为什么不是反过来：

- **ETF 上 B30 明显更差**：22 只 ETF 里 A30 每笔 +2.8%、B30 每笔 +1.85% —— 指数的筹码不会一天跳 8 个百分点，「跳升≥8pp」条件在 ETF 上很少触发（B30 只有 121 轮 vs A30 的 235 轮）
- **个股上 B30 更强**：净公平 Calmar 1.23 vs A30 0.97；B30 信号少而精（12,548 笔 vs 30,446 笔），把仓位集中在最强时点；A30 信号太多，20 席一年只能装约 162 笔，97% 的信号用不上

## 02|口径修正（三处，必须知道）

| # | 问题 | 影响 | 处置 |
|---|---|---|---|
| 1 | **上一篇公式B 漏了「主力清洗转进场」** | 信号从 12,548 → **57,139**（4.5 倍），每笔 +4.21% → +3.20%，Calmar 1.23 → 0.42 | 本版公式B 已补上 `QL_A5>REF(QL_A5,1)` |
| 2 | 「当日筹码 ≤30」vs「前日筹码 ≤30」两种写法混用过 | 前日口径信号 +2,924 个（当日口径 100% 落在前日口径内），每笔 +3.58%、Calmar 0.46 | **统一用「当日 ≤30」**（头条口径，已验证） |
| 3 | 组合曲线是否含状态仓位（牛1.0/防守0.7） | 含权重 Calmar 1.21；不含 0.86（B30×30日） | 生产口径**含状态权重** |

**诚实说明**：我在 9/12 晚间的「B30 vs A30 具体差别」「风格分档」「ETF 测试」三份分析里用了「前日 ≤30」的变体，与头条 B30（当日 ≤30）不是同一口径。本报告已用正确口径重算全部数字；两份旧报告的相对结论（A30 逐笔质量更好、B30 组合更强）不变，但绝对数字以本报告为准。

## 03|四个口径的全市场对照（同一份数据）

| 口径 | 信号点 | 轮次 | 胜率 | 每笔 | 去尾10% | −30%触发 | CAGR(中位) | 回撤 | Calmar |
|---|---:|---:|---:|---:|---:|---:|---:|---:|---:|
| **B30 当日（生产采用）** | 14,227 | 12,548 | 56.0% | +4.21% | +2.78% | 3.8% | 21.1% | -26.6% | 0.8 |
| B30 前日（旧分析用） | 17,151 | 14,953 | 54.6% | +3.58% | +2.23% | 4.0% | 14.1% | -29.9% | 0.46 |
| B30 当日无清洗（误交付版） | 108,429 | 57,139 | 54.1% | +3.2% | +1.85% | 3.3% | 12.9% | -31.7% | 0.42 |
| A30（公式A） | 49,126 | 30,446 | 57.6% | +4.0% | +2.97% | 5.1% | 19.7% | -29.1% | 0.69 |

注：本表 Calmar 为**不含状态权重**的净公平口径（随机分配×60 取中位）；bt47 口径（含状态权重）下 B30 当日 = **1.23**、A30 = **0.97**。

## 04|ETF 上四个口径对照（22 只，未复权）

| 口径 | 覆盖 ETF | 轮次 | 每笔 | 胜率 | 跑赢死拿 |
|---|---:|---:|---:|---:|---:|
| **A30（生产采用）** | 21 只 | 235 | +2.8% | 51.9% | 16/21 |
| B30 当日（个股口径） | 21 只 | 121 | +1.85% | 47.1% | 14/21 |
| B30 前日 | 21 只 | 144 | +1.15% | 45.8% | 13/21 |
| B30 当日无清洗 | 21 只 | 347 | +0.88% | 49.9% | 17/21 |

**分组表现（A30）**：防御红利最稳（每笔 +2.86%、胜率 69.0%、跑赢死拿 5/6）；宽基次之（每笔 +4.93%）；医药消费最弱（+0.69%）。

## 05|每日扫描接入

脚本：`/root/.hermes/scripts/ab_daily_scan.py`

| 命令 | 作用 |
|---|---|
| `python3 ab_daily_scan.py scan` | 扫当前池（默认读生产持仓清单 `scan_holdings.json`），输出每只标的的信号状态 |
| `python3 ab_daily_scan.py update` | 仅更新 K 线缓存（腾讯前复权，分段拉取避开 ETF/次新股的 640 根截断） |
| `python3 ab_daily_scan.py scan --pool <x.json>` | 用自定义池（格式同 scan_holdings.json） |

行为：

- **自动识别 ETF 与个股**（代码前缀）→ 分别套 A30 / B30，不需要配置
- 数据源复用生产链路（`holdings_daily_scan.update_one` → `/tmp/etf_daily/*.csv`），口径与生产完全一致
- 仓位系数取自 `risk_overlay`（上证 20 日 >+2% 牛 1.0 / <−4% 防守 0.7）
- 持仓状态、到期卖出（30 日）、−30% 灾难线都写在输出里；状态存 `/root/.hermes/state/ab_scan_last.json`

**2026-09-11 收盘实跑（8 只持仓）**：状态=牛/系数1.0，买入信号 0 个 —— 8 只全部不满足入场条件（英杰筹码 44.1、量比 1.00、清洗未；半导体设备 ETF 筹码 9.8、量比 1.19、清洗未）。

## 06|选股公式（通达信，复制即用）

### 个股 · B30（筹码跳升）

```
QL_HLP:=WINNER(CLOSE)*100;
QL_JJ:=QL_HLP-REF(QL_HLP,1);
QL_LB:=V/REF(MA(V,5),1);
QL_A1:=REF((LOW+OPEN+CLOSE+HIGH)/4,1);
QL_A2:=SMA(ABS(LOW-QL_A1),13,1)/SMA(MAX(LOW-QL_A1,0),10,1);
QL_A3:=EMA(QL_A2,10);
QL_A4:=LLV(LOW,33);
QL_A5:=EMA(IF(LOW<=QL_A4,QL_A3,0),3);
XG:QL_HLP<=30 AND QL_JJ>=8 AND QL_LB>=1 AND QL_A5>REF(QL_A5,1);
```

### ETF · A30（低位回升）

```
QL_HLP:=WINNER(CLOSE)*100;
QL_JJ:=QL_HLP-REF(QL_HLP,1);
QL_LB:=V/REF(MA(V,5),1);
QL_A1:=REF((LOW+OPEN+CLOSE+HIGH)/4,1);
QL_A2:=SMA(ABS(LOW-QL_A1),13,1)/SMA(MAX(LOW-QL_A1,0),10,1);
QL_A3:=EMA(QL_A2,10);
QL_A4:=LLV(LOW,33);
QL_A5:=EMA(IF(LOW<=QL_A4,QL_A3,0),3);
XG:QL_HLP<=30 AND QL_JJ>0 AND QL_LB>=1.2 AND QL_A5>REF(QL_A5,1);
```

下载版（UTF-8 BOM，避免中文乱码）：[选股公式_AB分档_v2_20260913.txt](http://47.113.231.110/选股公式_AB分档_v2_20260913.txt)

## 07|局限

- ETF 用**未复权**数据（腾讯 qfq 对 ETF 只给 640 根）；分红品种真实收益略高，两边同口径不影响相对结论
- 变体对照只做了 60 次随机分配，Calmar 差异小于 ±0.1 的部分不可区分
- 「个股用 B30」的优势来自 20 席口径下的实测；放大到 50 席以上时 B30 的信号量可能不够填满席位（需另测）
- 灾难线 −30% 触发率 B30 3.8%、A30 5.1%，均为历史触发率，不代表未来

<div class='foot'>脚本 /root/ths_analysis/winner_test/{bt60_variants,bt61_etf_variants,make_report26}.py · 扫描器 /root/.hermes/scripts/ab_daily_scan.py · 生成 2026-09-13</div>