复制 CTA 趋势跟随与危机 Alpha
Read in English2022 年唯一到场的分散工具,恰恰是几乎没人持有的那一个
🔊 收听本文(中文朗读)
⚠️ 现实检验
AQR 和 Man AHL 在 60 到 150 个以上的流动性期货市场上运行时序动量策略,配有 24 小时执行交易台、经过清算的期货保证金,以及散户账户根本拿不到的融资成本。 你不可能用五只 ETF 复刻出一个 CTA 项目。你能复刻的是收益流的 形状 ——而这个形状正是全部意义所在:
- 趋势跟随被记录下来的价值不是高收益,而是 与你的股债核心不相关的收益,而且历史上恰恰在核心处于最深回撤时转为正收益
- AQR 和 Man AHL 的研究都是公开的,信号简单到近乎平凡(一个移动平均过滤器),难的从来不是信号,而是 在干旱期熬下来,不把这块仓位砍掉
- 在好的十年里,5 只 ETF 的复制方案大概能捕捉真实 CTA 分散化收益的 60% 到 75%,在糟糕的十年里则明显更少。进场时就要预期跟踪误差,而不是一个克隆体
- 这是与低成本全市场指数核心并行持有的 5% 到 15% 卫星仓位,绝不是那个核心的替代品。 如果你说不清它在为组合的哪一部分买保险,你就不该持有它
🎯 你将学到什么
几乎每一个退休组合都建立在一个 2022 年悄悄失效的假设之上:债券能分散股票的风险。趋势跟随是研究最充分、又不依赖这个假设的策略。你将学到:
- 时序动量(TSMOM): AQR 的框架——Moskowitz、Ooi 与 Pedersen——以及一个世纪的样本外数据究竟展示了什么
- Man AHL 那个让人不舒服的问题: 趋势跟随究竟是 alpha、另类资产,还是仅仅是算术?答案决定了你该为它付多少钱
- 波动率目标化的仓位设定: 为什么仓位大小与已实现波动率成反比,以及为什么大部分风险调整后收益来自这一点,而不是来自信号
- 危机 Alpha,用 1970 年代滞胀、2008 年和 2022 年逐一推演: 让趋势策略在慢速灾难中赚钱、在快速灾难中失效的具体机制
- Python 实现: 一套完整的波动率目标化 TSMOM 引擎,含 5 只 ETF 的组合回测与现金收益核算
- 诚实的另一面: 2011 至 2019 年的反复打脸干旱期、费用拖累,以及散户复制方案跟踪不完美的结构性原因
目录
退休视角:2022 年到底坏在哪里
你在暗中做空的那个相关性
60/40 组合并不是两类资产。它是一类资产,加上一个赌注:赌股债相关性一直是负的。 在 2022 年之前的大约二十年里,这个赌注一直有回报:股票回撤都是通缩型冲击,美联储降息,债券上涨,债券仓位正好干了它被雇来干的活。在 2000 至 2002 年或 2008 年间提取的退休者,可以卖出赚钱的债券来支撑提取,而不必在底部清仓股票。
2022 年这个关系反转了。冲击是通胀型而非通缩型,于是折现率同时对 两条 腿上升。全球股票和长久期美国国债一起下跌,而退休者用预期收益换来的那份分散化——几十年接受低于股票盈利收益率的债券收益率——在最需要它的时刻根本没有出现。
⚠️ 这是收益顺序问题,不是业绩问题
处在积累期的人可以对股债同跌的一年一笑置之。刚开始提取的头五年里的退休者不行:在双双回撤中卖出,会永久性地拿掉本可继续复利的份额,而这是退休理财中破坏力最大的单一机制。本文要回答的问题不是"我怎么赚更多",而是 "历史上有哪类资产能在股债同时回撤时产生正收益,而且我能持有它又不毁掉计划的其他部分?"
统领下文的定位
趋势跟随是一块对冲仓位和分散工具。它不是收益引擎,更绝对不是持有市场本身的替代品。 拉长时间看,真正为退休提供资金的是低成本全市场指数核心;本文中的每一个策略都叠加在那个核心之上,用来改变核心所走的 路径 ,而不是取代它。
这句话落到操作上就是:5% 到 15% 的配置,资金来自债券仓位而不是股票,机械化再平衡,并且只用它是否降低了组合回撤来评价——绝不用它在某一年有没有跑赢 S&P 500 来评价。如果你发现自己在拿这块仓位的年度收益和指数基金比,那你已经误解了它的用途,并且会在最糟糕的时点把它卖掉。
组合中每个部件真正的用途
| 部件 | 职责 | 评价标准 |
|---|---|---|
| 低成本全市场股票指数核心 | 为退休提供资金;以最低成本获取股票风险溢价 | 长期复利、费用率、税务效率 |
| 高质量债券 / 短期国债 | 为近期提取提供资金;抑制波动 | 久期与支出的匹配、信用质量 |
| 趋势跟随卫星仓位(5% 到 15%) | 在核心出现持续的、有方向的回撤期间产生正收益 | 压力期与核心的相关性;回撤的降低幅度 |
关键洞察: 这三个部件有三套不同的成功标准。把核心的标准(总收益)套到卫星仓位上,是散户毁掉这份好处最常见的方式——他们在危机之后、趋势刚刚表现完时买入,又在干旱期之后、它马上要派上用场时卖出。
时序动量:AQR 的百年研究
截面动量与时序动量
时序动量问的问题,和本系列其他文章讲的因子动量不一样。 截面动量把资产互相排序,相对输家买入赢家——它在构造上就是市场中性的,对整个市场的方向不作任何判断。时序动量(TSMOM)只问 每一个市场自身的过去收益 是正是负,并据此在那个市场上做多或做空,与其他所有市场在做什么无关。
这个区别正是 TSMOM 能产生危机 Alpha、而截面动量不能的全部原因。截面组合在崩盘中大致保持金额中性。时序组合在它交易的每个市场都已下跌数月时,最终会变成 整个组合净空头 ——而这正是你在漫长熊市中想要的仓位,也正是退休组合里没有任何其他部件会替你建立的仓位。
两类动量不是彼此的替代品
| 维度 | 截面动量 | 时序动量(TSMOM) |
|---|---|---|
| 信号 | 资产收益在同类中的排名 | 资产自身在回看期内的收益符号 |
| 净市场暴露 | 构造上约等于零 | 从满仓做多到满仓做空之间变动 |
| 在持续熊市中的表现 | 大致持平;在一堆烂苹果里挑最好的 | 轮动为净空头;可能大幅为正 |
| 在退休组合中的主要用途 | 股票仓位内部的因子倾斜 | 回撤保险 / 危机分散工具 |
| 典型实现场所 | 多空股票、因子 ETF | 横跨四大类资产的流动性期货 |
关键洞察: 在股票仓位里持有一只动量因子 ETF,并不会给你危机 Alpha。它给你的是股票内部的一个倾斜。这两者经常被混为一谈,而这种混淆让投资者相信自己持有一份其实并不存在的对冲。
"一个世纪的证据"究竟确立了什么
与 Tobias Moskowitz、Yao Hua Ooi 和 Lasse Pedersen 相关的 AQR 研究项目——《Time Series Momentum》这条研究线,以及后来延伸出的跨世纪回测——提出了一个比所有业绩统计都更重要的主张:这个效应不是样本的产物。 同一个简单信号,应用到每个时代当时存在的流动性期货和远期合约上,在两次大战之间、战后时期、1970 年代通胀、1980 年代去通胀以及现代时期,都产生了正的风险调整后收益。
这个结果比通常的因子回测强得多。大多数被记录下来的异象都建立在 1963 年以来的美国股票数据上,并在样本外悄悄衰减。TSMOM 的证据基础横跨多个资产类别、多种货币政策体制,时间跨度长到包含了在世的任何一位组合经理都没有交易过的事件。在系统化投资中,它最接近一次真正意义上的样本外验证。
TSMOM 的标准构造
| 设计选择 | 机构惯例 | 原因 |
|---|---|---|
| 标的池 | 60 个以上流动性期货:股指、国债、外汇远期、商品 | 广度就是风险控制;没有任何单一市场能占据主导 |
| 信号 | 过去 12 个月超额收益的符号(常与 1 个月 / 3 个月 / 6 个月混合) | 在各种设定下都稳健;具体回看期是多长,远不如"有一个回看期"来得重要 |
| 仓位方向 | 信号为正则做多,为负则做空——始终在场 | 正是这种对称性在危机中生成了空头暴露 |
| 仓位大小 | 与过去已实现波动率成反比 | 让差异极大的资产贡献相同的风险 |
| 再平衡频率 | 视项目而定,从每日到每月不等 | 在信号保真度与交易成本之间取舍 |
| 组合波动率目标 | 缩放到一个恒定的年化目标(通常为 10% 到 15%) | 让收益流可比,也让它在组合中能占到有意义的规模 |
关键洞察: 这些选择每一条都是公开的,没有一条是独家秘方。机构的优势不在配方上——而在执行成本、市场广度,以及原封不动运行二十年的运营纪律上。
行为面与结构面的解释
趋势的持续性通常被归因于以下几点的组合:信息扩散缓慢、投资者先反应不足后又延迟过度反应,以及——对退休投资者尤其重要的一点——存在一批不以盈利为目的、在结构上被迫顺着行情方向交易的参与者。 央行平滑汇率调整、企业按既定节奏对冲商品敞口、养老金按政策权重再平衡、风控条款在下跌中强制降杠杆,这些都在提供订单流,而趋势跟随者就站在这些订单流的对面。
这一点很重要,因为它说明收益来源并不纯粹是一种应被套利消灭的行为偏差。其中一部分是真正的风险转移溢价:趋势跟随者在向那些无论价格如何都必须交易的参与者提供流动性。这一部分比纯粹的异象更有理由持续下去——尽管"更有理由持续"离"有保证"还差得很远。
Man AHL:Alpha、另类资产,还是算术?
这个行业宁愿不问的问题
Man AHL 提出的研究框架——趋势跟随究竟是 alpha、一类另类资产,还是算术?——是管理期货文献中最有用的一次学术诚实,因为答案决定了什么才是合理的收费。 如果趋势跟随是 alpha,那它就是管理人技能,是稀缺的,2% 管理费加 20% 业绩提成或许站得住脚。如果它是一类 另类资产,那它就是任何人都能采收的风险溢价,收费应该和因子 ETF 差不多。如果它是 算术 ——一条规则作用在价格序列上的机械结果——那收费就应该接近运行这套算术的成本。
研究给出的那个让人不舒服的答案是:主要是第三种,外加薄薄一层第一种。典型 CTA 的绝大部分收益,都可以用一条简单、已公开发表、机械设定的趋势规则作用在流动性市场上复制出来。剩下的残差——市场选择、执行质量、风险叠加层、更快或自适应的信号混合——是真实存在的,但相对那个高调的收费来说很小。
拆解 CTA 的收益流
| 部件 | 性质 | 散户能复制吗? |
|---|---|---|
| 流动性市场上的通用趋势信号 | "算术"——作用在公开价格上的已公开规则 | 能,而且能复制相当大一部分 |
| 波动率目标化与风险叠加层 | 是算术,但对运营要求高 | 能,前提是有纪律(见 Python 一节) |
| 保证金上的抵押品 / 现金收益 | 结构性的——期货只需保证金,现金按短期国债利率计息 | 部分能——见下文关于现金收益的讨论 |
| 横跨 60 到 150 个市场的广度,包括流动性差的和小众的 | 另类资产的准入 | 不能——这是最大的一处真实差距 |
| 大规模下的执行成本最小化 | 管理人技能 / 基础设施 | 不能 |
| 自适应回看期、信号混合、carry 叠加层 | 真正的 alpha,但幅度不大 | 部分能,但过拟合风险不小 |
关键洞察: 散户真正无法复制的只有两行:市场广度和执行成本。CTA 收益流中的其他一切,粗略地说,对任何愿意始终如一执行一条规则的人都是开放的。这就是复制之所以是一个站得住脚的散户项目的原因——也是这个复制方案仍会有所欠缺的原因。
费用的算术很残酷
如果底层策略在 10% 波动率目标下长期给出 0.4 到 0.7 的 Sharpe 比率——这是扣除现实成本后对已公开证据的一个公允解读——那么 2% 管理费加 20% 业绩提成会吃掉风险调整后收益中相当大的一块。 在 10% 波动率和 0.5 的毛 Sharpe 下,毛超额收益大约是 5%;光是 2% 的管理费就拿走了其中的 40%,业绩提成还一分没动。
⚠️ 费用拖累是决定这块仓位有没有用的最大单一因素
一只全包费用 1.5% 到 2.0% 的管理期货共同基金,或者一只费率 0.65% 到 0.95% 的流动另类 ETF,在你看到一美元收益之前,就已经花掉了策略预期超额收益中相当可观的一部分。这并不意味着这些产品毫无用处——专业执行和真正的多资产广度是值钱的——但它确实意味着 费用必须拿去和分散化收益比,而不是和毛收益比。一块能把你组合回撤改善 3 个百分点、在 10% 资产上每年收 1.5%(即占全组合 15 个基点)的仓位,可能仍然值得;而一块在 25% 资产上每年收 3% 的仓位,几乎肯定不值。
这对"自建还是购买"的决定意味着什么
诚实的说法是这是一个三选一,而每个选项都有真实的代价。 自己动手的 5 只 ETF 复制方案管理费接近零,但广度最窄、行为风险最高(你随时可以把它关掉)。流动性管理期货 ETF 费用中等、广度更好,但不同产品之间策略漂移往往很大。管理期货共同基金广度最好、费用最差。没有一个占优的答案;关键是把这个取舍摆到明面上,而不是默认接受那个恰好被推销到你面前的产品。
波动率目标化仓位:Sharpe 究竟从哪里来
仓位设定规则
在 TSMOM 项目中,每个市场的仓位大小与该市场近期已实现波动率成反比,这样无论某个市场碰巧有多波动,它对组合贡献的风险都大致相同。 一笔波动率 6% 的债券期货仓位和一笔波动率 45% 的天然气期货仓位,其规模要设定成:其中任何一个走出一个标准差的行情,对损益的影响都差不多。
市场 i 在 t 时刻的仓位规模:
w_i,t = sign(signal_i,t) × (σ_target / σ_i,t) × (1 / N)
其中:
sign(signal_i,t) = 尾随回报为正时取 +1,为负时取 -1
σ_target = 单市场的年化波动率预算(例如 10%)
σ_i,t = 市场 i 的尾随已实现波动率(例如 30 天,
年化,通常采用指数加权)
N = 交易范围内的市场数量
组合层面的缩放(在单市场权重之后施加):
scale_t = σ_portfolio_target / σ_realized(portfolio_t)
最终权重 = w_t × scale_t (受杠杆上限封顶)
已实现波动率,30 天年化:
σ_i,t = sqrt(252) × stdev( r_i,t-29 ... r_i,t )
指数加权的替代做法(反应更快,尾部噪声更小):
σ²_i,t = λ · σ²_i,t-1 + (1 - λ) · r²_i,t 其中 λ ≈ 0.94
反波动率这一项干的活比信号还多。 这是大多数散户实现方案都忽略掉的反直觉结论:关于趋势跟随的研究一致发现,相对朴素的等权趋势组合而言,风险调整后表现的改善有相当大一部分来自波动率缩放,而不是来自对入场信号的任何精修。投资者花巨大的力气优化回看窗口,却几乎不花力气在仓位设定上,而这恰好搞反了。
等金额仓位为什么会失败
| 市场 | 示意性年化波动率 | 等金额下的风险占比 | 反波动率下的权重(σ_target = 10%) |
|---|---|---|---|
| 10 年期美国国债期货 | ~6% | 可忽略 | 1.67 倍名义本金 |
| S&P 500 期货 | ~16% | 中等 | 0.63 倍名义本金 |
| 黄金期货 | ~15% | 中等 | 0.67 倍名义本金 |
| 原油期货 | ~35% | 占主导 | 0.29 倍名义本金 |
| 天然气期货 | ~60% | 压倒性 | 0.17 倍名义本金 |
关键洞察: 等金额的趋势组合不是分散化的趋势组合——它是一个对能源价格的杠杆押注,外带一小笔债券仓位。波动率缩放才是把一堆仓位变成真正风险均衡项目的东西,也是机构流程中唯一能干净利落地搬到散户账户上的部件。
制造危机凸性的那个反馈回路
波动率目标化与趋势信号相互作用,产生的收益特征类似买入跨式期权的损益结构——而这种相似并非偶然。 当一个市场平静而有趋势时,已实现波动率很低,于是反波动率规则会顺着趋势方向建立一个 很大的 仓位。当波动率爆发时,这条规则会自动削减仓位,从而限制突然反转造成的损害。这个组合——在缓慢、持续的行情中持大仓,在混乱行情中持小仓——正是那种在漫长危机中赚钱、在震荡行情中失血的暴露结构。
⚠️ 同一个机制也保证了你会在急促的 V 型反转中亏钱
处在平静下跌趋势中的趋势项目会持有一个很大的空头。如果市场剧烈见底并在几天内反转——2020 年 3 月的股票低点,或者央行对某个货币的突袭式干预——项目就会以最大空头迎面撞上反转,而波动率飙升又逼着它在最差的价位降杠杆。这不是一个可以靠工程手段消除的缺陷; 这是溢价在被支付回去。一个靠持续行情赚钱的策略,必然要在突变行情上亏钱。任何显示相反结果的回测都是过拟合。
危机 Alpha:1970 年代、2008 年、2022 年
把机制精确地说清楚
危机 Alpha 并不是说股票跌趋势跟随就涨。它讲的是一类特定的危机:以月而不是以天为单位展开,并且让多个资产类别朝着一个持续方向移动的危机。 趋势跟随需要时间来建仓。基于历史收益的信号在构造上就是滞后的——它不可能在下跌开始之前就做空,只能在下跌持续足够久、把信号翻转过来之后才做空。因此这个策略变现的是一轮长回撤的 后半段 ,而不是第一波冲击。
趋势跟随能捕捉哪些危机
| 危机类型 | 持续时间 | 趋势策略的结果 | 原因 |
|---|---|---|---|
| 缓慢燃烧的宏观体制转换(1973-74、2000-02、2008、2022) | 数月到数年 | 历史上大幅为正 | 信号翻转得足够早,能在下跌的大部分时间里持空;多个资产类别一起走趋势 |
| 突发的单日冲击(1987 年、2018 年 2 月波动率飙升) | 数天 | 中性到负 | 仓位仍反映冲击前的体制;来不及轮动 |
| 伴随政策立即反转的急促崩盘(2020 年 3 月) | 数周 | 好坏参半——常常是先小赚,然后在反复打脸中吐回去 | 抓到了债券和能源的下跌;被股票的 V 型反弹反复打脸 |
| 没有方向的震荡横盘压力期 | 数年 | 负——也就是干旱情形 | 信号反复翻转;每翻转一次就要付出价差和一笔小亏损 |
关键洞察: 趋势跟随保的是亏损的 持续时间 ,而不是单日的幅度。这几乎完美地对应上退休者真正面对的风险——对一个提取计划来说,糟糕的十年远比糟糕的某个星期二重要得多。
案例一:1970 年代滞胀
1970 年代是最重要的单个案例,因为那是现代组合准备得最不充分的体制,也是 2022 年在押韵的那个体制。 1973 至 1974 年,以及 1979 至 1980 年,通胀和利率预期持续上升,商品持续上涨,布雷顿森林体系瓦解后美元持续单边移动,而股票和债券都交出了深度为负的实际收益。这些每一项都是流动性期货市场上持续数月的方向性行情——正是时序动量的教科书式环境。
在那个十年里,一个趋势项目会同时做多能源和农产品、在收益率上行时做空债券期货、并在外汇上顺着美元的趋势建仓——全部同时进行,而且方向都与摧毁传统组合实际价值的那些力量一致。这正是 AQR 百年回测特意要涵盖进去的历史片段,也正是跨世纪框架之所以重要的原因:一个从 1990 年才开始的证据基础,从没见过真正的通胀体制。
💡 退休计划必须吃透的那个通胀要点
债券对冲的是 通缩型 股票冲击。传统 60/40 里没有任何东西对冲 通胀型 冲击——TIPS 对已实现通胀有帮助,但对利率重新定价没有帮助,而现金保住了名义本金却在丢失实际价值。趋势跟随因为可以同时做空债券、做多商品,是极少数损益结构天然对准这一特定风险的流动性策略之一。关于这件事在提取计划一侧的影响,可参见 PMR 的通胀现实建模器。
案例二:2008 年
2008 年是最干净的现代示范,也是这个类别后来被过度推销的主要源头。 这场危机慢到可以交易:信用压力在 2007 年逐步积累,商品一路涨到 2008 年年中见顶随后崩塌,股票下跌了一年多,而政策利率降到零使债券期货大涨。一个分散化的趋势项目有时间轮动——在见顶前做多商品,然后在崩塌中做空商品;在下跌全程做空股票;在上涨全程做多债券。
管理期货作为一个类别在 2008 年录得大幅正收益,而同期全球股票暴跌,这一年为 CTA 募集资产所做的贡献超过了此前二十年的总和。它同时也设定了一个这个类别无法兑现的预期:2008 年之后买入的投资者,是在这份对冲最贵的时刻买入的——无论从叙事的估值看,还是从随后十年的表现看,都是如此。
案例三:2022 年
对当下的退休组合来说,2022 年是最有参考价值的案例,因为那一年标准的分散工具失效了,而趋势跟随没有。 那个局面几乎是为 TSMOM 量身定制的:一轮持续且被充分预告的加息周期,制造了长久期美国国债历史上最糟糕的年份之一;美元对日元、欧元和英镑的持续上行趋势;由能源错位驱动的持续商品行情;以及一段磨人的股票下行趋势,其间没有一次决定性的崩盘。
四个资产类别同时走趋势,而且一年中的大部分时间都在走。管理期货指数录得大幅正收益,而 60/40 组合遭遇了有记录以来最差的自然年之一。对 2022 年正在提取的退休者来说,趋势仓位是组合中少数几个能以盈利卖出、用来支撑提取的科目之一——这一句话就是危机 Alpha 的全部实用价值。
三种体制下的示意性表现
| 体制 | 股票 | 长久期债券 | 典型的趋势仓位 |
|---|---|---|---|
| 1973-74 滞胀 | 实际收益深度为负 | 实际收益深度为负 | 做多商品、做空债券、做空股票 |
| 2008 去杠杆 | 大幅为负 | 大幅为正 | 做空股票、做多债券、下半年做空商品 |
| 2022 通胀冲击 | 为负 | 大幅为负 | 做空债券、做多美元、做多能源、做空股票 |
关键结论: 趋势仓位那一列每一行都不一样。正是这种适应性——而不是像永久性股票空头或长期持有看跌期权那样的固定对冲——让同一块仓位能够应对结构上完全不同的危机。这也正是为什么这块仓位可能连续多年持平或为负:它没有一份会衰减的永久对冲,也就没有一份会兑付的永久对冲。
🚨 三个正面案例不构成保证
1970 年代、2008 年和 2022 年之所以被这个行业拿来营销,是因为它们奏效了。没有任何机制保证下一场危机也是慢速的、多资产同向的。一场由流动性驱动、伴随政策立即干预的崩盘——也就是 2020 年 3 月那种形状——完全可能让趋势项目持平甚至下跌,而核心组合同时在跌。 把这块仓位的规模设定成:即便它在下一场危机中交不出成绩,你也扛得住,因为那是一个确实可能出现的结果。
干旱期:2011 至 2019 年,以及它为何几乎杀死这个类别
一个十年的反复打脸是什么感觉
大约在 2011 到 2019 年之间,分散化趋势跟随几乎什么也没交出来——其中有几年还明显是负的——而同期 60/40 组合正穿越有记录以来最强的牛市之一持续复利。 那个环境在结构上是敌对的:央行干预一次次掐断正在形成的趋势,股票回撤又急又立刻反转而不是持续,利率被摁在零附近使债券趋势没有多少空间可走,现金又不生息,于是历史上为 CTA 业绩垫底的抵押品收益彻底消失了。
结果就是这个策略一次次顺着刚刚萌芽的行情建仓,然后那段行情被一则政策公告反转,于是它翻转方向,接着又被反转一次。每一轮循环都要付出交易价差外加一笔小亏损。在一个组合上一年做几十次,拖累就相当严重。
2011 至 2019 年的环境为什么在结构上是敌对的
| 条件 | 对趋势跟随的影响 |
|---|---|
| 一轮又一轮的央行干预(多轮 QE、前瞻指引) | 在正在形成的趋势还没赚钱之前就把它掐断;制造出 V 型反转 |
| 零利率政策 | 消灭了历史上贡献 CTA 收益中相当一部分的抵押品 / 现金收益 |
| 被压缩的债券收益率 | 利率在任何一个方向上都没有多少空间走出持续趋势 |
| 短促而剧烈、随后快速修复的股票回撤(2015 年、2018 年) | 信号在接近底部时翻空,然后在修复中被反复打脸 |
| 2014 年崩塌之后区间震荡的商品 | 趋势跟随的一个核心资产类别里出现了震荡、无方向的价格走势 |
| 类别资产规模增长与拥挤 | 更多资金在追逐同样的信号;较短周期上的优势有所侵蚀 |
关键洞察: 这张清单上几乎每一个条件都在 2022 年反转了。这不是巧合,也不构成信心的理由——它提醒你这块仓位的表现取决于体制,而你要走进去很深之后才会知道自己进入的是哪一种体制。
行为上的问题比财务上的问题更严重
在你的指数基金翻了三倍的同时,连续九年持平到为负的表现,不是一个统计上的小麻烦——它是一场大多数投资者熬不过去的心理煎熬。 这个模式被记录下来,而且一致得令人沮丧:投资者在干旱期的末尾对分散工具投降,而在底部离场的钱,到了随后的危机里已经不在了。那些在经历十年失望后于 2020 至 2021 年退出管理期货的投资者,恰好错过了这块仓位存在意义所在的那一年。
🚨 如果你无法承诺一个完整的市场周期,就别开始
一块持有三年就被放弃的趋势仓位,严格来说比从没持有过更糟:你付了拖累的代价,却放弃了回报。现实中的最低承诺是 一个完整的市场周期——按十年或更长来规划 ——而且配置比例要小到即使这块仓位跑输十年,也不至于诱使你放弃它。对大多数人来说,这意味着 5% 到 10%,而不是 20%,并且这个比例要写进一份你在冷静时写下、在压力下拒绝重新打开的投资政策声明里。
5 只 ETF 的散户复制方案
标的池,以及为什么是这五个
散户复制方案把一个 60 多个市场的期货标的池压缩成五只流动性好的 ETF,每一只对应趋势跟随的一个主要资产类别,挑选标准是流动性,以及能否代表一个独立的宏观驱动因素。 这是一个粗糙的近似,紧接着的那一节整节都在讲它有多粗糙——但它是一个普通券商账户真正跑得起来的版本:兼顾税务、不用保证金、不需要期货交易权限,也不需要一台 Bloomberg 终端。
五块仓位的标的池
| ETF | 暴露 | 对应的机构做法 | 危机中的角色 |
|---|---|---|---|
| SPY | 美国大盘股 | ES / 全球股指期货 | 在持续的股票下跌趋势中信号转为空仓/持现 |
| TLT | 长久期美国国债 | ZB / ZN / 全球债券期货 | 2022 年的那个信号——在利率上行时退出久期 |
| GLD | 黄金 | GC 黄金期货 | 货币贬值与实际利率趋势 |
| USO | 原油(基于期货) | CL 能源板块 | 滞胀那条腿;捕捉能源冲击 |
| UUP | 美元指数 | DX / FX 远期 | 美元避险与利差趋势 |
关键洞察: 五只代码,四个资产类别。这个标的池刻意做得足够小,一个月手动管理一次就够,而且每只代码的流动性都足以让散户规模的订单不产生任何市场冲击。每一只都有合理的替代品(想要少一点久期就用 IEF 替代 TLT;想避开单一商品的展期风险就用 DBC 或一只宽基商品基金替代 USO),这个框架并不依赖于具体的代码。
⚠️ USO 特别带有你必须搞清楚的展期风险
基于期货的商品 ETF 并不跟踪现货。在期货升水结构下——近月期货价格高于远月——即使现货油价原地不动,基金每次展期都会损失价值;而 USO 在 2020 年石油行情失序期间的表现,即它在前所未有的近月崩塌中被迫重构持仓的那段经历,就是这件事能糟到什么地步的经典案例。如果你要用 USO,用的时候必须清楚它是一个 趋势载体,而不是油价的代理;对于一块长期仓位来说,更宽、更阶梯化的商品基金是更稳健的选择。
只做多/空仓的约束
散户复制方案与机构策略之间最大的结构性差异,是散户的这块仓位通常只有做多或空仓两种状态,而不是做多或做空。 一家 CTA 在 2022 年翻手做空债券期货,能把整段跌幅都赚到。一个散户复制方案只是退出 TLT、把钱放进短期国库券,它避开了跌幅,却没有从中获利。这让危机 alpha 打了对折——而这是一个刻意为之、站得住脚的取舍,因为通过反向 ETF 做空会引入每日重置的损耗,通过期货做空则需要一种账户类型和一种风险承受度,而大多数退休投资者不该拥有它们。
只做多/空仓 vs. 多空双向:诚实的对比
| 维度 | 只做多/空仓(散户) | 多空双向(机构) |
|---|---|---|
| 危机 alpha 的量级 | 大约一半——只避开亏损,不把下跌变现 | 完整——从持续下跌中获利 |
| 崩盘时与股票的相关性 | 趋近于零(待在现金里) | 可以显著转负 |
| 来回打脸的成本 | 更低——空仓除了机会成本以外不花钱 | 更高——一笔做错的空头是实打实地亏钱 |
| 税务处理 | 普通的短期/长期资本利得;频繁实现 | 受监管期货适用 Section 1256 的 60/40 处理 |
| 账户要求 | 任何券商账户 | 期货账户、保证金、持续的抵押品管理 |
| 爆仓风险 | 有界——最差情况是 100% 现金拿短期国库券利息 | 带杠杆;需要真正的风险基础设施 |
关键洞察: 对于一块退休组合的卫星仓位来说,只做多/空仓是正确的选择,尽管它在纸面上严格地更弱。下行有界、不会被追加保证金,值得拿一半的危机 alpha 去换,因为一块会爆掉的仓位不是保险——它是你本想对冲掉的那个风险的第二个来源。
现金收益优化:所有人都跳过的那一部分
在一个只做多/空仓的复制方案里,相当大比例的时间总有几块仓位是空仓的——而这些现金放在哪里,决定了策略总收益中出人意料的一大块。 这是机构抵押品收益在散户端的回声:一家 CTA 缴纳保证金,剩下的钱拿短期国库券利率,在 4% 到 5% 的利率环境下,那笔抵押品收益可以是整个招牌数字里相当大的一部分。一个把空仓部分的现金留在零收益扫款账户里的散户复制方案,就是在丢掉同一份贡献。
空仓部分的现金该放在哪里
| 工具 | 取舍 | 适用场景 |
|---|---|---|
| 券商扫款账户 / 默认现金 | 在大型零售券商那里往往接近零利率 | 最差的选项;去查一下你券商实际的扫款利率 |
| 政府货币市场基金 | 接近政策利率、T+1 流动性、费率很低 | 对大多数账户来说是不错的默认选项 |
| 短期国库券 ETF(例如 0 到 3 个月) | 像股票一样交易、像 ETF 一样结算、久期风险极小 | 最适合一套机械化的月度再平衡 |
| 直接持有短期国库券至到期 | 收益最高、免州税,但要承担阶梯管理的开销 | 适合战略性的那部分,用在战术性的那部分则很别扭 |
关键洞察: 在 4% 的利率环境下,一块有 40% 时间处于空仓的仓位,光靠现金每年就能赚到大约 1.6%。对于一个预期超额收益只有中个位数的策略来说,这不是一个可以四舍五入掉的零头——它可能占到总收益的三分之一。要把它优化好,只需要做一个决定,做一次就行。
再平衡规则
每月最后一个交易日:对五块仓位中的每一块,把价格与它的 10 个月简单移动平均线(大致等价于 200 日均线)作比较。价格在均线上方就持有该 ETF;在下方就持有现金。 然后在持有的各块仓位之间套用反波动率权重,并把整块仓位缩放到它的目标波动率。按月评估不是一种妥协——趋势跟随方面的研究一致发现,按月和按日的设定给出的结果大体相近,而按月大幅降低了交易成本,也大幅减少了你有机会去推翻这套系统的次数。
💡 用一条缓冲带来削减来回打脸带来的换手
单纯的价格对均线比较,每一次擦边穿越都会翻转一次。要求价格比方说要高出均线 2% 才进场、低于均线 2% 才出场——一条刻意设置的迟滞带——能实打实地减少来回交易,代价是进场和出场都稍晚一点。鉴于来回打脸是干旱期里最主要的成本,这是少数几个值得加上、又不算明显曲线拟合的改良之一。
Python 实现:波动率目标化 TSMOM 引擎
完整实现: 已实现波动率估计、带迟滞缓冲的 TSMOM 信号生成、反波动率仓位设定、组合层面的波动率目标化、空仓部分的现金收益核算,以及一套按月再平衡、含基于换手率的交易成本的回测。
完整 Python 代码
"""
波动率目标化的时序动量(TSMOM)引擎
用 5 只 ETF 在散户端复制 CTA 趋势跟随的收益特征,遵循 AQR
(Moskowitz、Ooi 与 Pedersen)的 TSMOM 框架,以及 Man AHL
"alpha 还是算术" 的复制批评。
只做多或空仓(不做空)——这是一个刻意的散户约束,它限制了下行,
代价是牺牲掉大约一半的危机 alpha。
作者:Plan My Retire
日期:2026 年 9 月
依赖:pandas、numpy。价格数据:任意日频复权收盘价来源。
"""
import numpy as np
import pandas as pd
# ---------------------------------------------------------------------
# 1. 波动率估计
# ---------------------------------------------------------------------
class VolatilityEstimator:
"""
尾随已实现波动率,年化。两种估计方式:
简单滚动窗口(透明,论文里用的就是这个),以及
指数加权的变体(对状态切换反应更快)。
"""
TRADING_DAYS = 252
def __init__(self, window=30, lam=0.94):
self.window = window # 按设定取 30 天已实现波动率
self.lam = lam # EWMA 衰减系数;0.94 是 RiskMetrics 的默认值
def rolling(self, returns):
"""简单滚动窗口的年化波动率。"""
return returns.rolling(self.window).std() * np.sqrt(self.TRADING_DAYS)
def ewma(self, returns):
"""
指数加权的年化波动率。
sigma^2_t = lam * sigma^2_{t-1} + (1 - lam) * r^2_t
"""
var = returns.pow(2).ewm(alpha=1 - self.lam, adjust=False).mean()
return np.sqrt(var * self.TRADING_DAYS)
# ---------------------------------------------------------------------
# 2. 趋势信号
# ---------------------------------------------------------------------
class TrendSignal:
"""
由移动平均过滤器产生的做多/空仓 TSMOM 信号,附带一个可选的
滞回缓冲区,用来压制来回打脸的往返交易。
buffer_pct=0.02 的含义是:价格高出均线 2% 时入场,低于均线 2%
时离场。在这两条边界之间,维持此前的状态不变。
"""
def __init__(self, ma_window=200, buffer_pct=0.02):
self.ma_window = ma_window # 200 个交易日,约 10 个月
self.buffer_pct = buffer_pct
def generate(self, prices):
"""
prices:日频复权收盘价的 DataFrame,每只 ETF 一列。
返回一个取值为 {0, 1} 的仓位 DataFrame,整体前移一天,
使得在第 t 天算出的信号只能在第 t+1 天交易。
"""
ma = prices.rolling(self.ma_window).mean()
upper = ma * (1 + self.buffer_pct)
lower = ma * (1 - self.buffer_pct)
raw = pd.DataFrame(np.nan, index=prices.index, columns=prices.columns)
raw[prices > upper] = 1.0 # 明确在上方 -> 做多
raw[prices < lower] = 0.0 # 明确在下方 -> 空仓
# 在带内,把此前的状态延续下去(滞回)。
state = raw.ffill().fillna(0.0)
# 前移一位以避免前视偏差:今天的收盘价当天无法成交。
return state.shift(1).fillna(0.0)
# ---------------------------------------------------------------------
# 3. 仓位设定
# ---------------------------------------------------------------------
class InverseVolSizer:
"""
按各自已实现波动率的倒数给每块仓位定规模,然后把整个组合
缩放到目标波动率。
相对朴素的等权趋势组合,风险调整后表现的改善大部分来自这里,
而不是来自信号。
"""
def __init__(self, sleeve_vol_target=0.10, portfolio_vol_target=0.10,
max_sleeve_weight=0.40, max_gross_leverage=1.0):
self.sleeve_vol_target = sleeve_vol_target
self.portfolio_vol_target = portfolio_vol_target
self.max_sleeve_weight = max_sleeve_weight
self.max_gross_leverage = max_gross_leverage # 1.0 = 不加杠杆
def size(self, signals, vols):
"""
signals:取值为 {0, 1} 的做多/空仓状态 DataFrame
vols: 年化已实现波动率的 DataFrame,形状相同
返回每块仓位的目标组合权重。
"""
# 按波动率倒数缩放,同时防止陈旧数据导致除零。
inv_vol = self.sleeve_vol_target / vols.replace(0, np.nan)
raw_weights = signals * inv_vol
# 给单块仓位设上限,避免某个低波动资产一家独大。
raw_weights = raw_weights.clip(upper=self.max_sleeve_weight)
# 把总敞口归一到杠杆上限。空仓的那几块贡献为零,
# 因此在避险期总敞口会下降,剩余部分以现金持有
# (赚取短期国库券利率)。
gross = raw_weights.sum(axis=1)
scale = np.minimum(1.0, self.max_gross_leverage / gross.replace(0, np.nan))
weights = raw_weights.mul(scale.fillna(0.0), axis=0)
return weights.fillna(0.0)
def apply_portfolio_vol_target(self, weights, returns, lookback=60):
"""
第二阶段缩放:测量策略自身的已实现波动率,并向组合目标
靠拢。这让这块仓位的风险贡献在不同市场状态下大致稳定。
"""
strat_returns = (weights.shift(1) * returns).sum(axis=1)
realized = strat_returns.rolling(lookback).std() * np.sqrt(252)
scale = (self.portfolio_vol_target / realized.replace(0, np.nan))
scale = scale.clip(upper=self.max_gross_leverage).ffill().fillna(1.0)
return weights.mul(scale, axis=0)
# ---------------------------------------------------------------------
# 4. 计入现金收益与交易成本的回测
# ---------------------------------------------------------------------
class TrendReplicationBacktest:
"""
对 5 只 ETF 的做多/空仓趋势仓位做月度再平衡回测。
明确计入了大多数散户回测都漏掉的两件事:
1. 空仓部分的现金收益(对应 CTA 保证金抵押品收益的散户版本
——在 4% 到 5% 的利率环境下影响不小)。
2. 基于换手率的交易成本,正是它让来回打脸的干旱期变得昂贵。
"""
def __init__(self, cost_bps=5.0, rebalance='ME'):
self.cost_bps = cost_bps # 每单位换手的往返成本
self.rebalance = rebalance # 'ME' = 月末
def run(self, prices, weights, cash_rate_annual):
"""
prices: 日频复权收盘价的 DataFrame
weights: 日频目标权重的 DataFrame
cash_rate_annual: 年化短端利率的 Series(例如 3 个月国库券)
"""
returns = prices.pct_change().fillna(0.0)
# 只在月末再平衡;期间保持权重不变。
rebal_dates = returns.resample(self.rebalance).last().index
held = weights.reindex(returns.index)
held = held.where(held.index.isin(rebal_dates)).ffill().fillna(0.0)
# 资产损益用昨天的权重乘今天的收益。
asset_pnl = (held.shift(1).fillna(0.0) * returns).sum(axis=1)
# 未投入部分(空仓的那几块)的现金收益。
invested = held.shift(1).fillna(0.0).sum(axis=1).clip(0.0, 1.0)
daily_cash = cash_rate_annual.reindex(returns.index).ffill() / 252.0
cash_pnl = (1.0 - invested) * daily_cash
# 再平衡日按换手率成比例计算的交易成本。
turnover = held.diff().abs().sum(axis=1).fillna(0.0)
costs = turnover * (self.cost_bps / 10000.0)
net = asset_pnl + cash_pnl - costs
equity = (1.0 + net).cumprod()
return pd.DataFrame({
'asset_pnl': asset_pnl,
'cash_pnl': cash_pnl,
'costs': costs,
'net_return': net,
'equity': equity,
'invested_fraction': invested,
})
@staticmethod
def summarize(result, benchmark_returns=None):
"""核心统计指标,包括在这里真正重要的那几个。"""
r = result['net_return']
years = len(r) / 252.0
cagr = result['equity'].iloc[-1] ** (1 / years) - 1
vol = r.std() * np.sqrt(252)
sharpe = (r.mean() * 252) / vol if vol > 0 else np.nan
running_max = result['equity'].cummax()
drawdown = result['equity'] / running_max - 1.0
stats = {
'CAGR': cagr,
'Volatility': vol,
'Sharpe': sharpe,
'MaxDrawdown': drawdown.min(),
'CashContribution': result['cash_pnl'].sum(),
'CostDrag': result['costs'].sum(),
'AvgInvested': result['invested_fraction'].mean(),
}
# 决定这块仓位到底该不该进组合的那个数字:
# 核心仓回撤期间与核心仓的相关性。
if benchmark_returns is not None:
bench = benchmark_returns.reindex(r.index).fillna(0.0)
stats['CorrelationToCore'] = r.corr(bench)
stress = bench < bench.quantile(0.05) # 核心仓最差的 5% 交易日
stats['CorrelationInStress'] = r[stress].corr(bench[stress])
stats['ReturnInCoreStress'] = r[stress].mean() * 252
return stats
# ---------------------------------------------------------------------
# 用法示例
# ---------------------------------------------------------------------
if __name__ == "__main__":
# 请换成你自己数据源里的真实复权收盘价。
# 交易范围:股票、久期、黄金、能源、美元。
tickers = ['SPY', 'TLT', 'GLD', 'USO', 'UUP']
dates = pd.bdate_range('2006-01-01', '2026-06-30')
rng = np.random.default_rng(42)
# 波动率各不相同的合成价格路径,纯粹是为了让示例能独立跑起来。
# 实际使用时请替换为真实的历史价格。
sigmas = {'SPY': 0.16, 'TLT': 0.13, 'GLD': 0.15, 'USO': 0.35, 'UUP': 0.08}
prices = pd.DataFrame({
t: 100 * np.exp(np.cumsum(
rng.normal(0.0002, sigmas[t] / np.sqrt(252), len(dates))))
for t in tickers
}, index=dates)
returns = prices.pct_change().fillna(0.0)
# 1. 波动率
vol_est = VolatilityEstimator(window=30)
vols = vol_est.rolling(returns).bfill()
# 2. 信号:200 天均线,配 2% 的滞回缓冲区
signal_gen = TrendSignal(ma_window=200, buffer_pct=0.02)
signals = signal_gen.generate(prices)
# 3. 仓位设定
sizer = InverseVolSizer(sleeve_vol_target=0.10,
portfolio_vol_target=0.10,
max_sleeve_weight=0.40,
max_gross_leverage=1.0)
weights = sizer.size(signals, vols)
weights = sizer.apply_portfolio_vol_target(weights, returns)
# 4. 回测,空仓部分按 4% 的现金利率计息
cash_rate = pd.Series(0.04, index=prices.index)
bt = TrendReplicationBacktest(cost_bps=5.0, rebalance='ME')
result = bt.run(prices, weights, cash_rate)
stats = bt.summarize(result, benchmark_returns=returns['SPY'])
print("趋势仓位统计(合成数据,仅作示意):")
for k, v in stats.items():
print(f" {k:24s} {v: .4f}")
print("\n按年份的平均投入比例:")
print(result['invested_fraction'].resample('YE').mean().round(3))
⚠️ 这段代码没有做的事
它默认跑在合成数据上,所以打印出来的统计量作为预测毫无意义——在得出任何结论之前,先换成真实的复权收盘价。它没有单独建模分红、ETF 费率、具体代码上的买卖价差、已实现收益的税(对一个在应税账户里按月再平衡的策略来说这一项很重要),也没有建模 USO 内部的展期拖累。 这里面的每一项都会让实盘结果比回测更差。 把这段代码当成一个理解机制的框架,并且假定一个真实实现每年要向回测看不到的摩擦让出 1% 到 2%。
💡 有条件的话,把它放在税收优惠账户里跑
一块按月再平衡的只做多/空仓仓位会频繁实现短期收益。在应税账户里,这会把预期收益中相当可观的一部分变成税单;机构版本交易的是受监管期货,能拿到 Section 1256 的 60/40 处理,而散户的 ETF 复制方案拿不到。把这块仓位放进 IRA 或 401(k) 里,就消除了这个策略上最大的一项散户特有拖累。
散户复制方案为什么跟踪不完美
各项差距,按它让你付出多少代价排序
一个 5 只 ETF 的复制方案不会紧密跟踪一个分散化的 CTA 指数,而搞清楚究竟为什么,能防住随之而来的两种失败模式——在它落后时抛弃它,以及在它领先时过度信任它。
跟踪误差的来源,从大到小
| 差距 | 机制 | 影响 |
|---|---|---|
| 标的池广度:5 个 对 60 到 150 个市场 | 没有农产品、工业金属、非美元利率或交叉汇率的外汇;在那些相关但又各不相同的市场之间也没有分散 | 最大。 独立下注的数量更少,意味着收益要颠簸得多,而且会有很长的时间段里复制方案的持仓方向干脆就是不一样的 |
| 只做多/空仓 vs. 多空双向 | 无法把持续的下跌变现,只能避开它们 | 很大。 大致把危机 alpha 砍掉一半;2022 那种类型的回报会明显更小 |
| 信号速度 | 机构项目会把快信号(1 到 3 个月)和慢信号(12 个月)混合起来;单一的 200 日过滤器只有慢的那一档 | 中等。进场和出场都更晚;完全错过更短周期的行情 |
| 无杠杆的约束 | CTA 通过期货保证金把名义暴露做到资本之上;一块 ETF 仓位的上限就是 100% | 中等。波动率更低意味着要达到同样的组合层面效果,需要配置更大的比例 |
| ETF 本身的结构 | 费率、商品 ETF 里的展期拖累、相对标的的跟踪差异 | 中等且持续——这是一项恒定的拖累,不是时有时无的 |
| 再平衡时点 | 在固定日期按月操作,对比机构的连续调整 | 期望上很小,在行情快速变化的月份里偶尔会很大 |
| 税 | 应税账户里的短期实现,对比 Section 1256 处理 | 从很小到很大,完全取决于账户类型 |
关键洞察: 最上面两行是结构性的,散户不上期货就没法把它们抹平。它们下面的每一项都可以靠花力气收窄。一个现实的预期是:这个复制方案能拿到分散化收益中相当可观的一份,以及危机 alpha 量级中较小的一份——有用,但不是那个真东西的替代品。
没人提的离散度问题
即便是在专业 CTA 之间,任何一年里收益的离散度都是巨大的——名义上跑同一个策略的管理人,因为速度、标的池和风险叠加层上的选择不同,收益差出几十个百分点是家常便饭。 这对复制方案有一个令人不适的含义:根本不存在一个单一的"趋势跟随收益"可供跟踪。你那五只 ETF 的仓位会和 CTA 指数不一样,而 CTA 指数的成员之间彼此差得离谱。拿你的复制方案去和某个特定管理人的数字比毫无意义;要比的是它有没有干成本职工作——在你的核心仓回撤期间做出正收益。
组合影响的示意性测算
下面的数字是关于一块趋势仓位如何改变退休组合风险特征的假设性示意 ——它们不是预测,不来自任何经过审计的真实业绩记录,并且会随所考察的时间段、所选的 ETF、费用和税负而大幅变化。它们的作用是把取舍讲具体。
一块 10% 的趋势仓位对 60/40 核心组合的示意性影响
- 单独看这块仓位的预期收益: 在正常利率环境下年化中个位数,其中相当可观的一部分来自空仓部分的现金收益——在一个完整周期里,这个收益明显低于股票核心仓
- 与股票核心仓的相关性: 在完整时间段上大致为零;历史上有用的那个特性是,它不会像信贷和大多数"另类资产"那样,在核心仓的长期回撤期间转为正相关
- 组合最大回撤: 在漫长的、有方向性的熊市里能降低几个百分点;在单日冲击中基本没有变化
- 收益顺序风险方面的好处: 真正实用的那份回报——在 2022 那样的年份里,你有一个可以卖出获利的科目,用来支撑取现,而不必在低点清仓股票
- 持有它的成本: 在 2011 到 2019 那样的十年里,会有一项持续的拖累,大致等于这块仓位相对核心仓的差额,作用在 10% 的资产上——这是真实的,也是这份保险的价格
关键结论: 这块仓位预计会 降低 大多数十年里的总收益,同时 提高 组合熬过糟糕十年的能力。这就是那笔交易。如果这笔交易平白说出来听着不吸引人,那就别做——你不会持有它足够久到能收到回报。
🚨 提防你看到的关于这个策略的每一份回测,包括这一份
趋势跟随是散户金融里被回测得最过度的策略。信号只有两个参数,数据是免费的,一边悄悄在同一批数据上优化回看期,一边做出一张穿越 2008 和 2022 的漂亮净值曲线图,简直易如反掌。已公开的机构研究之所以可信,恰恰 是因为 它在一个世纪和多个资产类别上使用了一条固定、简单、事先设定好的规则,而不是一条调过参的规则。 如果一份回测非得用某个特定的回看窗口才好看,那它就不是证据——那是曲线拟合。 把你的回测放在 150 天、200 天和 250 天上分别跑,并且对每个资产类别单独跑;如果结果只在一个设定下站得住,就把它丢掉。
毁掉趋势仓位的常见错误
错误清单
- 在危机年之后买入: 在 2009 年或 2023 年配置趋势策略,正好在这个策略刚证明了自己之后、又正好在一段可能的干旱期之前。给这块仓位定规模的时机,是在它无聊到没人讨论它的时候。
- 在干旱期里抛弃它: 这是有据可查的品类杀手。指数一路复利的同时你要熬九年不涨,这就是考验,而在干旱期末尾投降,就把你当初开始的全部理由都断送了。
- 拿它和标普 500 比: 把核心仓的成功标准套用到一块工作完全不同的卫星仓上。正确的基准是:核心仓处于回撤时,它有没有做出正收益?
- 把它当成收益引擎来定规模: 25% 到 30% 的配置会把一个对冲工具变成第二个重大押注,并且保证你会在干旱期里被迫重新考虑它。5% 到 15%、从债券里出资,才是站得住脚的区间。
- 跳过波动率定规模: 在 SPY、TLT 和 USO 上跑等金额权重,做出一块风险被石油主导、债券信号纯属装饰的仓位。
- 优化回看窗口: 在同一段历史上测 47 个移动平均长度,然后挑最好的那个。这就是过拟合的定义,而样本外结果会相应地崩掉。
- 推翻这套系统: "信号说该退出 TLT,但我觉得利率已经见顶了。"这套系统的全部价值就在于它移除了这种判断。一次推翻,纪律就永久地毁了。
- 忽视现金收益: 把空仓部分的现金留在近乎零利率的券商扫款账户里,在正常利率环境下,这可能丢掉了策略总收益的三分之一。
- 不加思考就在应税账户里跑: 按月再平衡会产生短期收益;税收拖累可能超过你想通过 DIY 省下的那份费用拖累。
- 把它当成指数核心仓的替代品: 这是这份清单上危害最大的错误。趋势跟随不像股票那样在几十年里复利;一个建立在它之上、而不是建立在低成本指数核心之上的组合并不是分散化的,它是集中押注在一个有着九年干旱期记录的风险溢价上。
你的行动计划
第一阶段:先判断你到底需不需要这个(2 到 4 周)
时间线: 在做任何配置之前,先确认一块趋势仓位是否对应着你真正扛着的某个风险。
- 先确认核心仓是对的 ——一个低成本、广泛分散、债券配置得当的指数核心仓,价值远远超过任何卫星仓。如果核心仓费用高或者过度集中,那就先去修那个;在修好之前,这篇文章跟你无关
- 把你的收益顺序风险量化 ——你前面还有多少年的取现,以及 2022 再来一次、后面接着 2023,会对这个计划造成什么?如果你 25 岁还在积累期,诚实的答案可能是"没什么实质影响",那么任何卫星仓都不必要
- 把联合回撤的情景明确地建模出来 用一个取现模拟器,好让你要对冲的那个风险变成一个数字,而不是一种感觉
- 事先写下来,你愿意忍受多长的干旱期 ——一个具体的年数和一个具体的落后幅度。如果你没法承诺十年,就到此为止
第二阶段:先用纸面跑一遍这个复制方案(2 到 3 个月)
时间线: 在没有真金白银冒险的情况下运行这套系统,观察你自己的反应。
- 把信号表搭起来 针对 SPY、TLT、GLD、USO 和 UUP——价格对 200 日均线、带 2% 缓冲——并且每个月在同一天更新它
- 用真实数据做回测 用上面那套 Python 框架,至少覆盖 2006 年至今,好让样本跨越 2008 年、2011 到 2019 的干旱期和 2022 年;测多个回看期,如果只有一个能跑通就否掉这个策略
- 把系统当时会让你做的事记下来 挑那些你记得很清楚的时刻,并且诚实地记下你当时到底会不会照做
- 拿它和"直接买"这个选项作比较 ——把你能买到的管理期货 ETF 和共同基金的价格算清楚,然后判断它们的广度值不值这份费用,对比你自己复制方案的零费用和更窄的标的池
- 决定空仓部分的现金放在哪里 并且去确认你券商实际的扫款利率,而不是想当然
第三阶段:给这块仓位出资,然后别去动它(6 个月以上,并持续下去)
时间线: 只有在第二阶段给了你一套你理解、也不想去推翻的系统之后才做。
- 从低端起步 ——组合的 5%,从债券那块出资而不是从股票,因为这块仓位替代的正是债券原本在做的一部分分散化工作
- 把它放进税收优惠账户 如果你还有额度的话,以避免按月再平衡带来的短期收益拖累
- 现在就把投资政策声明写下来 ——目标权重、再平衡日期、准确的信号规则,以及一条明确的声明:这块仓位不会拿股票核心仓的收益来评判
- 按计划机械地再平衡,包括那些你不认同输出结果的月份——尤其是那些月份
- 每年按正确的标准复盘一次: 与核心仓的相关性,以及核心仓最糟糕的那些时期里这块仓位的收益。而不是它的绝对收益
- 考虑加到 10% 只有在完整走过一个周期、证明了自己有能力在跑输时拿住它之后才做,而且绝不要在它刚刚表现好的年份之后加
推荐阅读
- 机构研究:
- AQR Capital Management—— A Century of Evidence on Trend-Following Investing 以及作为其基础的《Time Series Momentum》研究(Tobias Moskowitz、Yao Hua Ooi、Lasse Pedersen)
- Man AHL / Man Institute—— Trend Following: Alpha, Alternative, or Arithmetic? 关于策略复制与公平费率
- AQR——关于波动率目标化,以及管理期货类期权式收益结构的研究
- 关于"危机 alpha"以及管理期货在股票回撤期间表现的公开研究
- 相关 PMR 文章:
- Man Group AHL:自适应趋势(关于自适应回看窗口的配套简报)
- AQR 因子动量(横截面的那个对应物——尽管名字里都有动量,却是完全不同的策略)
- Capula:尾部风险 Alpha(趋势模仿凸性之外,直接买入凸性的那条替代路线)
- D.E. Shaw 宏观波动率(regime 识别与危机中的持仓)
- 交易基础:风险管理(支撑上面这一切的仓位设定基本功)
🎯 最后的思考
趋势跟随不是一种赚更多钱的办法。它是一种让你退休组合最糟糕的那个十年少一些破坏力的办法——而它向你收取的价钱,是好的十年里放弃掉的收益。 AQR 那份跨越一个世纪的证据,在这个领域里几乎已经是证据能达到的最好水准;而 Man AHL 那份关于复制的批评则诚实地告诉你:CTA 交付的东西里,大部分是一条公开规则,你自己就能以接近零的费用去跑,只是在广度和执行上会有一个真实但有界的差距。
存活的关键: 这是一块占 5% 到 15% 的卫星仓,它存在的意义是给一个低成本指数核心仓上保险——永远不是取代它。核心仓才是给退休生活出钱的那个;这块仓位只改变路径。如果你以牺牲广泛、便宜的市场暴露为代价去配置趋势跟随,那你就是把一个有着九年干旱期记录的策略拿来当成了计划的地基,而这恰恰是本末倒置。
难的从来不是信号——难的是拿住它熬过 2011 到 2019,好让你在 2022 年时还持有着它。现在就决定你能不能做到,并据此确定它的规模。