跳转至

M20 波动率交易与期权基础

层级:L4 实战与前沿 | 优先级:★★ | 预计学时:10 小时 对应原书:黑箱里和风险、执行有关的章节,只作地图 前置知识:M04 的波动目标;M18 的整手。 读书笔记:期权卫星 状态:reviewed 数据截至:2026-10|最近复核:2026-10-22


学习目标

  1. 用手算备兑看涨在到期时把上行截断在哪里,以及多出来的权利金保护了多少下跌。
  2. 说明现金担保看跌占用的是行权价对应的现金,不是权利金。
  3. 把保护性看跌在行权价以下的到期盈亏收成一个常数。
  4. 用仓库函数把目标波动的倍数限制在 1,波动偏低时不放大仓位。
  5. 不把假设的权利金写成交易所报价,也不把卖出裸期权写成收益增强。

本章知识拓扑图

flowchart TB
    STK["股票 100"] --> CC["备兑看涨:股票加卖出看涨"]
    CASH["现金等于行权价"] --> CSP["现金担保看跌"]
    PUT["买入看跌"] --> TAIL["保护性看跌"]
    VOL["已实现波动"] --> SCALE["倍数 = min(1, 目标/当前)"]
    SCALE --> STK
    NAKED["没有股票或现金的卖出期权"] --> STOP["不作为增强"]

到期盈亏是合约最后一天的身份。它不是明天的盯市,也不是保证金通知。


🟢 入门层:权利金是把尾部卖给别人

1. 备兑看涨截断的是上行

股票现价 100。卖出一张行权价 105 的看涨,收到权利金 3。这些数字是教学输入,不是某一天的报价。到期时,股票仍在手里,看涨的支付是 max(S_T − 105, 0)。相对起初的 100,盈亏是

S_T − max(S_T − 105, 0) + 3 − 100

到期价 只持有股票 备兑看涨
90 −10 −7
100 0 +3
120 +20 +8

看涨在 105 以上被行权。到期价 120 时,股票赚 20,备兑只赚 8。少掉的 12 给了看涨的买方:价格超过 105 的 15,减去你已经收下的 3。买方付的就是这 3,换去 105 以上的上涨。

看涨到期无价值时,盈亏是 S_T + 3 − 100。它等于 0 的到期价是 97。权利金把下跌的盈亏平衡从 100 降到 97,没有取消 90 时仍然存在的 −7。上行则被帽在

105 − 100 + 3 = 8

左:三个到期价上,备兑看涨与只持有股票。右:目标波动 10% 时,当前 20% 缩到 0.5 倍,当前 8% 停在 1 倍。

2. 现金担保看跌占用的是行权价

卖出看跌、行权价 95、权利金 2。到期盈亏是 −max(95 − S_T, 0) + 2。

到期价 盈亏
110 +2
95 +2
80 −13

80 时要按 95 买下股票,股票只值 80,权利金只抵 2。现金必须覆盖 95,不能只覆盖 2。2/95 = 0.021053 是这份合约存续期内权利金除以行权价,不是一年的收益率,也不能乘上 12 或 365/期限。股票跌到 80,这份「收入」变成 −13。

买入看跌作保护:行权价 90、权利金 2、股票成本 100。到期价低于 90 时,

(S_T − 100) + max(90 − S_T, 0) − 2 = 90 − 100 − 2 = −12

到期价 70、100、130 的盈亏是 −12、−2、+28。低于 90 的任何到期价,到期盈亏都是 −12。保护不是免费的:股票停在 100,看跌过期,你亏掉权利金 2。


备兑看涨把上涨的尾巴卖给别人,权利金垫在下跌的前面,尾部大跌仍在股票上。现金担保看跌把行权价留在现金里,不是只留下权利金。 做多波动率的期货或基金,远月比近月贵时,每次换月都在付升水。近月 16、次月 20 的教学差是 0.250000。VIX 指数当天的收盘不能拿来持有。 Delta 把期权折成大约多少股的现货敞口,回答的是到期之前的小幅变动。到期赚 8 还是亏 7,是另一张表。 个人账户只把这些工具当成已有股票的卫星。裸卖、以及把倍数放大到 1 以上,都不在本轮杠杆上限里。

🟡 进阶层:期限结构和只减仓的倍数

3. 近月和次月的差不是指数本身的涨跌

