Pipeline v4 Filter 集成测试报告
测试日期: 2026-06-29
数据基准日: 2026-06-26 (最新周五)
测试对象: etf_ml_pipeline_v54.py 中的 select_top12_with_limit v4五层过滤
对比参考: 独立脚本 filter_v4_analysis.py
1. v4 Filter 各层过滤统计
1.1 独立脚本(filter_v4_analysis.py)
独立脚本直接计算MA、斜率、偏差,不经过pandas panel。
| 过滤层 | 输入 | 输出 | 淘汰数 | 说明 |
|---|---|---|---|---|
| 总计 | 91 | - | - | 排除<250天数据的ETF |
| F1 空头排列 | 91 | 55 | 36 | close < MA20 < MA60 < MA120 |
| F2 短期趋势 | 55 | 33 | 22 | MA20斜率≥-0.0005, dev20∈(-4%,12%) |
| F3 MA60确认 | 33 | 30 | 3 | dev60>-8%, MA60斜率≥-0.001 |
| F4 长期方向 | 30 | 29 | 1 | left=1 (513090 港股), neutral=0 |
| F5 量价 | 29 | 29 | 0 | vol_ratio>0.3 |
| 最终通过 | 29 | 31.9% of total |
1.2 Pipeline(select_top12_with_limit / generate_outputs)
Pipeline通过 engineer_features() 生成 ma_bearish、ma_slope_20、ma_dist_20 等特征,基于panel数据进行过滤。
| 过滤层 | 输入 | 输出 | 淘汰数 | 说明 |
|---|---|---|---|---|
| 总计 | 65 | - | - | 最新日期panel中ETF数 |
| F1 空头排列 | 65 | 39 | 26 | ma_bearish > 0 (close<MA20<MA60<MA120) |
| F2 短期趋势 | 39 | 25 | 14 | MA20斜率≥-0.005, dev20∈(-4%,12%) |
| ├ slope | 11 | ma_slope_20 < -0.005 | ||
| ├ dev_low | 0 | ma_dist_20 < -0.04 | ||
| └ dev_high | 3 | ma_dist_20 > 0.12 (泡沫化) | ||
| F3 MA60确认 | 25 | 25 | 0 | dev60>-8%, ma_slope_60≥-0.03 |
| F4 长期方向 | 25 | 25 | 0 | left=0, neutral=0 (全部right) |
| F5 量价 | 25 | 25 | 0 | vol_ratio_20d > 0.3 |
| 最终通过 | 25 | 38.5% of total |
1.3 淘汰数差异分析
| 差异来源 | Standalone | Pipeline | 原因 |
|---|---|---|---|
| 总ETF数 | 91 | 65 | Pipeline panel有35只ETF在最新日期无数据/被合并丢弃 |
| F1淘汰 | 36 | 26 | 输入集不同导致 |
| F2淘汰 | 22 | 14 | 核心差异: 斜率定义不同 |
| F3淘汰 | 3 | 0 | 阈值不同: standalone price slope≥-0.001 vs pipeline ma_slope≥-0.03 |
| F4淘汰 | 1 | 0 | 513090不出现在pipeline panel中 |
| F5淘汰 | 0 | 0 | 一致 |
F2淘汰差异的关键原因:
- 独立脚本用
calc_slope(closes, 20)= 对收盘价做20日polyfit线性回归,斜率/closes[-1] - Pipeline用
ma_slope_20= MA20曲线自身的变化率(ma_20 / shift(ma_20, 10) - 1)
这是两个完全不同的指标:
- 价格斜率:反映价格趋势
- MA斜率:反映均线趋势(更平滑,滞后更大)
因此两者的淘汰结果有差异是预期行为,不代表有bug。
2. F1 淘汰详情(空头排列)
Pipeline F1淘汰了26只ETF(ma_bearish > 0),完整列表:
| 代码 | 名称 | 品类 |
|---|---|---|
| 159605 | 广发中证海外中国互联网30(QDII-ETF) | 中概 |
| 159745 | 国泰中证全指建筑材料ETF | 建材 |
| 159766 | 富国中证旅游主题ETF | 消费 |
| 159825 | 富国中证农业主题ETF | 畜牧 |
| 159852 | 嘉实中证软件服务ETF | AI |
| 159869 | 华夏中证动漫游戏ETF | 传媒 |
| 159937 | 博时黄金ETF | 黄金 |
| 159996 | 国泰中证全指家用电器ETF | 家电 |
| 510270 | 中银上证国企100ETF | 央企 |
| 512200 | 南方中证房地产ETF | 地产 |
| 512560 | 军工信息化ETF | 军工 |
| 512660 | 国泰中证军工ETF | 军工 |
| 512810 | 华宝中证军工ETF | 军工 |
| 512890 | 华泰柏瑞中证红利低波ETF | 宽基 |
| 512980 | 广发中证传媒ETF | 传媒 |
| 513730 | 华泰柏瑞南方东英新交所泛东南亚科技ETF(QDII) | 海外 |
| 515080 | 招商中证红利ETF | 宽基 |
| 515170 | 食品饮料ETF | 消费 |
| 515230 | 软件ETF | AI |
| 515250 | 智能汽车ETF | 新能源 |
| 515400 | 大数据ETF | AI |
| 515790 | 华泰柏瑞中证光伏产业ETF | 新能源 |
| 516110 | 国泰中证800汽车与零部件ETF | 汽车 |
| 516510 | 易方达中证云计算与大数据主题ETF | 云计算 |
| 516950 | 银华中证基建ETF | 基建 |
| 560080 | 汇添富中证中药ETF | 中药 |
说明:以上ETF均处于
收盘价 < MA20 < MA60 < MA120的空头排列状态,直接淘汰。
3. F4 长期方向判断结果
3.1 Pipeline F4 判断(25只F3通过ETF)
全部25只均为 right(右侧确认),无 left / neutral / turning。
| 代码 | 名称 | 品类 | F4信号 |
|---|---|---|---|
| 159001 | 易方达保证金货币A | 货币 | right |
| 159338 | 国泰中证A500ETF | 宽基 | right |
| 159339 | 银华中证A500ETF | 宽基 | right |
| 159591 | 富国中证A50ETF | 宽基 | right |
| 159686 | 国证2000ETF | 宽基 | right |
| 159845 | 华夏中证1000ETF | 宽基 | right |
| 159901 | 易方达深证100ETF | 宽基 | right |
| 159915 | 易方达创业板ETF | 宽基 | right |
| 159919 | 嘉实沪深300ETF | 宽基 | right |
| 159949 | 华安创业板50ETF | 宽基 | right |
| 159994 | 银华中证5G通信主题ETF | 通信 | right |
| 510050 | 华夏上证50ETF | 宽基 | right |
| 510180 | 华安上证180ETF | 宽基 | right |
| 510300 | 华泰柏瑞沪深300ETF | 宽基 | right |
| 510330 | 华夏沪深300ETF | 宽基 | right |
| 510500 | 南方中证500ETF | 宽基 | right |
| 511010 | 国泰上证5年期国债ETF | 债券 | right |
| 511220 | 海富通上证城投债ETF | 债券 | right |
| 512100 | 中证1000ETF | 宽基 | right |
| 513500 | 博时标普500ETF(QDII) | 美股 | right |
| 513880 | 华安日经225ETF(QDII) | 海外 | right |
| 560530 | 摩根中证A500ETF | 宽基 | right |
| 563300 | 华泰柏瑞中证2000ETF | 宽基 | right |
| 563360 | 华泰柏瑞中证A500ETF | 宽基 | right |
| 588450 | 招商上证科创板50成份增强策略ETF | 宽基 | right |
3.2 独立脚本 F4 淘汰
独立脚本F4淘汰1只:
| 代码 | 名称 | 品类 | F4信号 | dev250 |
|---|---|---|---|---|
| 513090 | 香港证券ETF | 港股 | left | -10.9% |
该ETF在pipeline panel中不存在(513090为含港股ETF,在最新panel日期因港交所停牌/数据缺失等原因未进入panel)。
3.3 F4 信号一致性
Pipeline F3与Standalone F3共有的21只ETF中,F4信号100%一致(全部right)。
4. 最终候选池(F1-F5通过)
4.1 Pipeline候选池(25只,按ML得分排序)
| # | 代码 | 名称 | 品类 | ML得分 | F4标签 |
|---|---|---|---|---|---|
| 1 | 588450 | 招商上证科创板50成份增强策略ETF | 宽基 | -0.4243 | right |
| 2 | 159994 | 银华中证5G通信主题ETF | 通信 | -0.6315 | right |
| 3 | 511220 | 海富通上证城投债ETF | 债券 | -0.9155 | right |
| 4 | 159915 | 易方达创业板ETF | 宽基 | -0.9643 | right |
| 5 | 159949 | 华安创业板50ETF | 宽基 | -1.0315 | right |
| 6 | 511010 | 国泰上证5年期国债ETF | 债券 | -1.0533 | right |
| 7 | 513880 | 华安日经225ETF(QDII) | 海外 | -1.1414 | right |
| 8 | 510500 | 南方中证500ETF | 宽基 | -1.4048 | right |
| 9 | 159001 | 易方达保证金货币A | 货币 | -1.6115 | right |
| 10 | 510050 | 华夏上证50ETF | 宽基 | -1.8780 | right |
| 11 | 513500 | 博时标普500ETF(QDII) | 美股 | -1.9681 | right |
| 12 | 159901 | 易方达深证100ETF | 宽基 | -2.0208 | right |
| 13 | 563360 | 华泰柏瑞中证A500ETF | 宽基 | -2.0807 | right |
| 14 | 512100 | 中证1000ETF | 宽基 | -2.1201 | right |
| 15 | 563300 | 华泰柏瑞中证2000ETF | 宽基 | -2.1235 | right |
| 16 | 510180 | 华安上证180ETF | 宽基 | -2.1260 | right |
| 17 | 159845 | 华夏中证1000ETF | 宽基 | -2.1281 | right |
| 18 | 560530 | 摩根中证A500ETF | 宽基 | -2.1364 | right |
| 19 | 159686 | 国证2000ETF | 宽基 | -2.1761 | right |
| 20 | 159339 | 银华中证A500ETF | 宽基 | -2.2891 | right |
| 21 | 159338 | 国泰中证A500ETF | 宽基 | -2.2908 | right |
| 22 | 159591 | 富国中证A50ETF | 宽基 | -2.3321 | right |
| 23 | 159919 | 嘉实沪深300ETF | 宽基 | -2.3347 | right |
| 24 | 510330 | 华夏沪深300ETF | 宽基 | -2.3566 | right |
| 25 | 510300 | 华泰柏瑞沪深300ETF | 宽基 | -2.3783 | right |
品类分布:
- 宽基: 19只 (76%)
- 债券: 2只
- 货币: 1只
- 通信: 1只
- 美股: 1只
- 海外: 1只
⚠️ 注:ML得分全为负数,说明模型在当前市场环境下对所有ETF都给出了偏悲观的预测。得分越高(越接近0)越好。得分范围:-2.38 ~ -0.42。
5. Top12 完整列表
品类限制:每品类最多3只,选取得分最高的。
| # | 代码 | 名称 | 品类 | ML得分 | F4标签 | 5日动量 | RSI |
|---|---|---|---|---|---|---|---|
| 1 | 588450 | 招商上证科创板50成份增强策略ETF | 宽基 | -0.4243 | right | +4.0% | 71 |
| 2 | 159994 | 银华中证5G通信主题ETF | 通信 | -0.6315 | right | -2.1% | 55 |
| 3 | 511220 | 海富通上证城投债ETF | 债券 | -0.9155 | right | +0.0% | 57 |
| 4 | 159915 | 易方达创业板ETF | 宽基 | -0.9643 | right | -1.3% | 53 |
| 5 | 159949 | 华安创业板50ETF | 宽基 | -1.0315 | right | -1.9% | 52 |
| 6 | 511010 | 国泰上证5年期国债ETF | 债券 | -1.0533 | right | -0.5% | 26 |
| 7 | 513880 | 华安日经225ETF(QDII) | 海外 | -1.1414 | right | +1.0% | 60 |
| 8 | 159001 | 易方达保证金货币A | 货币 | -1.6115 | right | +0.0% | 45 |
| 9 | 513500 | 博时标普500ETF(QDII) | 美股 | -1.9681 | right | -3.2% | 34 |
⚠️ Top12仅产出9只 — 因为候选池中19/25为宽基(限3只),仅6只非宽基(覆盖通信/债券/海外/货币/美股5个品类)。品类限制(max_per_cat=3)在此次候选池中无法填满12只。510500(宽基#8候选)因宽基已满3只被跳过。
6. 独立v4脚本 vs Pipeline v4 Filter 结果对比
6.1 最终通过列表对比
| 对比维度 | 独立脚本 | Pipeline |
|---|---|---|
| 总输入ETF | 91 | 65 |
| 最终通过数 | 29 | 25 |
| 交集(两者均通过) | 21 | |
| 仅独立脚本通过 | 8 | |
| 仅Pipeline通过 | 4 |
6.2 仅独立脚本通过的ETF(8只)
| 代码 | 名称 | 品类 | 为何pipeline未通过 |
|---|---|---|---|
| 159326 | 电网设备ETF | 电力 | Pipeline F1淘汰(ma_bearish)或不在panel |
| 159755 | 电池ETF | 新能源 | Pipeline F1淘汰或不在panel |
| 159959 | 银华中证央企结构调整ETF | 央企 | Pipeline F1淘汰或不在panel |
| 512880 | 证券ETF | 金融 | Pipeline F1淘汰或不在panel |
| 515880 | 通信ETF | 通信 | Pipeline F2淘汰(ma_slope_20 < -0.005 或 dev20>12%) |
| 562500 | 机器人ETF | AI | Pipeline F1淘汰或不在panel |
| 562800 | 稀有金属ETF | 稀土 | Pipeline F1淘汰或不在panel |
| 588120 | 国泰上证科创板100ETF | 宽基 | Pipeline F2淘汰(dev20>12%泡沫化) |
6.3 仅Pipeline通过的ETF(4只)
| 代码 | 名称 | 品类 | 为何独立脚本未通过 |
|---|---|---|---|
| 159591 | 富国中证A50ETF | 宽基 | 独立脚本F2淘汰(slope_20=-0.00068 < -0.0005) |
| 159686 | 国证2000ETF | 宽基 | 不在独立脚本etf_sector_map中或数据不足 |
| 512100 | 中证1000ETF | 宽基 | 不在独立脚本etf_sector_map中或数据不足 |
| 513500 | 博时标普500ETF(QDII) | 美股 | 独立脚本F2淘汰(slope_20=-0.00153 < -0.0005) |
6.4 差异根因分析
核心差异1:斜率定义不同
- 独立脚本: calc_slope(closes, 20) = 对收盘价做polyfit → 价格趋势斜率
- Pipeline: ma_slope_20 = MA20曲线自身变化率(ma_20 / shift(ma_20, 10) - 1) → 均线趋势斜率
这是根本性差异。MA斜率比价格斜率更平滑、响应更慢。例如:
- 513500(标普500ETF): 价格斜率=-0.00153(<独立脚本阈值-0.0005),但ma_slope_20 >= pipeline阈值-0.005
- 159591(富国中证A50ETF): 价格斜率=-0.00068(<独立脚本阈值),但ma_slope_20 >= pipeline阈值
核心差异2:F3斜率阈值不同
- 独立脚本: F3 slope_60 >= -0.001(价格60日斜率)
- Pipeline: F3 ma_slope_60 >= -0.03(MA60曲线斜率,backward 30日)
核心差异3:ETF输入集不同
- 独立脚本: 91只(排除<250天数据的ETF)
- Pipeline: 65只(最新panel日期有数据的ETF,35只因panel构造/合并时被丢弃)
- 丢失的主要是含港股数据的ETF(如513090)和较早时间序列不完整的ETF
7. 重叠率
7.1 最终通过列表重叠
| 指标 | 值 |
|---|---|
| 独立脚本通过数 | 29 |
| Pipeline通过数 | 25 |
| 交集 | 21 |
| 仅独立脚本 | 8 |
| 仅Pipeline | 4 |
| 重叠率 (取较大者作分母) | 21/29 = 72.4% |
| Jaccard相似度 | 21/33 = 63.6% |
7.2 F4 信号一致性
| 指标 | 值 |
|---|---|
| F3共同ETF数 | 21 |
| F4信号一致 | 21 (100%) |
| F4信号分歧 | 0 |
✅ F4
long_term_signal逻辑在两套实现中100%一致。
8. 结论与建议
8.1 v4 Filter集成状态确认
✅ v4五层过滤已正确集成到 select_top12_with_limit 中:
- F1-F5 五层过滤均在 apply_v4_filter / apply_v4_filter_final 中实现
- 过滤统计(各层淘汰数)会被记录并打印
- Top12选股前会先应用v4过滤缩小候选池
- 支持分层回退(放松F2→放松F3→允许F4 neutral)
8.2 独立脚本与Pipeline差异评估
⚠️ 两套v4过滤不完全等价,根因在F2/F3层的斜率定义不同:
1. 独立脚本用价格斜率 (polyfit收盘价)
2. Pipeline用MA斜率 (MA_20/shift(MA_20,L)-1)
这导致约72.4%的重叠率。建议:
- 在Pipeline中增加价格斜率特征(如 price_slope_20, price_slope_60)
- 或将独立脚本的F2/F3过滤逻辑与Pipeline对齐后再对比
8.3 Top12生成注意事项
⚠️ 当前候选池品类分布极度集中(19/25为宽基),导致品类限制后仅能产出9只Top12:
- 这反映了当前市场环境的特征:非宽基行业ETF多数处于空头排列
- 建议在品类限制后仍不足12只时,放宽宽基限制从3→6以填满Top12
- 或在回退逻辑中也加入"品类限制放松"步骤
8.4 F1淘汰ETF特征
26只F1淘汰ETF涵盖:军工(3)、AI(3)、新能源(2)、消费(2)、传媒(2)、地产、畜牧、黄金、中药、建材、汽车、基建、云计算、中概等方向。这些板块处于 close < MA20 < MA60 < MA120 空头排列中。
报告生成时间: 2026-06-29 14:28 CST
Pipeline版本: v5.4 (etf_ml_pipeline_v54.py)
独立脚本: filter_v4_analysis.py
数据源: etf_history.json (100 ETFs, latest date: 2026-06-26)