行业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 列),来计算日均成交额并进行筛选:

python 复制代码
def filter_by_liquidity(etf_data_dict, min_daily_amount=50000000):
    """
    根据日均成交额筛选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的份额相对稳定,回测中可以先通过外部数据手动维护一个"白名单"。

示例:手动维护一个基金规模白名单(数据仅供参考,实际以最新季报为准)

python 复制代码
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:二者高度重叠,保留成交更活跃的芯片ETF

  • 5G ETF vs 通信ETF:保留通信ETF(覆盖面更广)

  • 新能源车ETF vs 电池ETF:新能源车ETF包含了上中下游,更全面,但电池ETF弹性更大,可保留其一

你可以根据自己的偏好和市场认知来决定。核心原则是:一个子行业只留一只

原则四:历史时长------上市至少1年以上

新上市的ETF往往需要一段时间来稳定规模、沉淀流动性,而且没有足够长的数据用于回测。我们要求候选ETF至少要有1年以上的交易历史,以确保回测的可靠性。

在代码中,可以通过检查每个ETF的数据长度来过滤:

python 复制代码
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 宽基(可选作为基准)

如果希望加入更多品种,可以考虑煤炭ETF(515220)、家电ETF(159996)等。但建议候选池总数控制在8-12只,过大的池子会增加换手率和噪音,且很多行业本质上是同涨同跌的。

在Python中,我们可以将候选池定义为:

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轮动策略回测------直面收益与回撤的真实面貌

相关推荐
量化君也2 小时前
快速入门量化交易都要学些什么?
大数据·人工智能·python·算法·金融
Tbisnic2 小时前
AI大模型学习 第十天:让程序“指挥”大模型 —— 从对话到工具调用
人工智能·python·ai·大模型·react·cot·提示词工程
方向研究2 小时前
破解蒙代尔三角
大数据
伊布拉西莫2 小时前
Flask 请求生命周期
后端·python·flask
大任视点2 小时前
从云经济学之父,到人工智能经济学奠基人
大数据·人工智能·业界资讯
Antom全球收单2 小时前
跨境B2B支付平台与全球收单平台有什么区别?一文讲清
大数据
科技风向标go2 小时前
QYResearch联合发布:《2026室外网络摄像头行业白皮书》格行视精灵成用户室外硬核环境首选监控
大数据·网络·安全·监控·户外安防
站大爷IP2 小时前
那天,我的Python函数死活改不了全局变量
python