升水是远月比近月贵。做多近月、到期前买进更贵的次月,每次换月都在付这个差。 近月 16、次月 20 时,差是 (20 − 16) / 16 = 0.250000。长期滚动做多波动率工具,会把这个差反复付出。 VIX 指数本身不能按这个公式持有。指数当天的涨跌是另一列数。 近月 28、次月 22 时差是 −0.214286,形态反过来,不要把两个词当成指数的涨跌。

下面两个数仍是教学输入,不是 Cboe 的收盘。近月 16、次月 20。做多近月、展期时买进次月,每滚一次相对近月价格的差是

(20 − 16) / 16 = 0.250000

近月 28、次月 22 时,

(22 − 28) / 28 = −0.214286

第一组是近月低于次月,做多近月的展期要付出这个差。第二组符号相反。VIX 指数本身不能按这个公式持有。期货的期限结构和指数的一日涨跌是两列数。M04 只把 2020-03-16 的 VIX 记成收在 80 以上,用来对照波动目标的减仓,不是一张可以交易的期限结构。

4. 目标波动的倍数到 1 为止

仓库函数是

w = min(1, σ_目标/σ_当前)

当前波动 20%、目标 10%:10/20 = 0.5,函数返回 0.5000。当前波动 8%、目标 10%:想要的倍数是 0.10/0.08 = 1.2500,函数返回 1.0000。上限写成 1,是为了只减仓、不借钱把波动抬到目标。本轮杠杆上限也是 1.0。

M04 在 SPY 种子上的全年 2020:买入持有 CAGR 18.29%、夏普 0.61、回撤 −33.70%;目标波动是 4.44%、0.24、−16.89%。回撤变浅,反弹也少了一截。全样本上限 1.0 的夏普是 0.70,买入持有是 0.73。波动目标在那段样本里不是收益增强。

美股股票期权常见的合约乘数是 100 股。持有 150 股时,备兑看涨最多卖出 1 张。卖出 2 张会有 50 股对应的看涨没有股票覆盖,那一张的上行不再有上限。整手向下取整的道理相同:不够一张,就不要凑。

到期盈亏不管希腊字母。到期日之前,看涨的价格还会随波动和剩余时间变化。美式股票期权可以在到期前被行权,备兑看涨的股票可能被提前叫走。本章的表只在到期、且没有提前行权时成立。保证金以交易所和券商当时的规则为准,不把权利金 2 写成已经满足保证金。

5. 平价把看涨和看跌锁在同一只股票上

欧式期权、期间不派息时,看涨减去看跌等于股票减去行权价的现值:

C − P = S − K e^(−rT)

教学输入:现价 100,行权价 100,贴现因子 e^(−rT) = 0.99,所以右边是 100 − 99 = 1。若看涨权利金是 5,平价要求看跌是 4。若市场上的看跌标成 6,两边相差 2。这个 2 是平价被打破的差额,不是已经赚到的价差。要把它锁死,需要买入便宜的一边、卖出贵的一边,并借或贷行权价的现值。只做多、杠杆上限 1.0 的现货账户做不了这一组。差额留在纸上,直到你真的能借到券、融到现金,并且期权是欧式、期间没有股息。

美式股票期权可以提前行权,平价变成不等式,5 和 6 不再精确差 2。有股息时,右边还要减去股息的现值。本章的 1 和 2 只在「欧式、不派息、贴现因子 0.99」这三条同时成立时使用。它们不是某一天的报价,绘图脚本也不计算平价。

同一条恒等式说明,备兑看涨和现金担保看跌在欧式、行权价与期限相同、并且现金按同一贴现因子记账时,是同一张损益的两种写法。上面的备兑用的是行权价 105、权利金 3,担保看跌用的是行权价 95、权利金 2。行权价不同,不能用平价说它们相等。

6. 隐含波动是报价倒推出来的,实现波动是后来走出来的

隐含波动是把权利金代回定价公式反解出来的数。实现波动是后来的收益率算出来的数。 这组教学输入是 0.20 对 0.16,差 0.040000。它不是 VIX,也不是某一篇论文的样本均值。 卖方收的是这份差的平均,左尾仍要赔。个人账户不要把教学差写成已经锁住的现金。 升水换月的损耗在第 3 节,不混进这 0.040000。

把到期盈亏里的权利金 3 放进定价公式,反解出来的波动率叫隐含波动率。事后用收益率算出来的波动率叫实现波动率。两者之差常被叫做波动率风险溢价。本章给一组教学输入:隐含 0.20,其后实现 0.16,差 0.040000。这不是 VIX,也不是某篇论文的样本均值。

