行业ETF轮动策略实战(二):精选候选池——打造你的赛道武器库

发布时间:2026/6/10 3:56:33

行业ETF轮动策略实战(二):精选候选池——打造你的赛道武器库 摘要本文是“行业ETF轮动”系列专题的第二篇。在上一篇中我们理解了行业轮动的高弹性与高风险。今天我们将从零开始手把手构建一个用于实战的行业ETF候选池。文章将详解筛选候选池的四大硬性原则——流动性、规模、低相关性、足够历史并给出完整的Python筛选代码。最终你将得到一个包含8-12只核心行业ETF的优质候选池为接下来的策略搭建打下坚实基础。大家好我是你们的老朋友。上一篇我们聊了行业ETF轮动的魅力和挑战。今天我们就来干一件最基础也最重要的事把候选池定下来。在宽基轮动中候选池只有寥寥几只ETF闭着眼睛都能选。但面对五花八门的行业ETF如果你不加以筛选随便丢进策略里回测结果很可能被流动性差的品种严重污染甚至得出完全错误的结论。这一篇我们就来做一个严谨的“池子管理员”。一、行业ETF的丰富图景目前A股市场上的行业/主题ETF已经超过上百只覆盖了消费、医药、科技、制造、周期、金融等几乎所有大类板块。我们可以粗略地把它们分为几大阵营大消费酒ETF、食品饮料ETF、家电ETF、农业ETF、旅游ETF医药医药ETF、医疗ETF、生物医药ETF、创新药ETF、中药ETF科技与新能源芯片ETF、半导体ETF、5G ETF、通信ETF、计算机ETF、新能源车ETF、光伏ETF、电池ETF制造与军工军工ETF、机械ETF、汽车ETF周期与资源煤炭ETF、有色金属ETF、稀土ETF、钢铁ETF、化工ETF金融地产银行ETF、券商ETF、保险ETF、房地产ETF传媒与互联网传媒ETF、游戏ETF、人工智能ETF面对如此丰富的“武器库”我们不可能全部纳入。必须建立一套严格的筛选标准选出最具代表性、最适合动量轮动的品种。二、候选池筛选四大硬性原则原则一流动性——日均成交额大于5000万这是第一道也是最不可妥协的防线。一个ETF如果日成交额只有几百万元在实盘中稍微大一点的资金就会显著推高买入成本或者卖不出去。动量轮动要求我们能在调仓日迅速完成换仓流动性差是致命伤。我们使用pytdx可以获取到每日的成交额数据。不过更简单的办法是利用akshare或者直接在东方财富等网站上查看。在回测框架中我们可以预先计算每只ETF过去一段时间的日均成交额并将不达标的剔除。下面是一段示例代码假设我们已经有了每只ETF的历史日线数据包含amount列来计算日均成交额并进行筛选def filter_by_liquidity(etf_data_dict, min_daily_amount50000000): 根据日均成交额筛选ETF etf_data_dict: {代码: DataFrame(含amount列)} min_daily_amount: 最小日均成交额默认5000万 qualified {} for code, df in etf_data_dict.items(): avg_amount df[amount].mean() if avg_amount min_daily_amount: qualified[code] df print(f{code} 通过流动性筛选日均成交额{avg_amount:.0f}) else: print(f{code} 未通过流动性筛选日均成交额{avg_amount:.0f}) return qualified在实际操作中你可以直接参考公开的流动性排名只保留日成交额稳定在5000万以上的品种。通常头部行业ETF如证券ETF、医药ETF、芯片ETF日成交额都在几亿甚至几十亿流动性毫无问题。原则二规模——基金规模大于2亿元规模太小的ETF有清盘风险。一旦清盘策略被迫卖出可能产生不必要的冲击成本。基金规模的数据在季报中披露也可以从一些数据接口获取近似值。我们可以简单地设定一个阈值比如2亿元。如果数据源不直接提供规模可以用“收盘价×流通份额”来估算。这里我们用一个简化的方式假设每只ETF的份额相对稳定回测中可以先通过外部数据手动维护一个“白名单”。示例手动维护一个基金规模白名单数据仅供参考实际以最新季报为准etf_scale_white_list { 512880: True, # 证券ETF 512010: True, # 医药ETF 159995: True, # 芯片ETF # ... 更多 }对于追求严谨的回测可以定时更新规模数据自动剔除规模过小的品种。原则三低相关性——同类只保留一只这是优化候选池质量的关键一步。如果我们同时把“酒ETF”和“食品饮料ETF”都放进池子里它们的走势高度相关排名往往一前一后。动量轮动可能会今天选这个明天选那个产生大量无效换仓白白磨损手续费。我们需要对候选池进行一次“去重”确保每个细分行业只保留最具代表性的那一只。以下是一些常见的去重决策酒ETF vs 食品饮料ETF保留酒ETF纯度高弹性大医药ETF vs 医疗ETF vs 生物医药ETF保留规模最大、流动性最好的医药ETF或医疗ETF芯片ETF vs 半导体ETF二者高度重叠保留成交更活跃的芯片ETF5G ETF vs 通信ETF保留通信ETF覆盖面更广新能源车ETF vs 电池ETF新能源车ETF包含了上中下游更全面但电池ETF弹性更大可保留其一你可以根据自己的偏好和市场认知来决定。核心原则是一个子行业只留一只。原则四历史时长——上市至少1年以上新上市的ETF往往需要一段时间来稳定规模、沉淀流动性而且没有足够长的数据用于回测。我们要求候选ETF至少要有1年以上的交易历史以确保回测的可靠性。在代码中可以通过检查每个ETF的数据长度来过滤min_days 252 # 大约一年的交易日 qualified_etfs {code: df for code, df in etf_data_dict.items() if len(df) min_days}三、构建一个标准化的候选池综合以上原则我为你筛选出一个经过验证、适用于A股行业轮动的标准化候选池。它覆盖了主要的进攻性赛道且流动性充沛、相互之间相关性可控。ETF代码简称赛道5128XX证券ETF金融进攻先锋5120XX医药ETF医药1599XX芯片ETF科技5157XX光伏ETF新能源5150XX新能源车ETF新能源车5126XX军工ETF军工5126XX酒ETF消费白酒1598XX游戏ETF传媒/互联网5128XX银行ETF金融防御型5124XX有色金属ETF周期资源5100XX上证50ETF宽基可选作为基准如果希望加入更多品种可以考虑煤炭ETF515220、家电ETF159996等。但建议候选池总数控制在8-12只过大的池子会增加换手率和噪音且很多行业本质上是同涨同跌的。在Python中我们可以将候选池定义为sector_etf_pool { 512880: (1, 证券ETF), 512010: (1, 医药ETF), 159995: (0, 芯片ETF), 515790: (1, 光伏ETF), 515030: (1, 新能源车ETF), 512660: (1, 军工ETF), 512690: (1, 酒ETF), 159869: (0, 游戏ETF), 512800: (1, 银行ETF), 512400: (1, 有色金属ETF), # 更多... }四、写在动手之前选定候选池之后我们就可以把这张列表无缝对接到之前宽基轮动的代码框架里了。下一篇我们将直接用这个候选池跑一次完整的回测看看行业ETF轮动到底能贡献多大的超额收益同时也要直面它带来的高回撤。在做这件事之前我建议你再次确认你是否真的理解了行业ETF的波动风险是否在心理上做好了面对30%以上回撤的准备如果答案是肯定的那么下一篇文章我们不见不散下一篇预告行业ETF轮动策略回测——直面收益与回撤的真实面貌

相关新闻