第 05 篇
羊驼交易系统
「无脑选股 + 周期性换股」的动量反转混合策略:定期卖掉持仓里收益最差的 n 只、买入全池子里跌得最多的 n 只,赌它们反转。本篇是量化课堂第 5 篇(postId=3423,作者何忆嘉年等,难度入门),用大猩猩/羊驼随机选股的实验开场,讲清动量、反转与「剔除弱者保留强者」的逻辑,并给出参数与改进方向。素材见 raw/collections/jq-quant-classroom/05-05-羊驼交易系统md.md。
这是什么
本篇介绍一个从「羊驼选股」电视实验衍生的可复现策略:周期性地把组合里表现最差(过去一段时间收益最低)的股票卖掉,换成整个股票池里跌得最多的股票,期待它们触底反转;表现好的留在组合里继续涨。因为「随机选股」没法复现,作者用「历史收益最低」代替随机,把随机实验变成了**动量(留下强者)+ 反转(买入超跌)**的混合策略。全篇给出了参数(持股 20、每次换 2、60 天周期、沪深 300 池)与两处改进方向。
核心要点
随机选股的两个实验(开场轶事)
- 美国《旧金山纪事报》做过大猩猩选股实验:大猩猩随机挑 5 只股票的组合,表现比《华尔街日报》8 位知名分析师精心挑选的 5 只还好。
- 2014 年甘肃卫视《马上知道》栏目:让羊驼随机选一堆股票持仓,每天卖掉持有中收益最差的一只、再买入羊驼随机选的一只——也得到可观收益。
- 作者拆解:这是动量因子 + 遗传算法式选择的组合(后文自嘲「这是啥」)。
物竞天择的类比
- 达尔文式选择也发生在股市:投资者 = 大自然,偏好高收益股、厌恶低收益股 → 高收益股票「活下来」、低收益被淘汰。
- 羊驼算法就是一轮轮竞争里剔除表现最差、保留表现优异的,让「优良基因」传承。表现用**过去一段时间的收益率(动量因子)**刻画。
羊驼策略 = 动量 + 反转(用最低收益替代随机)
- 简单版:无脑选股、周期性调仓——每次剔除收益率最差的 n 只,买入随机选的 n 只。
- 可复现版:为了让策略可复现,用「历史收益率最低的股票」代替随机选股。理由:均值回归——买入前期跌幅最大的股票,期待走势反转。
- 一个调仓周期后:当期反转力度最强的股票被留下继续升值;反转最差的被卖掉,换成股票池里跌幅最大的。
- 边界情形:如果持仓里的某只股票既是持仓内跌幅最大、又是全股票池跌幅最大,那就拿着不动(换了自己等于没换)。
- 为什么不干脆用动量选股?作者试过:反复调参后勉强能跑平大盘——所以选择动量 + 反转的组合。
策略实现五步
- 设参数:股票池、调仓周期 holdingPeriod(代码中 tc)、收益率计算周期 returnPeriod(代码中 N)、每次持仓股票数 num_stocks、每次换股数量 change_No。
- 算股票池与持仓中所有股票上一周期的收益率:收益率 = (昨天的收盘价 − (returnPeriod+1) 天前的收盘价) ÷ (returnPeriod+1) 天前的收盘价。
- 可行股票池按 returnPeriod 收益率排序;当前持仓按 holdingPeriod 收益率排序。
- 卖出持仓中收益率最低的 change_No 只;把卖出所得现金 + 原有现金,等额买入全池收益率排名最差的 change_No 只。若某持仓同时落在「持仓最差 change_No」与「全池最差 change_No」里,仅调仓不换股。
- 每 holdingPeriod 天做一次 Rebalance:把持仓中每只股票调整到「手中股票总市值 ÷ num_stocks」的等权水平。
参数与回测结果
- 参数选择:持股 20 只、每次换 2 只、回测期 60 天、调仓期 60 天、从 2008 年 10 月开始;股票池 = 沪深 300。
- 结果:策略有比较稳定的超额收益(图见正文)。
改进空间
- 只按回测期收益最低买入是均值回归思想,还可以结合各股其他指标更精准选股。
- 收益走势与大盘较一致:可以结合大盘走势做择时,避免熊市亏损;也可以卖空股指期货对冲。
机制 / 论证
- 为什么「留下强者」是动量:用过去收益排序,收益高的留在组合里——假设强者恒强,让赢家继续跑。
- 为什么「买最差的」是反转:用跌得最多的补位,赌超跌反弹——均值回归思路。两个动作各服务一边:留强 + 买超跌。
- 用「最低收益」替代「随机」的代价:真正的羊驼是随机的,随机的效果没法稳定复现;换成确定性规则(买跌幅最大)后策略可复现,但性质从「随机实验」变成了「反转策略」。作者对此很坦白。
- 失败案例:纯动量版调参后「勉强跑平大盘」——说明单一动量在 A 股沪深 300 上不够用,反转端才是贡献点。
- 为什么设调仓门槛/固定数量:每次只换 change_No(2 只)而不是全换,控制换手与手续费;60 天低频调仓让反转有时间兑现。
- 工程修正(v1.1):原文更新记录显示 2016-11-10 修复「原调仓目标带入循环导致每次手中剩余部分现金」——资金目标必须在循环外算一次,否则每次只按剩余现金分摊。
可操作
- 参数(保留原文):持股 num_stocks=20;每次换股 change_No=2;收益率计算周期 returnPeriod=60 天;调仓周期 holdingPeriod=60 天;起始 2008-10;股票池沪深 300(池的取法见 股票池(交易对象范围与过滤))。
- 收益率公式:收益 = (昨收 − (returnPeriod+1) 天前收盘) ÷ (returnPeriod+1) 天前收盘。
- 每周期动作:持仓按 holdingPeriod 收益排序、池子按 returnPeriod 收益排序 → 卖持仓最差 2 只 → 现金等额买池子最差 2 只(交集则不换股)→ 每 holdingPeriod 天 Rebalance 到等权(总市值/20)。
- 代码教训:调仓目标市值要在循环外先算死,避免「剩余现金」逐次摊薄(v1.1 修复点)。
- 落地提示:60 天/等权调仓适合 run_daily 低频节奏(run_daily 与任务节奏控制(定时任务));下单用 order_target_value 一类拉到目标(聚宽下单 API 与订单对象)。正文未贴完整代码,具体 API 在附图与官方源码 [需要验证]。
术语
- 动量因子:用过去一段时间的收益率衡量强弱、强者恒强。
- 均值回归 / 反转:跌多了会弹回,买超跌股赌反弹。
- Rebalance(再平衡):定期把组合调回目标权重(此处为等权)。
- returnPeriod / holdingPeriod:算收益用的周期 / 调仓周期。
- 遗传算法:本文只取其「适者生存、剔除弱者」的朴素类比,不是严格的遗传算法(无交叉变异)。
不确定 / 待验证
- 回测收益只有图、无数值;「稳定超额收益」是正文断言。
- 「羊驼实验」与「大猩猩实验」为媒体轶事转述;大猩猩实验里 8 位分析师的表述以原文为准。
- 作者称策略结合了「遗传算法」,但正文描述的是剔除最差/保留最好的选择流程,没有交叉、变异——按叙述类比理解 [需要验证]。
- 参数(20/2/60/60)是作者调参结果,未必可迁移;完整代码在附图与官方源码,raw 未含 [需要验证]。
相关
- 均值回归(买超跌赌反转) — 反转:买入超跌等反弹
- 趋势跟踪(顺势而为的策略家族) — 动量端与趋势跟踪的对照
- run_daily 与任务节奏控制(定时任务) — 60 天低频调仓的节奏实现
- 聚宽下单 API 与订单对象 — 等权再平衡的下单写法
- 聚宽量化课堂(低频量化策略 43 篇) — 量化课堂 43 篇总览
更新 2026-09-06