量化交易中文教材

第 17 章 股指期权与货币期权

第 10 章已经介绍过股指期权和货币期权的合约形式。本章先讲它们在实务中怎么用——股指看跌期权做组合保险、货币期权做外汇套保和零成本区间远期——然后把第 15a、15b 章的 BSM 结果推广到支付已知股息率(known dividend yield)的股票。推广的关键只是一个替换:把 \(S_0\) 换成 \(S_0e^{-qT}\)。股指可看作股息率为成分股平均股息率的股票,外币可看作股息率为外国无风险利率的股票,于是同一套公式覆盖股票、股指、外汇三类标的,第 18 章还会把期货也纳进来。

对量化交易者,本章最重要的是两件事:一是带连续收益率 \(q\) 的广义 BSM,它是任何期权定价库的统一接口;二是用远期价格表示的 Black 型公式,以及从看涨-看跌平价反推远期价格和隐含股息率——这是构建波动率曲面之前必做的预处理。

学习目标

  1. 计算组合保险所需的指数看跌期权份数和执行价,包括 beta 不等于 1 的情形。
  2. 理解区间远期(collar)的构造,会求零成本区间远期的执行价。
  3. 掌握"\(S_0\to S_0e^{-qT}\)"规则,写出带股息率的下界、平价、Merton 公式及其 PDE 和风险中性漂移。
  4. 用 Merton 公式为股指期权、用 Garman–Kohlhagen 公式为货币期权定价,并会改写为远期价格形式。
  5. 用平价关系从期权报价反推远期价格和隐含股息率。
  6. 判断哪些美式股指/货币期权最可能提前行权。

读前导读

这一章在解决什么问题

上两章的 BSM 只适用于不付息股票。现实中最活跃的期权标的——股指和外汇——都有"持有收益":指数有股息,外币存在国外能赚外国利率。这一章说明,只要把这份持有收益看成连续支付的收益率 \(q\),整个 BSM 框架只需改一处:把 \(S_0\) 换成 \(S_0e^{-qT}\)。

这个替换你其实在 CFA 里见过:远期定价 \(F_0=S_0e^{(r-q)T}\),利率平价 \(F_0=S_0e^{(r-r_f)T}\),都是"持有成本 = 融资成本 − 持有收益"。期权定价在这里和远期定价合流:Merton 公式写成远期价格的形式后,股息率完全消失在 \(F_0\) 里。这就是为什么做市系统喜欢直接用远期价格——远期可以从看涨看跌平价反推,比估计股息率可靠。

本章前两节(组合保险、区间远期)是 CFA 衍生品策略的内容,数学只用到 CAPM 和看涨-看跌平价;17.3 以后是定价。

需要先想起来的数学

1. 连续复利的贴现与增长。 \(e^{-qT}\) 是按连续利率 \(q\) 贴现 \(T\) 年的因子。例:\(q=3\%\)、\(T=2/12\),\(e^{-0.005}=0.995\)。\(S_0-S_0e^{-qT}\) 约等于期内股息的现值。见 第 00 册第 04 章 级数与收敛(e 与指数对数)。

2. 对数的运算规则。 \(\ln(ab)=\ln a+\ln b\),\(\ln e^{x}=x\)。所以 \(\ln(S_0e^{-qT}/K)=\ln(S_0/K)-qT\),这就是 \(d_1\) 里多出 \(-q\) 的来源。

3. 看涨-看跌平价与线性回归。 平价 \(c-p=e^{-rT}(F_0-K)\) 是关于 \(K\) 的直线:截距 \(e^{-rT}F_0\),斜率 \(-e^{-rT}\)。多个执行价的 \((K,c-p)\) 点做 OLS 拟合,就能同时估出远期和贴现因子。

4. 二叉树参数。 \(p=(a-d)/(u-d)\) 里的 \(a\) 是"风险中性下股价一步的期望增长倍数"。无股息时 \(a=e^{r\Delta t}\),有收益率 \(q\) 时 \(a=e^{(r-q)\Delta t}\)。

怎么读这一章

必读:17.3(替换规则、Merton 公式、PDE 中 \(r-q\) 的来源)、17.4 中"用远期价格表示"和"隐含股息率"、17.5 的 Garman–Kohlhagen 公式。17.1 的 beta≠1 组合保险值得算一遍表 17.2,它是 CAPM 的一个漂亮应用。17.6 美式期权读结论即可。


17.1 股指期权

多家交易所交易股指期权,有的跟踪整体市场,有的跟踪特定行业。CBOE 的主要产品包括 S&P 100 的美式(OEX)与欧式(XEO)、S&P 500 欧式(SPX)、道琼斯工业平均指数欧式(DJX)、Nasdaq 100 欧式(NDX),也有指数 LEAPS 和 flex 期权。

一份合约通常是指数的 100 倍(DJX 所用的道指是通常报价的 0.01 倍)。股指期权现金结算(cash settled):看涨持有人行权得到 \((S-K)\times100\) 美元现金,\(S\) 为行权日收盘指数;看跌得 \((K-S)\times100\)。

组合保险:beta 等于 1

设经理管理一个 beta 为 1.0 的充分分散组合,组合股息率与指数相同,于是组合的百分比变化约等于指数的百分比变化。指数当前为 \(S_0\),每 \(100S_0\) 美元组合买 1 份执行价 \(K\) 的看跌合约,就能防范指数跌破 \(K\)。