卖保险的人收下的是隐含波动里高出事后实现的那一部分。买方买的是下跌或跳空时的赔付。长期平均看起来卖保险有正的差,是因为买方愿意为负偏和肥尾付费:多数日子实现波动低于隐含,少数日子价格跳空,卖方一次亏掉很多期的权利金。备兑在到期价 120 少赚的 12,担保看跌在 80 亏的 13,就是这种赔付的教学版。0.040000 的差没有把这两笔赔付减掉,所以不能写成已经落袋的增强。

隐含波动沿行权价排开,通常不是一条平线。平值附近的教学隐含是 0.20,行权价 90 的看跌隐含是 0.28,差 0.080000。低行权价更贵,是市场在为下跌付更高的保险,不是公式写错。这条向下倾斜的差叫偏斜。若两侧虚值都比平值贵,形状叫微笑。本章不估计微笑的曲率,也不用 0.28 去替换备兑那张表里的权利金 3。

期限结构是同一标的、不同到期月份的隐含或期货价格。近月 16、次月 20,近月低于次月,做多近月再展期要付出 (20 − 16) / 16 = 0.250000。这组形态常被叫做升水。近月 28、次月 22,近月高于次月,展期差是 (22 − 28) / 28 = −0.214286,形态反过来。两个词描述的是远月相对近月的高低,不是指数当天涨了还是跌了。M04 里 2020-03-16 的 VIX 收在 80 以上,只用来对照波动目标的减仓,不能代入 16 或 28。

7. 四个希腊字母是到期之前的敏感度,不是到期盈亏

Delta 0.205467 是现价小动一动时期权价格的一阶变化,不是到期赚多少。 卖出 1 张、乘数 100,空头等价是 20.5467 股。150 股备兑这一张之后,股票等价是 129.4533。 把 Delta 乘进到期盈利 8,是把到期之前的敏感度和到期身份焊在一起。两套账分开报。 教学输入是现价 100、行权价 105、波动 0.20、期限 30/365。到期盈亏表仍然不用这四个字母。

Black–Scholes 在一组固定输入上给出四个一阶或二阶敏感度。教学输入:现价 100,行权价 105,利率 0,波动 0.20,期限 30/365,不派息,欧式看涨。d₁ = −0.822250。

字母 定义 这组输入上的值 现货卫星里怎么读
Delta 价格对现价的导数,约等于涨 1 元时期权涨多少 0.205467 卖出 1 张、乘数 100,相当于空了 20.5467 股
Gamma Delta 对现价的导数 0.049620 现价一变,上一步的 20.5467 股就要重算
Vega 价格对波动率的导数,波动率变动 1(从 0 到 1) 8.156657 波动率上升 0.01,约 +0.081567;卖出看涨的符号相反
Theta 价格对日历时间的导数,再除以 365 得到每日 每日 −0.027189 其他输入不变时,多过一天权利金大约少这点;卖方符号相反

150 股股票的 Delta 是 150。卖出 1 张备兑看涨之后,股票等价大约是 150 − 20.5467 = 129.4533。卖出第 2 张会让没有股票覆盖的那一张把等价仓位再减 20.5467,上行不再有帽。这四个数在现价、波动或期限变动后都要重算。美式提前行权、股息和利率不为 0 时,表内数字不再成立。本仓库不发送期权订单,也没有希腊字母的持仓账。表是监控时应核对的身份,不是已经接到券商的风险报告。

到期盈亏表仍然不管这些字母。到期价 120 时备兑赚 8,这个 8 不需要 Delta。Delta 回答的是到期之前现价小动一动、仓位相当于多少股。把 0.205467 乘进 8,是把两套问题焊在一起。

import math

import numpy as np


def _norm_cdf(x: float) -> float:
    return 0.5 * (1.0 + math.erf(x / math.sqrt(2.0)))


def _norm_pdf(x: float) -> float:
    return math.exp(-0.5 * x * x) / math.sqrt(2.0 * math.pi)


