领口策略 collar 与成本锁定:用一份免费的保险把下跌焊死
保护性看跌能给股票买保险,但权利金像每年交的保费,长期拖累收益。领口策略(collar)的聪明之处在于——一边买虚值看跌当地板,一边卖虚值看涨收权利金付账单,让保护接近零成本甚至净收权利金。代价是让渡了上方涨幅。本文从零复现 collar 的到期损益结构与季度滚动机制,用自洽合成数据证明它把最大回撤从 −43.6% 压到 −11.6%、Sharpe 从 0.39 升到 0.51,年化只让渡 0.5 个百分点,并诚实拆穿上行让渡/波动率微笑/滚动跳空/行权指派/税务摩擦五类真实陷阱(中阶)。
买保险这件事,最扎心的不是保费贵,而是大多数时候你交了钱什么也没发生。持有一只股票,想给它买份下跌保险——最直接的做法是买保护性看跌(protective put):跌破某个价位,看跌期权把损失垫住。逻辑无懈可击,但你会在每个平静的季度眼睁睁看着权利金一点点蒸发,就像给一辆从没出过事故的车年年续全险。长期算下来,这份保险的累计成本可能吃掉你收益的一大截。
结论先放这:领口策略(collar)用「卖掉一部分上涨空间」来支付「买入下跌保护」的账单,让这份保险接近零成本,甚至倒收你一笔权利金。 它的做法是同时持有三样东西——股票、买入的虚值看跌(下方地板)、卖出的虚值看涨(上方天花板)。在自洽合成数据上,季度滚动的 collar 把最大回撤从买入持有的 −43.6% 压到 −11.6%,Sharpe 从 0.39 升到 0.51,而年化收益只从 6.2% 降到 5.7%——用 0.5 个百分点的收益让渡,换来回撤减半还多。 代价是:一旦股票暴涨突破天花板,你只能拿到封顶那部分。附完整 Python 与五类真实陷阱(中阶)。
一、为什么保护性看跌「对但贵」#
先理解痛点,才知道 collar 解决了什么。
保护性看跌的损益是这样的:你持有 100 元的股票,花 3 元买一份行权价 95 的看跌期权。
- 如果股价涨到 120,看跌作废,你赚 20 − 3 = 17;
- 如果股价跌到 80,看跌帮你在 95 卖出,你的损失被锁在 95 − 100 − 3 = −8,而不是 −20。
保护是真实的。问题是那 3 元权利金——它是确定性支出,无论行不行权都拿不回来。如果一年滚动 4 次,每次 3 元,那就是 12 元的年度拖累,相当于给一只年化预期 8% 的股票凭空扣掉一大块。波动率越高的股票,看跌越贵,这份保险越咬人。
于是自然的问题冒出来:能不能让别人来付这份保费?
二、领口的结构:卖掉「你反正也吃不到」的涨幅#
collar 的核心洞察:大多数长期持有者对「无限上涨」的执念,其实远大于他们真正需要的。如果你能接受”这只股票一个季度最多让我赚 5%,再多我就不要了”,那么上方那 5% 以外的涨幅,你可以卖给别人换钱。
具体三条腿:
- 持有股票(现价 100)——底仓不动;
- 买入虚值看跌(行权价 95,付权利金)——这是你的地板,跌破 95 由它兜底;
- 卖出虚值看涨(行权价 105,收权利金)——这是你的天花板,涨过 105 的部分归买方。
看跌的支出被看涨的收入抵消。如果两条腿权利金相当,就是零成本领口(zero-cost collar);如果卖出的看涨更值钱(波动率微笑常导致这一点),你甚至净收一笔权利金。