例 组合价值 50 万美元,指数 1,000,组合相当于 500 倍指数。为防止组合 3 个月内跌破 45 万,买 5 份 3 个月期、执行价 900 的看跌合约。若指数跌到 880,组合约值 44 万,期权收益 \(5\times(900-880)\times100=10{,}000\),总值回到保险水平 45 万。

beta 不等于 1

每 \(100S_0\) 美元组合需买 \(\beta\) 份看跌。执行价不能再简单按比例换算,要用 CAPM(第 3 章附录)把"组合价值"映射为"指数水平":组合的超额收益 = \(\beta\) × 指数的超额收益。

例(表 17.1、17.2) 组合 50 万,\(\beta=2.0\),指数 1,000,无风险利率 12%,指数与组合股息率均为 4%,要求组合 3 个月内不低于 45 万。需要 \(2.0\times\frac{500{,}000}{1{,}000\times100}=10\) 份看跌。

若 3 个月后指数为 1,040:指数价格收益 4%,加股息 \(0.25\times4\%=1\%\),总收益 5%;无风险利率 3 个月 3%,指数超额收益 2%;组合预期超额收益 \(2\times2\%=4\%\),组合总收益 \(3\%+4\%=7\%\),扣掉组合股息 1%,市值增长 6%,即 53 万。

对每个指数水平这样算,得到表 17.2:

3 个月后指数 1,080 1,040 1,000 960 920 880
组合价值(万美元) 57 53 49 45 41 37

组合 45 万对应指数 960,所以执行价取 960。若指数跌至 880,组合约 37 万,看跌收益 \((960-880)\times10\times100=80{,}000\),恰好补足到 45 万。(3 个月约有 5,000 美元股息;若保险水平要把股息也算进去,可取对应 44.5 万的执行价 955。)

推导拆解:表 17.2 每一格都按同一条链计算,以指数 960 为例。

  1. 指数价格收益 \((960-1000)/1000=-4\%\),加股息 1%,指数总收益 \(-3\%\)。
  2. 指数超额收益 \(=-3\%-3\%=-6\%\)(3 个月无风险收益 \(12\%\times0.25=3\%\))。
  3. CAPM:组合超额收益 \(=\beta\times(-6\%)=-12\%\),组合总收益 \(=3\%-12\%=-9\%\)。
  4. 组合总收益里含 1% 股息,股息已经发出去了,市值变化 \(=-9\%-1\%=-10\%\),组合市值 \(50\times0.9=45\) 万。 所以 45 万对应指数 960。这里用 CAPM 是把"组合与指数之间的关系"当作确定的(忽略残差风险),所以保险只在期望意义上精确;组合分散得越好,残差越小,保险越可靠。

结论:组合 beta 越高,保险越贵——既要买更多看跌,执行价也更高(更接近平值)。


17.2 货币期权

货币期权主要在场外市场交易,优点是可以做大额交易,执行价、到期日等可以按公司财务主管的需要定制;美国 NASDAQ OMX 也有交易所货币期权,但规模远小于场外。

例 欧式看涨:有权以 1.3000 美元/欧元买入 100 万欧元;到期汇率 1.3500 时,收益 \(1{,}000{,}000\times(1.35-1.30)=50{,}000\) 美元。欧式看跌:有权以 0.9000 美元/澳元卖出 1,000 万澳元;到期汇率 0.8700 时,收益 \(10{,}000{,}000\times0.03=300{,}000\) 美元。

外汇套保:将收到英镑的美国公司可以买英镑看跌,保证汇率不低于执行价,又保留汇率有利变动的好处;将支付英镑的公司买英镑看涨,锁定成本上限。远期合约锁定汇率且建立无成本,期权则像保险,要预付期权费。

区间远期

美国公司 3 个月后收到 100 万英镑,3 个月远期汇率 1.5200。做空远期可锁定 152 万美元。替代方案是:

  • 买入执行价 \(K_1\) 的欧式看跌,卖出执行价 \(K_2\) 的欧式看涨,\(K_1<1.5200<K_2\)。这叫空头区间远期(short range forward)。
  • 到期汇率 \(<K_1\):行使看跌,以 \(K_1\) 卖出英镑;介于 \(K_1\) 和 \(K_2\) 之间:都不行权,按市价卖出;\(>K_2\):看涨被行权,以 \(K_2\) 卖出。实现汇率被限制在 \([K_1,K_2]\) 内。

需要支付英镑的公司则卖出 \(K_1\) 看跌、买入 \(K_2\) 看涨,即多头区间远期,支付汇率同样被限制在 \([K_1,K_2]\)。

实务中通常让看跌价格等于看涨价格,使建立成本为零。

例 美国与英国利率均为 5%(所以即期 = 远期 = 1.5200),汇率波动率 14%。执行价 1.5000 的看跌与执行价 1.5413 的看涨价格相同(均为每英镑 0.03250),所以 \(K_1=1.5000\)、\(K_2=1.5413\) 构成零成本区间远期。(本章代码复现了这一结果。)

两执行价向中间靠拢至相等时,区间远期退化为普通远期。这种结构在股票上也很常见,叫领子期权(collar),第 12 章已介绍。


17.3 支付已知股息率股票的期权

核心论证:\(S_0\to S_0e^{-qT}\)