def european_call_greeks(spot: float, strike: float, rate: float, vol: float, year_frac: float) -> dict[str, float]:
    """欧式、不派息。Vega 对波动率 1.00;Theta 已除以 365,是每日。"""
    d1 = (math.log(spot / strike) + (rate + 0.5 * vol * vol) * year_frac) / (vol * math.sqrt(year_frac))
    delta = _norm_cdf(d1)
    gamma = _norm_pdf(d1) / (spot * vol * math.sqrt(year_frac))
    vega = spot * _norm_pdf(d1) * math.sqrt(year_frac)
    theta = -(spot * _norm_pdf(d1) * vol) / (2.0 * math.sqrt(year_frac)) / 365.0
    return {"d1": d1, "delta": delta, "gamma": gamma, "vega": vega, "theta_per_day": theta}


def parity_gap(call: float, put: float, spot: float, strike: float, discount: float) -> float:
    """欧式、不派息。discount 是 e^{-rT}。只做多账户锁不住这个差额。"""
    return (call - put) - (spot - strike * discount)


def expiry_payoffs(spots: np.ndarray) -> dict[str, np.ndarray]:
    """现价 100。备兑卖 105 收 3;担保看跌卖 95 收 2;保护性看跌买 90 付 2;领口净收 1。"""
    stock = spots - 100.0
    covered = stock - np.maximum(spots - 105.0, 0.0) + 3.0
    csp = np.where(spots >= 95.0, 2.0, 2.0 - (95.0 - spots))
    protective = stock + np.maximum(90.0 - spots, 0.0) - 2.0
    collar = stock - np.maximum(spots - 105.0, 0.0) + np.maximum(90.0 - spots, 0.0) + 1.0
    return {"stock": stock, "covered": covered, "csp": csp, "protective": protective, "collar": collar}

教学输入 european_call_greeks(100, 105, 0.0, 0.20, 30/365) 给出 d₁ = −0.822250、Delta 0.205467、Gamma 0.049620、Vega 8.156657、每日 Theta −0.027189。parity_gap(5, 6, 100, 100, 0.99) 是 2。这些函数不连接行情,也不生成订单。

8. 领口是把备兑和保护性看跌叠在同一只股票上

领口同时持有股票、买入行权价 90 的看跌(权利金 2)、卖出行权价 105 的看涨(权利金 3)。净收入权利金 1。到期盈亏是

(S_T − 100) − max(S_T − 105, 0) + max(90 − S_T, 0) + 1

到期价 领口 只持有股票 备兑看涨 保护性看跌
70 −9 −30 −7 −12
100 +1 0 +3 −2
120 +6 +20 +8 +28

低于 90 时,领口收成 90 − 100 + 1 = −9。高于 105 时,收成 105 − 100 + 1 = +6。地板比保护性看跌的 −12 高 3,是因为卖看涨又收回了 3,但上行帽从「没有帽」或保护性看跌的 +28 收成 +6,也比只做备兑的 +8 少 2,因为看跌的权利金花掉了。现金担保看跌不在这张表的同一列:它没有一开始就持有股票,占用的是 95 的现金,到期价 80 时亏 13。

四张策略因此回答四个不同的问题。备兑用上行换权利金,下行仍跟股票走,只垫了 3。现金担保看跌用下跌换权利金,现金必须覆盖行权价。保护性看跌花钱买地板,上行还在。领口用卖看涨的权利金去付看跌,地板和帽同时出现。没有股票也没有现金的裸卖,不在这四张里。


🔴 深入层:卖出尾部的人在收保险费

9. 收入型卖权的对手是买方的尾部

备兑看涨收下的 3,是看涨买方为 105 以上的上涨支付的。现金担保看跌收下的 2,是看跌买方为 95 以下的下跌支付的。你收保险费的时候,尾部留在自己的账户里:备兑在 120 少赚 12,担保看跌在 80 亏 13。把权利金除以行权价得到的 2.1053% 写成增强,是把保费当成了没有赔付的利润。

裸卖看涨没有股票覆盖,到期价越高,亏损越大,表里的 +8 不再是帽。裸卖看跌没有现金覆盖,行权时要另外找 95。两条都不在这张只减仓的倍数里,也不在杠杆上限 1.0 的现货账户里。

保护性看跌把 90 以下的到期盈亏收成 −12,代价是股票不跌时先付 2。它和波动目标减仓是两种不同的尾部处理:看跌在到期前保留股票的数量,波动目标在波动升高时把股票数量乘上小于 1 的倍数。2020 年那张表说明,减仓之后波动下降得比价格慢,仓位恢复得也慢,V 型反弹里少赚。看跌则在到期时才按行权价结算,中间的盯市可以和 −12 差很远。


真实案例

