ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

ETF多因子轮动策略实战:动量、趋势与成交量三因子解析

ETF多因子轮动策略实战:动量、趋势与成交量三因子解析 1. 为什么我盯上ETF多因子轮动1.1 从单因子到多因子动量不会永远有效先聊个很多人都会踩的坑。我最初做ETF策略的时候只用了动量因子——也就是每个调仓日把过去20天涨得最多的几个ETF选出来买入。回测成绩相当漂亮年化收益能跑到25%以上最大回撤控制在8%以内。当时我觉得自己找到了一条稳定赚钱的路子结果拿真金白银上实盘之后连续两个调仓周期被打得鼻青脸肿。原因并不复杂2023年上半年那种窄幅震荡行情里20日涨幅靠前的ETF往往是已经冲到阶段高点的你买进去刚好接盘下一周就跌回来。动量因子在单边趋势行情里很好用一旦市场进入来回拉锯的状态它反而会把你的持仓集中在最脆弱的那批标的上。这就是所谓的“动量失效”区间。后来我把思路从单因子转向多因子用趋势和成交量因子做二次过滤情况立刻不一样了。动量只负责告诉你“过去谁最强”趋势因子负责告诉你“现在谁还在上升通道里”成交量因子负责告诉你“这波上涨有没有真金白银配合”。三个条件同时满足才进入最终持仓名单。这套组合拳下来选入标的的质量明显比只看单一因子要稳定回撤曲线也平滑了很多。1.2 为什么选ETF而不是个股这个问题经常有人问我你既然有QTYX这个系统为什么不做个股轮动偏要盯着ETF我给出的理由有三个。第一是流动性。ETF的成交量和买卖盘深度总体好于中小市值个股尤其是在调仓日需要一次性买卖一篮子标的的时候你不会因为流动性不足而支付太高的冲击成本。像300ETF、500ETF、创业板ETF这些宽基品种单日成交额动辄几十亿根本不用担心卖不出去或者买不进。第二是规则的确定性。个股会有突发利空、停牌、涨跌停封死这些黑天鹅ETF基本不存在这个问题。你不用担心晚上出个财报第二天直接一字跌停让你出不了货这会极大降低策略运营中的不可控因素。做量化的人都知道模型再漂亮一旦底层资产出现规则外的幺蛾子整套风控就形同虚设。第三是趋势的纯粹性。ETF反映的是一篮子股票的加权平均表现剔除了个股的阿尔法噪声你观察到的是行业或者宽基指数的真实趋势。对于趋势跟踪类策略来说这是最理想的标的趋势本身更干净识别起来更少出现“假信号”。另外从资金门槛角度考虑ETF也特别适合想把策略跑起来的中小资金账户。几千块钱就能按一手买入仓位控制灵活不像股指期货那样有资金门槛和到期限制。1.3 三个因子的分工谁负责找工作谁负责防风险很多对多因子策略有误解的人觉得因子越多越好——五个不够加十个十个不够加二十个。实际上因子的叠加不是“量变产生质变”而是要让每个因子承担明确的分工并且因子之间的信息重叠度尽量低否则高相关度的因子放在一起本质上相当于反复使用同一条信息还会加重过拟合。我这套ETF轮动策略里的三个因子分工非常明确。动量因子是“进攻组”负责在横截面上找出过去一段时间表现最好的品种。行业ETF轮动是动量策略最经典的战场过去几个月领涨的行业往往在下一次调仓窗口中继续有惯性上冲的动能。趋势因子是“防守组”负责判断当前是否处于适合持仓的趋势状态。它的作用不是帮你赚更多而是避开下跌途中的假反弹——一个行业即使过去涨幅排名靠前如果中期均线已经掉头向下说明动量的形成基础已经被破坏了这种情况就该一票否决。成交量因子是“验证组”负责确认上涨过程中有没有资金持续参与。缩量上涨在A股市场是非常常见的诱多形态价格创了新高但量能跟不上说明推动力不足这时候追进去的风险就大幅上升。2. 核心因子设计与参数体系解析2.1 动量因子横向排名比绝对涨幅更重要动量因子的实现逻辑并不复杂通常就是用当前价格除以N个交易日前的价格再减一得到一个区间收益率然后对全市场的ETF做横向排名选出排名靠前的品种。真正需要花心思的是N的取值。太短了不行如果动量窗口只有5天选出来的标的基本是被短期情绪推高的品种噪音极大而且换手率会非常高交易成本拖累严重。太长了也不行如果窗口拉到60天以上你选出来的可能是一轮行情已经走到末端的品种上涨空间被提前透支。我个人的经验是行业ETF轮动用20到30个交易日比较合理既能覆盖一波趋势从启动到延续的完整周期又不会过于敏感。这里要特别提示一个新手容易犯的错误——喜欢用绝对收益率排名而不考虑标的之间的波动率差异。举个例子某个行业ETF过去20天涨了10%另一个科技类ETF同样涨了10%但前者日均波动率只有1%后者日均波动率接近2%。从风险调整角度看前者的动量质量显然更好但如果你只按收益率排名就会把两者等权对待。更科学的做法是用收益除以波动率得到一个类似夏普比率的标准动量值然后再排序。2.2 趋势因子均线组合过滤假信号趋势因子在我的这套策略里扮演的是安全阀的角色。动量因子负责冲锋陷阵但它不带刹车趋势因子就是那个刹车。最朴素的趋势判断就是用均线。短期均线在上、长期均线在下是典型的多头排列反之则是空头排列。我建议在动量策略里用双均线组合例如20日线和60日线二者同时多头排列才允许持仓。这个条件看起来简单但在实战中过滤效果非常明显——它能帮你避开那种“超跌反弹但中期下跌趋势没有改变”的标的。需要注意一点趋势因子不能单独使用因为它有天然的滞后性。等20日线和60日线都掉头向上的时候行情通常已经走了一截你追进去的成本已经比较高。所以正确的打开方式是“动量初选、趋势终选”先用动量把候选池缩小到几十个ETF再用趋势因子做一票否决。2.3 成交量因子增量资金才是真金白银成交量因子的设计思路是观察拉升过程中量能是否配合。我常用的指标有两个维度。第一个维度是放量倍率。将最近5个交易日的日均成交量与过去20个交易日的日均成交量作比比值大于1.2就算有明显的放量迹象。这个参数不能定得太高否则在整体低迷的行情里会筛掉几乎所有标的也不能太低1.05这种数值基本过滤不了什么信息。第二个维度是量能持续性。一天的放量说明不了什么可能是利好消息刺激的单日资金冲动。我更看重的是放量能否持续——比如过去5天里有至少3天出现量比放大同时价格重心持续上移这才说明增量资金是在持续进场而不是做了一日游就跑。成交量因子也有失真的场景比如ETF因申赎机制导致的成交量放大并不完全等同于市场资金对这个方向的看好。所以成交量因子在组合中的权重不宜过高它更适合扮演一个“加分项一票否决项”的角色放量且持续性好的品种加分明显缩量上涨的品种直接淘汰。2.4 三个因子的打分合成等权并不等风险将三个因子组合起来的方式很多从简单的等权打分到复杂的机器学习模型都有。我建议从等权开始原因很简单——等权解释性强调参空间大也不容易过拟合。具体实现时可以这样处理对每个因子值做截面标准化z-score然后按权重求和得到综合分。举个例子假设有三只ETF动量标准化得分分别是0.8、0.5和0.2趋势得分分别是1.0、0.8和0.4量能得分分别是0.6、0.9和0.3在三因子等权的情况下综合分就是三者平均0.8、0.73、0.3然后选综合分最高的前N个标的作为目标持仓。如果你做了一段时间发现某一类因子经常拖后腿可以动态调整权重。我测试过一种比较实用的做法用过去60个交易日各因子预测收益的滚动相关性作为权重分配依据因子近期有效率更高时自动加大权重。这种方法有点类似于Adam优化器的自适应思路——初期按先验等权起步后续根据梯度反馈动态调节方向步长。这种调整本质上是在做“因子的动量”和策略本身捕捉ETF价格动量的逻辑形成了一种有趣的呼应。下面是一个极度简化的打分参考流程帮助理解整套计算的执行顺序获取全市场ETF区间收益率计算动量值并按波动率调整。计算短期与长期均线位置关系将多头排列的标的标记为趋势合格。计算量能倍数与放量持续天数标记量能合格标的。对动量值做截面标准化不合格的因子标记为0分。按权重加总标准化得分排序取前5到10个标的。输出目标权重与建议调仓指令。3. QTYX运行环境与3.3.5版本实操指引3.1 数据准备ETF池筛选与行情数据配置QTYX作为一个开源量化系统最核心的优势是把数据采集、策略回测、实盘信号统一到了一条流水线上。你要做的第一件事是准备一份合格的ETF候选池。我当前的候选池大概有60到80只覆盖宽基指数、行业板块、跨境指数、债券ETF和商品ETF目的是让轮动有足够的选择空间。这里有一个取舍原则候选池不是越大越好。你把一只日均成交额只有百万级别的冷门ETF放进去它在动量排名中偶尔冲到前面但真到调仓那天你根本买不进足够的仓位。我会在候选池层面先做一个过滤——剔除上市时间不足半年的次新ETF、日均成交额过低的小规模ETF以及跟踪误差明显异常的品种。行情数据方面QTYX内置了常见数据源接口选择日线周期后直接批量拉取全市场ETF的历史K线。建议把数据文件按本地缓存的方案存下来方便策略回测和实盘信号使用同一套数据源避免出现数据口径不一致的问题。3.2 参数配置与调仓周期选择3.3.5版本的QTYX在策略参数配置上做了明显优化尤其针对多因子类策略的配置文件做了结构化调整。动量窗口、趋势均线周期、量能倍率阈值、持仓数量上限、单票权重上限都是通过配置文件直接调整的。以我当前的参数组合为例参数项我的配置设置逻辑动量回看窗口2000分钟线与60日线无持仓数量8只ETF候选池60只8只既分散风险又保持集中度调仓频率每2周调仓一次既保留趋势跟进的时效性又避免过高换手损耗关于调仓频率我想多说两句。我看到很多人喜欢每天调仓甚至试图用分钟级别信号来追逐ETF轮动。ETF交易本身是有摩擦成本的佣金、印花税虽然ETF免印花税、滑点、冲击成本叠加在一起高频调仓的收益很容易被成本吞掉。两周调仓一次是我测试下来兼顾“灵活性”和“成本控制”的一个平衡点。行情特别剧烈的时候你也可以临时跳过一次调仓不要把自己变成机械式机器人。3.3 策略运行与信号输出完整过程在QTYX里运行这个策略核心流程分为四个步骤第一步是确认数据完整性。打开ETF池对应的数据文件检查最近一个交易日的数据是否已经包含特别留意是否存在停牌或者数据缺失的标的。我习惯在策略启动前自动跑一遍数据校验凡是最后一根K线日期不等于当前交易日的一律标记为“本期不参与排名”。第二步是加载策略模块。在系统的策略配置页面选择“ETF多因子轮动”并读取参数文件。3.3.5版本对这一块做了重构参数校验更加严格比如动量窗口必须大于趋势均线周期的一半否则会给出警告避免参数之间的冲突。第三步是生成候选信号。启动运行后系统会依次计算动量因子、趋势因子和量能因子将标准化得分最高的N个ETF输出到结果面板同时附带每个标的的入选或者淘汰原因。第四步是推送交易计划。QTYX会根据当前持仓与目标持仓之间的差异自动生成每只ETF的买入或卖出建议。我的操作习惯是把这份下单计划导出之后人工快速核对一遍——重点看有没有明显偏离常识的信号比如某个ETF被排到第一但它的成交量最近几天暴跌这种情况我会选择手动剔除。机器负责算人负责最后一道风控这是我始终不变的原则。3.4 回测与实盘战绩如何跟踪回测是验证策略逻辑是否成立的必经环节。我建议把回测起点设在近3年左右覆盖一段完整的牛熊转换和震荡行情这样才能看出策略在不同市场环境下的真实表现。在3.3.5版本中回测报告的字段非常完整包括年化收益率、最大回撤、夏普比率、卡玛比率、月度胜率、换手率和交易成本占比。我最关心的不是年化收益率而是卡玛比率——这个指标衡量的是“每承受一份回撤能换来多少收益”。一个年化30%但最大回撤25%的策略在实盘中的体验会非常糟糕而我的最终目标是让卡玛比率大于2。实盘战绩的跟踪要建立一套独立于策略信号体系的观察表格。我每两周把实盘持仓净值记录下来和策略的理论持仓做对比。为什么要单独记录因为实盘成交价格和理论价格存在偏差申赎机制也会造成短期净值波动如果只看最终结果很难区分到底是策略问题还是执行问题。把“策略收益”和“执行损耗”拆开才能真正评价策略本身是否有效。4. 实战中的常见问题与排查技巧4.1 数据坑停牌、复权与因子计算失真做ETF因子轮动最容易被忽视的坑就是除权除息和分红。有些ETF会定期分红如果在除息日拿到的价格数据没有做前复权处理你算出来的动量值会突然出现一个虚假的向下跳空导致排名错乱。我的解决办法是在数据加载阶段统一做前复权。ETF分红频率不高但一旦发生影响的是整个序列的连续性不能掉以轻心。停牌问题也常遇到。少数跨境ETF和场内LOF在特殊时期会出现盘中临时停牌这种情况下最后一根K线对应的价格其实是停牌前价格次日的动量计算会把它和变动后的价格混在一起产生假信号。我的排查方式是写好数据质量检查脚本凡是出现“最新交易日距今超过一个交易日”的ETF就在调仓排名中自动剔除宁可少一个选项也不要把垃圾数据喂给因子。4.2 交易坑集合竞价与开盘价格偏移调仓日的执行方式直接影响策略的实际收益。我实测下来的一个规律是开盘半小时内的价格偏移最大尤其是跟随信号买入的ETF经常会出现高开后的回撤。因此如果不是特别着急我建议把实际下单时间从开盘集合竞价推迟到上午10点左右等开盘初期的波动收敛之后再执行调仓。还有一类交易坑是ETF的申赎导致的折溢价波动。热门行业ETF在行情亢奋时经常出现溢价而溢价部分会在下一两个交易日内收敛这对持仓者的净值是有负面影响的。我的做法是入选标的溢价率超过2%时直接剔除不为这个品种支付额外的情绪成本。如果你使用的是券商自带的交易接口建议在下单前设置好滑点保护参数限价单的委托价格不要用对手盘卖一价而是参考最近几笔成交的加权均价再加上一个微小的偏移。虽然看起来每次只损失好几个BP但一个月调仓两次、一年下来对总收益的影响是实打实的。4.3 心态坑动量策略的最大回撤期如何度过动量策略最难受的阶段不是什么暴跌行情反而是那种震荡格局——市场没有明显趋势各行业ETF此起彼伏每一次调仓都是高买低卖。这种阶段策略回撤不大但会频繁打脸容易让人怀疑模型是不是失效了。我的个人经验是两件事。第一件事是不要频繁改参数。震荡期的动量因子确实表现不好但并不代表“参数错了”任何趋势类策略都天然在震荡市吃亏。如果这时候把动量窗口从20日改成10日你其实是在用当前的市场状态拟合参数等下一次趋势行情来了这个参数又可能变得不适用。我把这种行为称为“用动量的思路去调动量策略”本身就是矛盾的做法。第二件事是关注因子之间的共振状态。当趋势因子和成交量因子都亮红灯时减少调仓频率甚至空仓等待都是合理的选择。不要为了“保持在场”而硬交易资金管理的最高原则永远是本金安全优先。4.4 版本特性与常见报错排查3.3.5版本在QTYX的ETF模块中增加了一个很有用的功能对量能因子的调整增加了“连续放量确认”的指标解决了之前单日放量误判的问题。具体表现为系统会在信号列表中单独展示每个候选标的的放量持续天数方便你人工复核。有些用户升级到3.3.5后反馈加载ETF列表时提示“missing_df”错误。这个问题在多数情况下是数据缓存版本和策略模块版本不匹配造成的。解决方法是删除本地数据缓存并重新抓取当前版本需要的交易日数据然后重启策略内核。注意先备份自定义的配置文件和候选池清单以免误操作清掉了自己维护许久的名单。另外一个高频问题是回测中资金曲线与复盘的调仓记录差异过大。这种情况多半是因为配置文件中没有设置滑点与手续费。QTYX在回测时默认不考虑交易成本而你的实盘一定是有成本的。务必在参数配置中补充滑点比例和佣金费率后重新回测否则回测曲线永远都是虚高的。5. 从ETF因子轮动延伸出去的一些思考5.1 动量法和Adam优化器给了量化什么启发看到热搜里有人把“动量法”和“Adam等现代优化器”放在一起讨论我觉得这个联想很有意思。动量法在深度学习里指的是梯度下降时保留历史梯度的方向避免优化方向来回剧烈摇摆Adam则在此基础上进一步引入了自适应学习率每个参数都拥有自己的更新节奏。把这个概念映射到ETF轮动策略上可以得到一个非常实用的启发不要给所有因子设定固定的权重然后长期不变而是让权重随因子近期的“有效程度”动态变化。因子在近期行情中不断证明了预测能力就适当调高它的权重反之则调低。这种“因子的动量策略”本质上就是Adam思路在策略配置上的应用。实际操作中不需要做得太复杂我常用的方法是在每次调仓时计算过去60个交易日各因子与未来10日收益的滚动相关系数然后用相关系数归一化值作为权重参考。相关系数高的因子自动获得更大权重这个逻辑和Adam的自适应学习率是相通的。5.2 与同花顺期货通指标编写思维的对比很多人是从同花顺期货通这样的软件开始接触技术指标的会问我QTYX的多因子框架和期货通里写的“趋势波段共振系统”有什么区别核心区别在于执行层面。同花顺期货通指标编写更倾向于提供一种行情观察视角——你把它附在主图上看到金叉死叉信号然后人工判断是否执行。它帮你完成了“视觉共振”但缺少完整的数据记录、横截面排名、持仓权重计算和自动回测评估。QTYX这类系统把同一个逻辑用代码固化下来并且能批量处理几十个交易标的。但指标软件的思维仍然值得学习。“趋势波段共振”本质上就是多指标相互印证的思想均线代表中期趋势MACD代表波段动能成交量代表资金配合三者的共振比单一指标可靠得多。我在设计ETF多因子策略时借鉴的正是这种“共振”思路只不过把定性的指标观察变成了定量的因子打分。如果你对指标编程有一定底子完全可以先从同花顺里手工复盘验证策略的直觉逻辑再把这个逻辑搬进QTYX做全量回测。5.3 资金趋势指标与ETF轮动的关系资金趋势指标的核心思路是追踪主力资金的流向判断资金是处于流入还是流出状态。ETF轮动策略里的成交量因子本质上就是在捕捉类似的信息——只是把“主力资金”的定义扩展为了整个市场的交易力量。在QTYX的实现中量能因子并不需要精确到每一笔资金的方向而是通过放量持续性和价格配合度来间接推断资金意愿。ETF本身的申赎机制决定了它的成交量与资金流向之间有关联性但不像个股那样容易被单笔大单干扰因此用成交量因子来代理资金趋势在ETF品种上是合理的。如果你想更深入可以在策略中加入“规模变化”维度——ETF总份额的持续增长通常代表长期配置资金的流入这个信号比短期的成交量更稳定适合作为中长周期的辅助锚点。我在当前策略中没有把它加到核心因子中但在复盘时会作为人工确认条件之一来看。我个人实际操作中的体会是多因子策略的价值不在于在任何市场环境下都赚钱而在于给你提供一套客观的、可重复的、不随情绪波动的决策框架。QTYX只是把这套框架变成一台执行机器真正的思考还得靠你自己来完成。如果你也想把ETF轮动跑起来建议从最小配置开始——先选出10只自己熟悉的ETF手动跟踪几轮信号等完全理解了每个因子的脾气之后再把候选池扩展到几十只。最后再分享一个小技巧每半年把策略的因子权重全部清零重新训练一次只保留“动量趋势量能”的三因子框架本身让默认参数保持简单——越是简单的框架越不容易在迭代中变歪。
返回列表