股息使股价在除息日下跌。以连续速率 \(q\) 支付股息,股价的增长率就降低 \(q\)。如果有股息率 \(q\) 时股价从 \(S_0\) 增长到 \(S_T\),那么没有股息时它会增长到 \(S_Te^{qT}\);等价地,没有股息时它会从 \(S_0e^{-qT}\) 增长到 \(S_T\)。因此以下两种情形下 \(S_T\) 的分布相同:

  1. 股价 \(S_0\),股息率 \(q\);
  2. 股价 \(S_0e^{-qT}\),无股息。

于是得到规则:

为期限 \(T\)、股息率 \(q\) 的股票欧式期权估值时,把当前股价从 \(S_0\) 换成 \(S_0e^{-qT}\),再按无股息股票估值。

这与第 15b 章离散股息时"减去股息现值"的做法完全类比:\(S_0-S_0e^{-qT}\) 正是期内股息的现值。

金融直觉:期权持有人拿不到股息,股息只归股东。所以对期权持有人来说,今天的股价 \(S_0\) 里有一块"期内会以股息形式流走"的价值与他无关,真正和他相关的是"扣掉这些股息后剩下的部分",即 \(S_0e^{-qT}\)。另一个看法:买入 \(e^{-qT}\) 股、股息全部再投资于股票,到 \(T\) 时恰好持有 1 股——所以"\(T\) 时 1 股股票"今天的价格是 \(S_0e^{-qT}\),这正是看涨期权里"资产或无"那一块需要的标的价格。

推导拆解:PDE (17.6) 里 \(r-q\) 的来源。沿用第 15a 章的组合 \(\Pi=-f+f_SS\),但持股 \(f_S\) 股还能收到股息 \(qSf_S\Delta t\),所以 \(\Delta\Pi=(-f_t-\tfrac12\sigma^2S^2f_{SS})\Delta t+qSf_S\Delta t\)。 令 \(\Delta\Pi=r\Pi\Delta t=r(-f+f_SS)\Delta t\),两边除以 \(\Delta t\) 并整理: \(f_t+\tfrac12\sigma^2S^2f_{SS}-qSf_S=rf-rSf_S\),即 \(f_t+(r-q)Sf_S+\tfrac12\sigma^2S^2f_{SS}=rf\)。 一阶项系数从 \(r\) 变成 \(r-q\):持股的融资成本是 \(r\),但股息补回了 \(q\),净持有成本为 \(r-q\)。

下界与平价

\[c\ge\max(S_0e^{-qT}-Ke^{-rT},\ 0)\tag{17.1}\]
\[p\ge\max(Ke^{-rT}-S_0e^{-qT},\ 0)\tag{17.2}\]
\[c+Ke^{-rT}=p+S_0e^{-qT}\tag{17.3}\]

直接证明也很容易,只需把第 11 章组合里的"1 股股票"换成"\(e^{-qT}\) 股股票,股息再投资于股票"——这样到期时恰好持有 1 股。例如 (17.1):组合 A 为一份欧式看涨加现金 \(Ke^{-rT}\),组合 B 为 \(e^{-qT}\) 股(股息再投资),A 到期值 \(\max(S_T,K)\ge S_T\) = B 的到期值。平价 (17.3):A 与"看跌 + \(e^{-qT}\) 股"的组合 C 到期都值 \(\max(S_T,K)\)。

美式期权有不等式(原书习题 17.12):

\[S_0e^{-qT}-K\le C-P\le S_0-Ke^{-rT}.\]

Merton 公式

对 BSM 公式做替换 \(S_0\to S_0e^{-qT}\),并注意 \(\ln(S_0e^{-qT}/K)=\ln(S_0/K)-qT\),得到 Merton (1973) 公式:

\[c=S_0e^{-qT}N(d_1)-Ke^{-rT}N(d_2)\tag{17.4}\]
\[p=Ke^{-rT}N(-d_2)-S_0e^{-qT}N(-d_1)\tag{17.5}\]
\[d_1=\frac{\ln(S_0/K)+(r-q+\sigma^2/2)T}{\sigma\sqrt T},\qquad d_2=d_1-\sigma\sqrt T\]

这里的"股息"应定义为已宣告股息导致的除息日股价下降。若股息率已知但非常数,公式仍然成立,\(q\) 取期权期内的平均年化股息率。

PDE 与风险中性漂移

加入股息率后,BSM 方程变为(证明见作者网站 Technical Note 6)

\[\frac{\partial f}{\partial t}+(r-q)S\frac{\partial f}{\partial S}+\frac12\sigma^2S^2\frac{\partial^2f}{\partial S^2}=rf\tag{17.6}\]

推导思路与第 15a 章相同,唯一的区别是:持有 \(\partial f/\partial S\) 股股票在 \(\Delta t\) 内还收到股息 \(qS\frac{\partial f}{\partial S}\Delta t\),于是 \(\Delta\Pi\) 多出这一项,最终使一阶项系数从 \(r\) 变为 \(r-q\)。

方程仍不含风险偏好,可以用风险中性定价。风险中性世界中股票的总收益为 \(r\),其中股息贡献 \(q\),所以价格的期望增长率为 \(r-q\):

\[dS=(r-q)S\,dt+\sigma S\,dz\tag{17.7}\]