到期表上的 −7、+8、−13 和 −12 仍是正文的手算。下面用 momentum_plus_lab/seed_data/spy.csv 的复权收盘,按 figures/M04/plot_vol_target.py 的同一套规则记账:波动率是截至昨日的 EWMA(span 60),目标 12%,仓位 min(1, σ_目标/σ),现金收益记 0。种子里没有期权收盘,备兑和保护性看跌不另造权利金净值。它们和波动目标的差别,用这些月份的真实涨跌和当天的股票权重来读。

案例 1:2020 年 2–4 月,减仓留在反弹外面

2020-02-01 至 2020-04-30 共 62 个交易日。买入持有的区间收益是 −9.16%,区间内最大回撤 −33.70%,年化波动 59.56%。上限 1.0 的波动目标,区间收益 −7.24%,回撤 −16.43%,年化波动 20.29%。权重均值 0.4596,最低 0.1811,4 月 30 日仍是 0.2233。

2020-02-19 的权重是 1.0000,下跌前的波动还没有把仓位打下来。2020-03-23 的权重是 0.1965。3 月复权收盘 −12.46%,是 2020 年唯一跌破 −10% 的月份。4 月复权收盘 +12.70%,当月权重均值 0.2002,波动目标在这一个月只拿到 +2.52%。回撤变浅的那一截,和 4 月少拿的大约 10 个百分点,是同一条权重路径的两边。

备兑看涨在这段里不会把股票股数乘到 0.20。它一直持有股票,所以 3 月的 −12.46% 仍在现货上;4 月的 +12.70% 里,超过行权价的那一段归看涨买方。正文的行权价 105 对现价 100,是上涨 5% 就碰到帽。4 月已经高于这条线。保护性看跌同样不减少股数,它用权利金换 90 以下的到期地板。3 月跌破 −10%,是地板会碰到的那一个月。权利金本身不在种子里,不能把 −12 或 +3 加进这条 SPY 净值。

案例 2:2022 年全年,权重低于 1,慢熊和 V 型不是同一张账单

2022 年 251 个交易日。买入持有的复利是 −18.24%,波动 24.24%,夏普 −0.79,最大回撤 −24.50%,全年收益 −18.17%。上限 1.0 的波动目标:复利 −12.09%,波动 12.80%,夏普 −1.10,回撤 −15.63%,全年收益 −12.04%。2022-01-03 的权重是 0.8159,2022-12-30 是 0.5188,全年均值 0.5321,最低 0.4024。权重全程低于 1,所以这一年和 M04 表里上限 1.5 的 −12.09%、12.80%、−1.10、−15.63% 在已印刷的位数上相同。

2022 年没有一个月的复权收盘低于 −10%。高于 +5% 的有三个月:7 月 +9.21%,10 月 +8.13%,11 月 +5.56%。波动目标大约半仓穿过这些月份,也大约半仓穿过 4 月的 −8.78% 和 9 月的 −9.24%。备兑看涨会保持满仓,三个上涨月里超过 5% 的部分交给买方,下跌月仍跟股票走。保护性看跌也保持满仓,这一年没有月份跌到正文那种 −10% 的地板以下。2020 年 4 月少赚的是仓位还没回来;2022 年少亏的是仓位一直不高。两段都不能从权利金 3 或 2 里读出增强。

案例 3:上限 1.0 的 2020 全年,和表里上限 1.5 的那一行

同一条规则、上限改成 1.0 时,2020 全年买入持有仍是复利 18.29%、夏普 0.61、回撤 −33.70%。波动目标是复利 4.71%、波动 12.91%、夏普 0.27、回撤 −16.43%,权重均值 0.5285。M04 表里 4.44%、0.24、−16.89% 是上限 1.5 的那一行。下跌之前权重可以高于 1 的那一档,不在本轮杠杆上限里。全样本上限 1.0 的夏普 0.70,买入持有是 0.73。减仓换来的是更浅的回撤,不是更高的夏普。


方法论来源

概念 / 模型 核心文献或规范出处
欧式看涨与希腊字母 Black & Scholes (1973);输入 S=100、K=105、r=0、σ=0.20、T=30/365
看涨看跌平价 欧式、不派息;贴现因子 0.99 时右边为 1
波动率风险溢价 教学输入 0.20 减 0.16,不是 VIX
四种到期结构 备兑、现金担保看跌、保护性看跌、领口;不发送期权订单
波动目标 target_volatility_scale,上限默认不超过 1
图 figures/M20/plot_options.py
SPY 路径 Labs/momentum_plus_lab/seed_data/spy.csv;权重规则与 figures/M04/plot_vol_target.py 相同,本节上限为 1.0