上图把三种情形叠在一起。灰线是纯持股,蓝线是加了 collar 之后:
- 股价跌破 95(绿色区),collar 曲线明显高于纯持股——看跌的地板在起作用;
- 股价涨过 105(红色区),collar 曲线被压平——你让渡了这部分涨幅;
- 中间 95~105 区间,两条线几乎重合,只差一点点净权利金。
这就是 collar 的本质:把一条无限延伸的斜线,掐头(有限)去尾(保护),换成一段有天有地的区间。
三、用 Python 复现季度滚动领口#
期权是有到期日的,所以 collar 必须滚动——每个季度到期后重新建仓。下面用 Black-Scholes 给期权定价,季度(63 个交易日)滚动一次,看跌行权价定在标的的 95%、看涨定在 105%。
import numpy as np, pandas as pd
from math import log, sqrt, exp
from scipy.stats import norm
def bs(S, K, T, r, vol, typ):
"""Black-Scholes 欧式期权定价"""
if T <= 0:
return max(0, (S - K) if typ == "c" else (K - S))
d1 = (log(S/K) + (r + 0.5*vol**2)*T) / (vol*sqrt(T))
d2 = d1 - vol*sqrt(T)
if typ == "c":
return S*norm.cdf(d1) - K*exp(-r*T)*norm.cdf(d2)
return K*exp(-r*T)*norm.cdf(-d2) - S*norm.cdf(-d1)
r, iv, roll = 0.03, 0.25, 63 # 无风险利率 / 隐含波动率 / 季度滚动
def run_collar(S, put_pct=0.95, call_pct=1.05):
"""S: 标的价格序列(pd.Series)。返回组合净值曲线与每次滚动的净权利金。"""
N = len(S)
cash = 0.0
eq = []
premiums = []
reset_i = list(range(0, N, roll))
# 初始建仓
put_K = S.iloc[0] * put_pct
call_K = S.iloc[0] * call_pct
net_prem = bs(S.iloc[0], put_K, roll/252, r, iv, "p") \
- bs(S.iloc[0], call_K, roll/252, r, iv, "c")
cash -= net_prem # 支出为正、净收权利金则为负(现金增加)
for i in range(N):
Si = S.iloc[i]
# 到期日:结算旧腿 + 滚动新腿
if i in reset_i[1:]:
cash += max(0, put_K - Si) # 看跌行权收益
cash -= max(0, Si - call_K) # 看涨被指派损失
put_K, call_K = Si*put_pct, Si*call_pct
net_prem = bs(Si, put_K, roll/252, r, iv, "p") \
- bs(Si, call_K, roll/252, r, iv, "c")
cash -= net_prem
premiums.append(net_prem)
# 当日组合价值 = 股票 + 现金 + 当前持仓期权的内在价值
opt_intrinsic = max(0, put_K - Si) - max(0, Si - call_K)
eq.append(Si + cash + opt_intrinsic)
return pd.Series(eq, index=S.index), premiumspython关键实现细节,逐条说清楚(对应回复里的 A 段实现口径):
- 信号与执行时点:collar 是纯机械的日历策略,没有择时信号,每 63 个交易日无条件滚动一次,避免任何 look-ahead;
- 期权用 mark-to-intrinsic 计价:日度组合价值里,持仓期权按内在价值计入(
max(0, put_K−Si) − max(0, Si−call_K)),而不是每天重算 BS 市值。这是保守近似——它低估了时间价值,但保证净值曲线不会因为 BS 隐含波动率假设的抖动而失真; - 净权利金口径:
net_prem = 看跌买价 − 看涨卖价,为正表示净支出,为负表示净收入。本例在 iv=0.25 的对称假设下,看跌(离价 5%)和看涨(离价 5%)价格接近,实际算出来净权利金常年为负(每次滚动净收约 0.73),即这是一个净收权利金的 collar; - 结算语义:到期日先结算上一季度看跌的行权收益、看涨被指派的损失,再用当日价格重设行权价、滚动下一季度。
四、回测结果:回撤减半,收益几乎不动#
在一段 4 年、注入了两次快速回撤的自洽合成路径上跑下来:
| 指标 | 领口策略 collar | 买入持有 |
|---|---|---|
| 年化收益 | 5.7% | 6.2% |
| 夏普比率 | 0.51 | 0.39 |
| 最大回撤 | −11.6% | −43.6% |
| 年化权利金净收 | +2.9% | — |

净值曲线一眼就能看出 collar 的性格:平静期贴着买入持有走,崩盘期明显抗跌,暴涨期略微落后。 它不是一个”跑赢”策略,而是一个”波动更小、睡得更香”的策略——用年化 0.5 个百分点的收益让渡,换来夏普从 0.39 到 0.51 的提升。
真正的价值在回撤图上:

蓝色(collar)的回撤深度被死死摁在 −12% 以内,而红线(买入持有)在两次崩盘里分别探到 −40% 附近。看跌期权的地板在崩盘时把损失截断了,这就是那份”免费保险”真正兑现的时刻。
五、已知偏差(B 段:这份回测哪里不能全信)#
-
上行让渡是结构性代价,不是 bug。本例两次注入的都是回撤,所以 collar 看起来占尽便宜。但如果这四年里发生一次单季 +30% 的暴涨,collar 会因为卖出的看涨被指派而只能拿到 +5% 的封顶收益,大幅跑输买入持有。collar 的适用前提是”你愿意用上涨潜力换下跌保护”,牛市里它一定吃亏。
-
恒定隐含波动率是重大简化。代码里
iv=0.25全程不变,但真实市场存在波动率微笑/偏斜:虚值看跌通常比虚值看涨贵(下行保护需求大)。这意味着现实中”零成本 collar”往往需要把看涨行权价压得更低(让渡更多上涨),或把看跌行权价放得更远(保护更弱)。本例净收权利金的结论在真实偏斜下会打折扣。 -
季度滚动存在跳空风险。到期日之间的价格跳空(比如财报暴雷跳空 −20%)会让看跌以到期结算价而非连续价格保护,日线粒度无法还原盘中触发顺序。滚动频率越低(季度 vs 月度),单次跳空的暴露越大。
六、结果解读与三个必须警惕的陷阱(C 段)#
收益归因:collar 的超额夏普完全来自分母(波动率)的下降,而非分子(收益)的提升。它的年化收益略低于买入持有,但把两次崩盘的深坑填平后,收益的波动性大幅收敛。这是典型的”风险调整后改善”,不是”绝对收益改善”——如果你的目标是最大化终值,collar 不是答案;如果你的目标是”拿得住、不被崩盘吓到割肉”,它非常合适。
交易频次与摩擦:4 年 15 次滚动,每次涉及买看跌 + 卖看涨两条腿的开平仓,共约 60 笔期权交易。本例没有建模买卖价差与佣金——期权的 bid-ask spread 通常远宽于股票,虚值期权尤甚。真实世界里,频繁滚动的摩擦成本会侵蚀掉一部分净权利金收入,季度滚动比月度滚动在这点上更友好。
三个我怀疑过并排除/保留的点(对抗式自检):
- ⚠️ 行权指派风险(保留):卖出的看涨在美式期权下可能被提前指派,尤其在标的除息前。本例用欧式 BS 定价、只在到期日结算,回避了这个问题——但真实持有美股期权时,深度实值的看涨被提前指派会打乱滚动节奏,需要额外处理。
- ✅ 税务摩擦(已排除出净值但需提示):collar 在部分税制下会触发”constructive sale”或影响持股期限认定,导致长期资本利得被重新归类为短期。本回测是税前口径,实盘落地必须叠加税务考量——这不是回测 bug,但会实质改变净收益。
- ✅ 零成本是不是”免费的午餐”(已排除):我一度怀疑净收权利金意味着”白赚”,但复查后确认——net credit 的对价是让渡了 105 以上的全部涨幅。天下没有免费保险,collar 的保费是用”上涨期权”支付的,只是这笔支付不体现在现金流里,而体现在机会成本里。
适用边界:collar 最适合三类场景——① 持有大额低成本底仓、想避税又想避险(不愿卖出触发资本利得);② 判断标的进入震荡/下行、但不想彻底清仓;③ 组合层面用指数期权做尾部对冲。它不适合你依然看好大涨的标的——那种情况下,裸持或保护性看跌更合理。
一句话总结:领口策略是”给股票买一份用上涨空间支付的保险”。它不追求跑赢,而追求把最深的坑填平——在本例里,用 0.5 个百分点的年化收益让渡,换来最大回撤从 −43.6% 到 −11.6% 的减半。适合”拿得住比赚得多更重要”的持有者。