期望股价 \(\hat E(S_T)=S_0e^{(r-q)T}\)。用第 15b 章的对数正态引理,看涨的风险中性期望收益为 \(e^{(r-q)T}S_0N(d_1)-KN(d_2)\),以 \(r\) 贴现即得 (17.4)。


17.4 欧式股指期权估值

和第 5 章处理股指期货一样,把指数看作支付已知收益率的资产:(17.1)(17.2) 是下界,(17.3) 是平价,(17.4)(17.5) 是定价公式,美式期权用二叉树。\(S_0\) 是指数值,\(\sigma\) 是指数波动率,\(q\) 是期权期内的平均年化股息率。

例 17.1 S&P 500 两个月期欧式看涨。\(S_0=930\),\(K=900\),\(r=8\%\),\(\sigma=20\%\);第一、二个月预期股息率分别为 0.2%、0.3%,合计 0.5%,年化 3%,即 \(q=0.03\),\(T=2/12\)。 \(d_1=\dfrac{\ln(930/900)+(0.08-0.03+0.02)\times2/12}{0.2\sqrt{2/12}}=0.5444\),\(d_2=0.4628\);\(N(d_1)=0.7069\),\(N(d_2)=0.6782\)。 \(c=930\times0.7069e^{-0.03\times2/12}-900\times0.6782e^{-0.08\times2/12}=51.83\),一份合约 5,183 美元。

几点实务说明:

  • \(q\) 只应包含除息日落在期权期内的股息。美国公司的除息日多集中在 2、5、8、11 月的第一周,所以合适的 \(q\) 依期限而异;其他国家更明显,例如日本公司多用相同的除息日。
  • 若已知的是成分股的绝对股息额,可以用"指数减股息现值"的方法(第 15b 章),但宽基指数需要每只成分股的预期股息,难以实施。

用远期价格表示

指数远期价格 \(F_0=S_0e^{(r-q)T}\)(式 5.3),代入 (17.4)(17.5):

\[c=F_0e^{-rT}N(d_1)-Ke^{-rT}N(d_2)\tag{17.8}\]
\[p=Ke^{-rT}N(-d_2)-F_0e^{-rT}N(-d_1)\tag{17.9}\]
\[d_1=\frac{\ln(F_0/K)+\sigma^2T/2}{\sigma\sqrt T},\qquad d_2=\frac{\ln(F_0/K)-\sigma^2T/2}{\sigma\sqrt T}\]

平价写成 \(c+Ke^{-rT}=p+F_0e^{-rT}\),即

\[F_0=K+(c-p)e^{rT}\tag{17.10}\]

推导拆解:(17.8) 只是代入。\(S_0e^{-qT}=F_0e^{-rT}\)(由 \(F_0=S_0e^{(r-q)T}\) 两边乘 \(e^{-rT}\)),所以 \(S_0e^{-qT}N(d_1)\) 直接换成 \(F_0e^{-rT}N(d_1)\)。\(d_1\) 的分子 \(\ln(S_0/K)+(r-q)T=\ln(S_0e^{(r-q)T}/K)=\ln(F_0/K)\),于是 \(r\) 和 \(q\) 在 \(d_1\)、\(d_2\) 中都消失了,只剩下 \(\pm\sigma^2T/2\)。 这说明一件事:期权价格只依赖远期价格 \(F_0\)、贴现因子 \(e^{-rT}\)、波动率和期限。\(r\) 和 \(q\) 各自是多少并不重要,重要的是它们通过 \(F_0\) 表现出来的组合 \(r-q\)。

交易所中同一到期日、同一执行价的看涨和看跌常常都很活跃,用 (17.10) 就能估计该期限的远期价格。得到若干期限的远期价格后,就有了远期价格的期限结构,再用 (17.8)(17.9) 为其他期权估值——好处是完全不需要显式估计股息率。

隐含股息率

需要股息率时(例如为美式期权估值),由 (17.3):

\[q=-\frac1T\ln\frac{c-p+Ke^{-rT}}{S_0}.\]

单一执行价、单一期限的估计并不可靠(报价噪声、买卖价差),但综合多对看涨看跌可以得到市场隐含的股息率期限结构。本章代码演示了这一过程。

Business Snapshot 17.1 能保证股票长期跑赢债券吗? 有观点认为,长期看分散的股票组合几乎必然跑赢债券;美国历史上股票几乎在任何 10 年都跑赢了债券。某基金经理据此想向跟踪标普 500 的基金投资者免费保证:10 年收益不低于无风险债券。 设指数 1,000,股息率 1%,波动率 15%,10 年无风险利率 5%。股票年化收益要超过 5%,股息贡献 1%,资本利得需 4%,即 10 年后指数至少为 \(1{,}000e^{0.04\times10}=1{,}492\)。这个保证等价于一份 10 年后以 1,492 卖出指数的欧式看跌:\(S_0=1000\),\(K=1492\),\(r=5\%\),\(\sigma=15\%\),\(T=10\),\(q=1\%\),价值 169.7,约占基金价值的 17%——绝不该白送。 教训:历史上"几乎总是"发生的事,在风险中性定价下可能代价高昂。


17.5 欧式货币期权估值

\(S_0\) 为即期汇率(1 单位外币值多少美元)。持有外币可以赚外国无风险利率 \(r_f\),所以外币就像股息率为 \(r_f\) 的股票。把 \(q\) 换成 \(r_f\):