💡 思考回顾与巩固

核心认知纠偏

误区 反例 用法
备兑看涨只是多收 3,上行还在 到期价 120 时股票 +20,备兑 +8 帽是 +8
权利金把下跌也保护住了 到期价 90 时仍亏 7 只垫了 3
担保看跌的保证金是权利金 2 80 时亏 13,现金要覆盖 95 占用行权价
2/95 可以乘 12 变成年化增强 0.021053 是这份合约的比例,80 时盈亏是 −13 不年化保费
保护性看跌让下跌没有亏损 90 以下的到期盈亏恒为 −12 先付了 2
近月 16、次月 20 是某日的 VIX 教学输入;展期差是 0.250000 指数和期货分开
波动低于目标就应加杠杆 想要 1.2500,函数返回 1.0000 上限是 1
2020 年减仓提高了夏普 夏普从 0.61 降到 0.24,回撤从 −33.70% 到 −16.89% 少赚反弹
150 股可以卖两张备兑 乘数 100 时只能覆盖 1 张 剩下的是裸卖
到期表就是明天的盯市 提前行权和波动变化都不在表里 表只在到期成立
看涨 5、看跌 6 可以锁进 2 点利润 平价要求看跌是 4;只做多账户不能做转换 差额留在纸上
隐含比实现高 0.04 就是增强 0.040000 还没减去 120 时少赚的 12 或 80 时的 −13 溢价和赔付分开
0.28 的看跌隐含可以改写权利金 3 两套教学输入 偏斜不替换到期表
Delta 0.205467 可以乘进到期盈利 8 一个是现价敏感度,一个是到期身份 分开报
领口的地板和备兑一样是 −7 到期价 70 时领口是 −9,备兑是 −7 领口花了看跌的 2,又有帽 +6

费曼自测

  1. 到期价 120 时,备兑看涨少赚的 12 是谁得到的?
  2. 为什么 2/95 = 0.021053 不能叫做一年的收益率?
  3. 保护性看跌在到期价 70 和到期价 0 时,为什么盈亏都是 −12?
  4. 当前波动 8%、目标 10%,为什么仓位倍数不是 1.25?
自测要点 1. 看涨的买方。价格超过 105 的 15 归买方,卖方已经预先收下 3,净转移 12。股票持有人留下的是帽内的 +8。 2. 它是权利金除以行权价,期限就是这份合约的剩余寿命。80 的到期价使盈亏变成 −13。把 2.1053% 乘上一年的期数,是假设每期都只收保费、不被行权。 3. 低于 90 时,股票少掉的每一元都由看跌补回一元,直到行权价。剩下的是从 100 到 90 的 10,再加已经支付的权利金 2,合计 −12。到期价 0 也一样:股票 −100,看跌支付 90,再减去 2。 4. 0.10/0.08 = 1.25 会把仓位放大到 1 以上。函数的上限是 1,返回 1.0000。这和杠杆上限 1.0 是同一条约束:波动偏低时不借钱。

四维习题

A. 概念题

  1. 备兑看涨和只持有股票相比,上行和跌落各转移了什么?
  2. 现金担保看跌和裸卖看跌,差在哪一笔现金?
  3. 做多近月、展期买入更高的次月,差价的符号说明什么?
  4. 波动目标减仓和保护性看跌,哪个会在波动升高时减少股票股数?

B. 计算题

  1. 股票 100,看涨行权价 105,权利金 3。到期价 90、100、120 的备兑盈亏,以及盈亏平衡和上行帽。
  2. 看跌行权价 95,权利金 2。到期价 80、95、110 的盈亏。2/95 是多少?
  3. 保护性看跌行权价 90,权利金 2,股票成本 100。到期价 70 和 130 的盈亏。低于 90 时的常数是多少?
  4. 近月 16、次月 20,以及近月 28、次月 22,做多近月的展期差各是多少?当前波动 20% 和 8%、目标 10% 时,仓库函数的倍数各是多少?
  5. 贴现因子 0.99、行权价 100 时,看涨减去看跌应等于多少?看涨 5、看跌 6 时差额是多少?领口在到期价 70 和 120 的盈亏是多少?150 股卖出 1 张 Delta 0.205467 的看涨后,股票等价大约是多少?

