# 中证医疗指数接入+策略优化 (2026-08-26)

## 指数选择
- 选定 **399989.SZ 中证医疗**: 医药ETF监测组最大标的512170医疗ETF华宝跟踪它, 覆盖医疗器械/医疗服务/CXO/医美, 是医药医疗板块最代表性宽基
- 数据: tushare `index_daily(ts_code='399989.SZ')` 2015起2830条, 列结构与现有idx_*.csv一致
- 备选未选: 中证医药卫生000933(更广义含药)、300医药000913(沪深300医药)

## 策略图v1→v2演进
**v1(5策略, 参照AI/半导体族直接套用)**: 宽买锐进/双MA进取/中买均衡/极致收益/回撤触发卖
- 表现: 宽买锐进112.5% Sharpe2.06 Calmar3.09 | 极致收益98% | 回撤触发卖90.2% | 双MA进取48% | 中买均衡45.9% | BH 26.7%
- 用户指出"双MA进取和中买均衡似乎没有优势"→支配分析确认: 收益只有最优一半, Sharpe/Calmar全面落后, 回撤无优势(被宽买锐进全面支配)→删除

**v2(3策略, 差异化定位)**:
- 宽买锐进 (ma200/vol20/买30/卖90/0.3/2.5): Sharpe王 2.06, 收益王 112.5%
- 医疗长线 (ma250/static/买40/卖80/0.5/5.0): **Calmar王 3.56**(网格搜索发现, 收益111.9%回撤-14.0%)
- 回撤触发卖 (ma200/买20/卖85/dd机制): 风控王, 回撤-14.3%

## 网格搜索关键发现
- 960组合(ma∈[60,150,200,250]×vol∈[static,vol20]×bl∈[10,15,20,30,40]×sl∈[80,85,90]×bp∈[0.3,0.5]×sp∈[1.5,2.5,3.0,5.0])
- **Calmar TOP15全是ma=250** → 医疗指数250日线优于200(趋势更稳滤噪)
- **高sell_power(5.0)在医疗显著有效** → 卖出越彻底回撤越小
- ⚠️ 网格回测必须限定BT_START(2024-09-20), 全历史含2015熊市→所有组合mdd<-20%被过滤
- ⚠️ load_index_data返回df索引是RangeIndex但索引名='trade_date', 按日期过滤会TypeError; 自己构造(读CSV+照SOP算ma/dev/pct/vol列)最可控

## 接入cron推送(5处改动)
1. update_all_a_share.py INDICES +('399989.SZ','idx_399989.csv')
2. generate_sector_strategy_charts.py main()末尾加段(UTF-8文件read_file识别为binary, 用python脚本按字符串定位插入; 插在黄金段outputs.append后)
3. strategy_config.json indices +中证医疗条目(base_color #4E8C5A)——a_share_summary.py唯一数据源
4. a_share_summary.py修复: vol_type='static'时跳过dyn_vol列(原代码对所有vol_type生成f'{vol_type}_{ma}'列→KeyError 'static_250')
5. jobs.json b61e55ba1377 prompt: 8指数→9指数, 图清单+strategy_399989.png, 9张→10张, 36策略→39策略, 总结"8个指数"→"9个指数"
6. fetch_sector_etf_data.py SECTOR_ETFS +399989(5只: 512170/159992/512010/515120/159570), 单独跑该指数fetch

## 各主题ETF监测 正负相抵检查 (2026-08-26)
用户问"多基金求和是否确定正负相抵"—检查6主题CSV:
- 公式: daily_pct = (Σ份额变动×当日价) / (Σ份额×当日价) × 100, 净额口径(同北向净买入)
- **相抵程度与基金数量/主题宽度正相关**: 旧经济16只净/总额=0.43(最重), 科技20只0.54, 国家队23只0.58, 医药6只0.67, 黄金6只0.73, 港股6只0.80(最轻)
- 极端对冲日: 国家队39天/科技47天/旧经济36天出现"总额>50亿但净<10亿"(套利盘+机构调仓同日对冲)
- **零值≠数据缺失**: A500 ETF 2024-10上市前fillna(0)合理(186-211天零值=上市前区间); 全部主题缺失=0
- 口径判断: 净额口径对"方向性监测"正确, 但对冲日显得"平静"; 用户决定不加总额活跃度指标
- 通用检查脚本模式: 读CSV→change_列求和vs绝对值求和→净额/总额比→极端对冲日计数→asset_列零值天数(上市前)→缺失计数