\[c\ge\max(S_0e^{-r_fT}-Ke^{-rT},0),\qquad p\ge\max(Ke^{-rT}-S_0e^{-r_fT},0)\]
\[c+Ke^{-rT}=p+S_0e^{-r_fT}\]
\[c=S_0e^{-r_fT}N(d_1)-Ke^{-rT}N(d_2)\tag{17.11}\]
\[p=Ke^{-rT}N(-d_2)-S_0e^{-r_fT}N(-d_1)\tag{17.12}\]
\[d_1=\frac{\ln(S_0/K)+(r-r_f+\sigma^2/2)T}{\sigma\sqrt T},\qquad d_2=d_1-\sigma\sqrt T\]

这就是 Garman–Kohlhagen 模型。\(r\) 和 \(r_f\) 都取期限为 \(T\) 的利率。

金融直觉:把 1 英镑想成一只"股票":它今天值 \(S_0\) 美元,持有它(存在英国)每年能赚 \(r_f\) 的"股息"。这样外汇期权就成了带股息率的股票期权。风险中性漂移 \(r-r_f\) 正是 CFA 里利率平价的连续复利版:本币利率高于外币利率时,远期汇率高于即期(外币远期升水),反之贴水。

白话解释:例 17.2 里 \(r_f=11\%>r=8\%\),所以 \(F_0=1.6e^{-0.03/3}=1.584<K=1.6\),平值即期的看涨按远期看其实略虚值,价格比无股息时便宜。

例 17.2 4 个月期英镑欧式看涨,\(S_0=K=1.6\),\(r=8\%\),\(r_f=11\%\),\(T=0.3333\),期权价格 4.3 美分(0.043)。试错:\(\sigma=20\%\) 得 0.0639,\(\sigma=10\%\) 得 0.0285……隐含波动率为 14.1%。

对称性。 以执行价 \(K\)(用货币 B 计价)卖出 1 单位货币 A 的看跌期权,等价于以执行价 \(1/K\)(用货币 A 计价)买入 \(K\) 单位货币 B 的看涨期权(原书习题 17.8)。外汇交易员因此可以在两种报价习惯间自由转换。

用远期汇率

金融机构活跃交易外汇远期,常用远期汇率估值。\(F_0=S_0e^{(r-r_f)T}\)(式 5.9),所以

\[c=e^{-rT}[F_0N(d_1)-KN(d_2)]\tag{17.13}\]
\[p=e^{-rT}[KN(-d_2)-F_0N(-d_1)]\tag{17.14}\]
\[d_1=\frac{\ln(F_0/K)+\sigma^2T/2}{\sigma\sqrt T},\qquad d_2=d_1-\sigma\sqrt T\]

这与 (17.8)(17.9) 完全相同。第 18 章将说明:任何资产的欧式现货期权,都可以用期限相同的远期或期货价格,通过这组公式估值。


17.6 美式期权

用第 13 章的二叉树:\(u=e^{\sigma\sqrt{\Delta t}}\),\(d=1/u\),\(p=(a-d)/(u-d)\)。不付息股票 \(a=e^{r\Delta t}\),而

\[\text{股指:}a=e^{(r-q)\Delta t}\tag{17.15}\]
\[\text{货币:}a=e^{(r-r_f)\Delta t}\tag{17.16}\]

美式股指/货币期权有时提前行权是最优的,所以价值高于欧式。高利率货币的看涨、低利率货币的看跌最可能提前行权:高利率货币在风险中性世界中预期贬值(漂移 \(r-r_f<0\)),看涨持有人宁可早点行权拿到外币赚 \(r_f\);低利率货币预期升值,看跌持有人宁可早点拿到本币赚 \(r\)。同理,高股息率指数的看涨、低股息率指数的看跌最可能提前行权。

白话解释:提前行权的账可以这样算。美式看涨提前行权:得到标的(开始收 \(q\) 或 \(r_f\)),付出 \(K\)(失去 \(K\) 的利息 \(r\)),放弃保险价值。所以只有当标的收益率 \(q\) 明显高于 \(r\)、且期权深度实值(保险价值小)时才划算。看跌反过来:行权得到 \(K\)(开始赚 \(r\)),交出标的(不再收 \(q\)),所以 \(r\) 远高于 \(q\) 时看跌更可能提前行权。不付息股票 \(q=0\),看涨永远不提前行权,看跌却可能,这是这个一般规律的特例。


量化实战:统一的广义 BSM 接口、平价反推远期与隐含股息

在期权系统中,股票、股指、外汇(以及下一章的期货)期权通常共用一个"带连续收益率 \(q\) 的 BSM"函数:股票 \(q\) 为股息率,股指 \(q\) 为指数股息率,外汇 \(q=r_f\),期货 \(q=r\)。实际做市系统更进一步,直接用远期价格作为输入(Black 型公式),而远期价格由平价从期权报价本身反推——这样就绕开了"股息率是多少、借券成本是多少"这些难以直接观测的量。从期权价格中提取的隐含股息率、隐含借券成本,本身也可以作为股息预期或卖空压力的信号。

下面的代码依次:复现例 17.1、Business Snapshot 17.1、例 17.2、零成本区间远期、beta=2 的组合保险执行价;模拟一条带报价噪声的股指期权链,用两种方法反推远期价格和隐含股息率;验证 Black 型公式与 Merton 公式一致;用二叉树比较美式与欧式货币期权的提前行权溢价。