C. 编程实战题

  1. 运行 figures/M20/plot_options.py。核对备兑 −7、+3、+8,担保看跌 −13,保护性看跌 −12,展期 0.250000 与 −0.214286,倍数 0.5000 与 1.0000。
  2. 把 max_scale 改成 1.5,确认函数拒绝。不要把拒绝改成允许放大。
  3. 用 150 股和乘数 100 计算可以备兑的张数。不要在开发机卖出期权。

D. 个人实战思考题

  1. 你把备兑看涨的权利金 3 记成每月增强。到期价若是 120,账户相对只持有股票少了什么?
  2. 波动目标在 2020 年把回撤从 −33.70% 收到 −16.89%,同时 CAGR 从 18.29% 降到 4.44%。你要的是哪一边?
  3. 券商允许用权利金 2 作为看跌的保证金。到期价 80 时,你还要拿出多少钱完成行权?
完整参考答案与解析 **A1.** 上行在 105 以上被卖给看涨买方。到期价 120 时,股票的 +20 变成备兑的 +8。下跌只被权利金垫了 3:90 时从 −10 变成 −7。尾部的大跌仍在股票上。 **A2.** 现金担保看跌把 95 留在现金里,行权时用这笔现金买股票。裸卖看跌没有这笔现金,行权时要另外筹资。权利金 2 两边都收得到,它不是那 95。 **A3.** (20 − 16) / 16 = 0.250000 是做多近月再买进更贵的次月,展期付出差价。(22 − 28) / 28 = −0.214286 时次月更低,差价的符号反过来。两组都是教学输入,不是 VIX 的历史收盘。 **A4.** 波动目标。当前波动从 10% 升到 20% 时,倍数从 1 降到 0.5,股票股数下降。保护性看跌在到期前不改变股票股数,它用看跌的支付抵消价格低于 90 的部分。 **B5.** 90 时 −7,100 时 +3,120 时 +8。盈亏平衡是 97。上行帽是 +8。只持有股票在这三个价上是 −10、0、+20。 **B6.** 80 时 −13,95 时 +2,110 时 +2。2/95 = 0.021053。 **B7.** 70 时 −12,130 时 +28。低于 90 的常数是 90 − 100 − 2 = −12。 **B8.** 展期差 0.250000 和 −0.214286。波动 20% 时倍数 0.5000。波动 8% 时想要 1.2500,函数返回 1.0000。 **B9.** 平价右边是 1。看跌应是 4,标成 6 时差额是 2。领口在 70 是 −9,在 120 是 +6。股票等价 150 − 100 × 0.205467 = 129.4533。 **C10–C12.** 图脚本核对到期盈亏和波动倍数。平价与希腊字母用第 7 节的函数。`max_scale=1.5` 超出 (0, 1] 时 `target_volatility_scale` 抛出 `VolatilityError`。150 股只能覆盖 1 张。
spots = __import__("numpy").array([70.0, 90.0, 100.0, 120.0])
pay = expiry_payoffs(spots)
assert list(pay["collar"]) == [-9.0, -9.0, 1.0, 6.0]
assert 150 // 100 == 1
greeks = european_call_greeks(100, 105, 0.0, 0.20, 30 / 365)
assert abs(greeks["delta"] - 0.205467) < 1e-6
assert parity_gap(5, 6, 100, 100, 0.99) == 2
**D13.** 少了 12。权利金 3 已经在 +8 里面。相对股票的 +20,备兑在这个到期价上更差。把 3 单独记成增强,是没有减去被行权拿走的 15。 **D14.** 若要的是更浅的回撤,2020 年这张表给了 −16.89% 而不是 −33.70%。若要的是全年复利或夏普,这张表给的是 4.44% 和 0.24,低于 18.29% 和 0.61。两样不能同时从这张表里拿走。全样本上限 1.0 的夏普 0.70 也低于买入持有的 0.73。 **D15.** 行权价 95 减去股票到期值 80,再考虑已经收下的 2,账户盈亏是 −13。要完成按 95 买入,现金需要 95,权利金 2 只是其中已经在手的一部分。券商若只冻结了 2,差额要在行权时补上。本章不把这种保证金写成可以接受的担保。

📌 章节知识总结