import numpy as np
from scipy.stats import norm
from scipy.optimize import brentq

def gbsm(S, K, T, r, q, sigma, kind="call"):
    """广义 BSM:q 为股息率(股指)或外币利率 r_f(货币,即 Garman–Kohlhagen)。"""
    d1 = (np.log(S / K) + (r - q + 0.5 * sigma**2) * T) / (sigma * np.sqrt(T))
    d2 = d1 - sigma * np.sqrt(T)
    if kind == "call":
        return S * np.exp(-q * T) * norm.cdf(d1) - K * np.exp(-r * T) * norm.cdf(d2)
    return K * np.exp(-r * T) * norm.cdf(-d2) - S * np.exp(-q * T) * norm.cdf(-d1)

def binom_american(S, K, T, r, q, sigma, n=500, kind="call"):
    """CRR 二叉树,a = e^{(r-q)dt};返回 (美式, 欧式)。"""
    dt = T / n; u = np.exp(sigma * np.sqrt(dt)); d = 1 / u
    p = (np.exp((r - q) * dt) - d) / (u - d); disc = np.exp(-r * dt)
    ST = S * u ** np.arange(n, -1, -1) * d ** np.arange(0, n + 1)
    pay = (lambda s: np.maximum(s - K, 0)) if kind == "call" else (lambda s: np.maximum(K - s, 0))
    Va = pay(ST); Ve = Va.copy()
    for i in range(n - 1, -1, -1):
        Si = S * u ** np.arange(i, -1, -1) * d ** np.arange(0, i + 1)
        Ve = disc * (p * Ve[:-1] + (1 - p) * Ve[1:])
        Va = np.maximum(disc * (p * Va[:-1] + (1 - p) * Va[1:]), pay(Si))
    return Va[0], Ve[0]

# ---- 1) 例 17.1:S&P 500 两个月欧式看涨 ----
c = gbsm(930, 900, 2/12, 0.08, 0.03, 0.20)
print(f"例17.1 c={c:.2f},一份合约 {100*c:,.0f} 美元")

# ---- 2) Business Snapshot 17.1:10 年"股票不输债券"保证 = 执行价 1492 的看跌 ----
K = round(1000 * np.exp(0.04 * 10))                  # = 1492
print(f"BS17.1 K={K:.0f}  看跌价值={gbsm(1000, K, 10, 0.05, 0.01, 0.15, 'put'):.1f}")

# ---- 3) 例 17.2:英镑看涨的隐含波动率(Garman–Kohlhagen)----
iv = brentq(lambda s: gbsm(1.6, 1.6, 0.3333, 0.08, 0.11, s) - 0.043, 1e-4, 2)
print(f"例17.2 隐含波动率={iv:.4f};sigma=20%→{gbsm(1.6,1.6,0.3333,0.08,0.11,0.2):.4f},10%→{gbsm(1.6,1.6,0.3333,0.08,0.11,0.1):.4f}")

# ---- 4) 零成本区间远期:给定 K1=1.50,求使看涨=看跌的 K2 ----
S0, r, rf, sig, T = 1.52, 0.05, 0.05, 0.14, 0.25
put = gbsm(S0, 1.50, T, r, rf, sig, "put")
K2 = brentq(lambda k: gbsm(S0, k, T, r, rf, sig, "call") - put, 1.52, 2.0)
print(f"区间远期:K1=1.5000 看跌={put:.5f},零成本 K2={K2:.4f}")

# ---- 5) beta=2 的组合保险:用 CAPM 把组合保险水平映射成指数执行价 ----
V0, I0, beta, r, q, T = 500_000, 1000, 2.0, 0.12, 0.04, 0.25
def port_value(I_T):          # 按表 17.1 口径:CAPM 给出组合总收益,减去组合股息得市值
    idx_ret = (I_T - I0) / I0 + q * T                 # 指数总收益
    port_ret = r * T + beta * (idx_ret - r * T)        # CAPM
    return V0 * (1 + port_ret - q * T)                 # 扣掉组合股息,得到组合市值
for I_T in (1080, 1040, 1000, 960, 920, 880):
    print(f"  指数 {I_T} -> 组合 {port_value(I_T):,.0f}")
K_idx = brentq(lambda I: port_value(I) - 450_000, 500, 1500)
n_puts = beta * V0 / (100 * I0)
print(f"所需执行价={K_idx:.0f},看跌合约份数={n_puts:.0f}")

# ---- 6) 由一条看涨/看跌报价链反推远期价格与隐含股息率 ----
rng = np.random.default_rng(17)
S0, r, q_true, T, sig = 4500.0, 0.045, 0.016, 0.5, 0.18
Ks = np.arange(4000, 5001, 50.0)
cp = gbsm(S0, Ks, T, r, q_true, sig) - gbsm(S0, Ks, T, r, q_true, sig, "put")
cp_obs = cp + rng.normal(0, 0.5, Ks.size)            # 平价残差含报价噪声
# c - p = F e^{-rT} - K e^{-rT}:对 K 回归,截距 = F e^{-rT},斜率 = -e^{-rT}
# (a) 利率已知:式 (17.10) F = K + (c-p)e^{rT},对各执行价取平均
F_a = np.mean(Ks + cp_obs * np.exp(r * T))
q_a = -np.log(np.mean(cp_obs + Ks * np.exp(-r * T)) / S0) / T     # 隐含股息率公式
print(f"(a) 隐含远期={F_a:.2f}(真值 {S0*np.exp((r-q_true)*T):.2f}),隐含股息率={q_a:.4f}(真值 {q_true})")
# (b) 利率也未知:对 K 回归,截距 = F e^{-rT},斜率 = -e^{-rT}
slope, intercept = np.polyfit(Ks, cp_obs, 1)
F_b = -intercept / slope; r_b = -np.log(-slope) / T
print(f"(b) 隐含远期={F_b:.2f},隐含利率={r_b:.4f},隐含股息率={r_b - np.log(F_b / S0) / T:.4f}")
# 用 Black 型公式(远期价格)定价,与用 S0、q 的结果一致
K = 4600; F = S0 * np.exp((r - q_true) * T)
d1 = (np.log(F / K) + 0.5 * sig**2 * T) / (sig * np.sqrt(T)); d2 = d1 - sig * np.sqrt(T)
print(f"Black 型 c={np.exp(-r*T)*(F*norm.cdf(d1)-K*norm.cdf(d2)):.4f}  Merton c={gbsm(S0,K,T,r,q_true,sig):.4f}")

# ---- 7) 美式货币期权:高利率货币的看涨、低利率货币的看跌更可能提前行权 ----
for rf, kind in [(0.10, "call"), (0.10, "put"), (0.01, "call"), (0.01, "put")]:
    am, eu = binom_american(1.0, 1.0, 1.0, 0.04, rf, 0.12, kind=kind)
    print(f"r=4%, r_f={rf:.0%}, {kind:4s}: 美式={am:.5f} 欧式={eu:.5f} 提前行权溢价={am-eu:.5f}")

关键输出:

例17.1 c=51.83,一份合约 5,183 美元
BS17.1 K=1492  看跌价值=169.7
例17.2 隐含波动率=0.1411;sigma=20%→0.0639,10%→0.0285
区间远期:K1=1.5000 看跌=0.03250,零成本 K2=1.5413
  指数 1080 -> 组合 570,000
  指数 1040 -> 组合 530,000
  指数 1000 -> 组合 490,000
  指数 960 -> 组合 450,000
  指数 920 -> 组合 410,000
  指数 880 -> 组合 370,000
所需执行价=960,看跌合约份数=10
(a) 隐含远期=4565.67(真值 4565.73),隐含股息率=0.0160(真值 0.016)
(b) 隐含远期=4565.71,隐含利率=0.0462,隐含股息率=0.0172
Black 型 c=211.0093  Merton c=211.0093
r=4%, r_f=10%, call: 美式=0.02867 欧式=0.02209 提前行权溢价=0.00658
r=4%, r_f=10%, put : 美式=0.07804 欧式=0.07804 提前行权溢价=0.00000
r=4%, r_f=1%, call: 美式=0.06272 欧式=0.06272 提前行权溢价=0.00000
r=4%, r_f=1%, put : 美式=0.03657 欧式=0.03346 提前行权溢价=0.00311

读输出要点:

  • 原书数字(51.83、169.7、14.1%、1.5413、表 17.2、执行价 960)全部复现。区间远期的 0.03250 也与原书一致。
  • 反推远期时,若利率已知,(17.10) 平均后给出的隐含股息率非常准(1.60%);若利率也要估计,回归斜率对噪声敏感,隐含利率偏 12 个基点,隐含股息率随之偏 12 个基点——两者被同一个远期价格约束,误差是相互抵消的。实务中通常用 OIS/国债曲线给定 \(r\),只从期权中提取远期(或"隐含利率 − 隐含股息"这一组合,即隐含持有成本)。
  • 远期价格一旦确定,Black 型公式和 Merton 公式给出完全相同的价格,所以系统只需维护远期曲线而无需维护股息曲线。
  • 外币利率 10%(高于本币 4%)时,美式看涨有明显的提前行权溢价,看跌几乎没有;外币利率 1% 时恰好相反。

本章小结

股指期权现金结算,乘数通常 100;组合保险每 \(100S_0\) 美元组合买 \(\beta\) 份看跌,执行价用 CAPM 由保险水平映射得到。货币期权多为场外交易,用于企业外汇套保;区间远期(买看跌、卖看涨、零成本)把汇率锁定在一个区间内。支付股息率 \(q\) 的股票只需把 \(S_0\) 换成 \(S_0e^{-qT}\),即得下界、平价和 Merton 公式;风险中性漂移为 \(r-q\)。股指取 \(q\) 为期内平均股息率,货币取 \(q=r_f\)(Garman–Kohlhagen)。用远期价格表示的 Black 型公式无须估计股息;平价可以反推远期价格和隐含股息率。美式期权用 \(a=e^{(r-q)\Delta t}\) 的二叉树,高收益率标的的看涨、低收益率标的的看跌最可能提前行权。