一句话核心洞察

  1. 备兑看涨在到期价 120 时赚 8,股票赚 20。权利金 3 把盈亏平衡降到 97,不取消 90 时的 −7。
  2. 现金担保看跌在到期价 80 时亏 13。占用的现金是行权价 95。2/95 = 0.021053 不是年化收益。
  3. 保护性看跌在行权价 90 以下的到期盈亏恒为 −12。股票不跌时,先亏权利金 2。
  4. 近月 16、次月 20 的做多展期差是 0.250000。这是教学输入,不是 VIX 收盘。
  5. 目标波动的倍数是 min(1, σ_目标/σ_当前)。20% 对 10% 得到 0.5;8% 对 10% 得到 1,不是 1.25。
  6. 平价在贴现因子 0.99 时要求看涨减看跌等于 1。看跌标成 6 时差额是 2,只做多账户锁不住。领口的地板是 −9,帽是 +6。150 股备兑 1 张后的股票等价大约是 129.4533。

公式与样本

对象 数值 前提
备兑,到期 90 / 100 / 120 −7 / +3 / +8 行权价 105,权利金 3,现价 100
盈亏平衡与帽 97 与 +8 看涨到期无价值时才用 97
担保看跌,80 / 95 / 110 −13 / +2 / +2 行权价 95,权利金 2
权利金 / 行权价 0.021053 不是年化
保护性看跌,70 / 100 / 130 −12 / −2 / +28 行权价 90,权利金 2
行权价以下 恒为 −12 到期且没有提前行权
展期 0.250000 与 −0.214286 16 对 20,28 对 22
倍数 0.5000 与 1.0000 目标 10%;想要 1.2500 被帽住
2020 年 SPY 种子 18.29% 对 4.44%;夏普 0.61 对 0.24;回撤 −33.70% 对 −16.89% 对照来自 M04;本章沿用那组上限
全样本上限 1.0 夏普 0.70,买入持有 0.73 同一节
150 股 备兑 1 张 乘数 100
平价右边 1 贴现因子 0.99,行权价 100,不派息欧式
看涨 5、看跌 6 差额 2 平价要求看跌是 4;不是可执行的套利
隐含减实现 0.040000 0.20 减 0.16,教学输入
行权价 90 的隐含 比平值高 0.080000 0.28 减 0.20,不替换权利金 3
Delta / Gamma 0.205467 / 0.049620 行权价 105,波动 0.20,期限 30/365,利率 0
Vega / 每日 Theta 8.156657 / −0.027189 Vega 是波动率变动 1;每日是年 Theta 除以 365
备兑后股票等价 129.4533 150 − 100×0.205467
领口,70 / 100 / 120 −9 / +1 / +6 看跌 90 付 2,看涨 105 收 3;地板 −9,帽 +6

跨模块

结论 交给 位置
2020 年减仓少赚反弹 波动目标 M04
不够一张不要凑 整手 M18
倍数上限 1 代码 ../../../src/quant/risk/volatility.py
杠杆上限 1.0 政策 ../../../docs/risk_policy.md
复算 图 ../figures/M20/plot_options.py

学习指引

概念卡片:希腊字母与波动率风险溢价

  • 精读:先把到期盈亏算完,再看报价。报价里的波动和剩余时间不在这三张表里。
  • 对照:盈亏和倍数以脚本为准。2020 年的 CAGR 和夏普以 M04 为准。16 和 20 不是 VIX 的历史值。
  • 下一步:现货规则仍是只做多、杠杆不超过 1。期权若要进卫星,先写明覆盖股票或现金的数量,再写权利金。

自检清单

  • 能把备兑看涨在 90、100、120 算成 −7、+3、+8,并说出帽是 +8
  • 能把担保看跌在 80 算成 −13,并说明现金占用是 95
  • 能说明保护性看跌在 90 以下恒为 −12
  • 能把 16 对 20 的展期差算成 0.25,并标明不是历史 VIX
  • 能说明 8% 波动对 10% 目标得到的倍数是 1,不是 1.25
  • 能复述 2020 年目标波动的夏普是 0.24,低于买入持有的 0.61
  • 能把贴现因子 0.99 的平价右边算成 1,并说明差额 2 不能在只做多账户里锁死
  • 能把 0.20 减 0.16 写成 0.040000,并说明它还没扣掉赔付
  • 能读出 Delta 0.205467,并把 150 股备兑 1 张后的股票等价写成 129.4533
  • 能把领口在 70 和 120 算成 −9 和 +6,并和备兑的 −7、+8 分开