概念 公式 / 要点
替换规则 \(S_0\to S_0e^{-qT}\)
平价 \(c+Ke^{-rT}=p+S_0e^{-qT}\)
Merton 公式 \(c=S_0e^{-qT}N(d_1)-Ke^{-rT}N(d_2)\),\(d_1=\dfrac{\ln(S_0/K)+(r-q+\sigma^2/2)T}{\sigma\sqrt T}\)
风险中性过程 \(dS=(r-q)S\,dt+\sigma S\,dz\)
带收益率 PDE \(f_t+(r-q)Sf_S+\frac12\sigma^2S^2f_{SS}=rf\)
货币期权 \(q=r_f\)(Garman–Kohlhagen)
远期形式 \(c=e^{-rT}[F_0N(d_1)-KN(d_2)]\),\(d_1=\dfrac{\ln(F_0/K)+\sigma^2T/2}{\sigma\sqrt T}\)
反推远期 \(F_0=K+(c-p)e^{rT}\)
隐含股息率 \(q=-\frac1T\ln\dfrac{c-p+Ke^{-rT}}{S_0}\)
组合保险份数 \(\beta\times\dfrac{\text{组合价值}}{100\times\text{指数}}\)
二叉树 \(a=e^{(r-q)\Delta t}\)

练习

基础

  1. 组合价值 1,000 万美元,beta 为 1,指数 2,000。为防组合跌破 900 万,应买多少份什么执行价的指数看跌? 提示:\(10{,}000{,}000/(2{,}000\times100)=50\) 份,执行价 1,800(原书习题 17.1 同类)。
  2. 指数 300,股息率 3%,\(r=8\%\),3 个月期执行价 290 的欧式看涨下界是多少? 提示:\(300e^{-0.0075}-290e^{-0.02}=297.76-284.26=13.50\)(原书习题 17.3)。
  3. 货币即期 0.80,\(K=0.79\),\(r=8\%\),\(r_f=6\%\),\(\sigma=15\%\),\(T=0.5\),用 Garman–Kohlhagen 公式求看涨和看跌价格,并验证平价。 提示:直接调用 gbsm;平价残差应为 0。
  4. 解释为什么高利率货币的美式看涨比欧式看涨更有价值。 提示:风险中性漂移 \(r-r_f<0\),行权后持有外币能赚 \(r_f\)。
  5. 远期汇率等于执行价时,欧式货币看涨与看跌价格有什么关系? 提示:由平价 \(c-p=e^{-rT}(F_0-K)=0\),二者相等(原书习题 17.13)。

进阶

  1. 重做 17.1 节 beta=2 的组合保险,但改为 beta=1.5、保险水平 47 万。求执行价与份数。 提示:用代码中的 port_value 改 beta、目标值后求根;份数 \(1.5\times5=7.5\) 份(原书习题 17.17 同类)。
  2. 证明零成本区间远期的上执行价 \(K_2\) 在给定 \(K_1\)、\(\sigma\)、\(T\) 和 \(F_0/S_0\) 时与利率水平无关。 提示:用远期形式 (17.13)(17.14),\(e^{-rT}\) 在等式两边约去,条件只依赖 \(F_0\)、\(K\)、\(\sigma\)、\(T\)(原书习题 17.28)。
  3. 某指数 1,200,6 个月期执行价 1,200 的欧式看涨 80、看跌 60,\(r=5\%\)。求隐含远期价格和隐含股息率。 提示:\(F_0=1200+20e^{0.025}=1220.51\);\(q=r-\ln(F_0/S_0)/T=0.05-0.0339=1.61\%\)(原书习题 17.18 同类)。
  4. 一家欧洲公司持有美元资产,希望保证以欧元计价的收益。说明它应该买哪种货币期权,并用对称性把它改写为另一种报价方式。 提示:买美元看跌/欧元看涨;以 \(K\) 欧元/美元卖 1 美元的看跌 = 以 \(1/K\) 美元/欧元买 \(K\) 欧元的看涨。
  5. 某保本产品承诺 5 年后返还本金并按指数涨幅的一定比例付息。说明如何用零息债和指数看涨期权复制它,并在给定 \(r\)、\(q\)、\(\sigma\) 下求最大参与率。 提示:本金 \(\times e^{-rT}\) 买零息债,剩余资金买平值看涨,参与率 = 剩余资金 / 平值看涨价格(与原书习题 17.29、19.27 思路相同)。

原书推荐习题:17.17(beta≠1 的组合保险);17.18、17.26(隐含股息率与隐含波动率);17.12(美式平价不等式证明);17.8、17.27(货币对称性与计价货币转换);17.28(零成本区间远期);17.4、17.24(带收益率的二叉树);17.29(保本保证的期权定价)。


原书对照

本章小节 原书章节 PDF 页码
17.1 股指期权与组合保险 17.1 Options on Stock Indices(含表 17.1、17.2) p.390–392
17.2 货币期权、区间远期 17.2 Currency Options p.392–395
17.3 已知股息率股票的期权 17.3 Options on Stocks Paying Known Dividend Yields p.395–397
17.4 欧式股指期权估值 17.4 Valuation of European Stock Index Options(含 Business Snapshot 17.1) p.397–400
17.5 欧式货币期权估值 17.5 Valuation of European Currency Options p.400–401
17.6 美式期权 17.6 American Options p.401–402
小结与习题 Summary, Further Reading, Practice Questions p.402–405

延伸阅读:Biger & Hull (1983)、Garman & Kohlhagen (1983)、Grabbe (1983) 货币期权定价;Bodie (1995) 论股票长期风险;Merton (1973) 带股息率的期权定价。