在做结构化的外汇衍生品定价时,Quanto期权(Quantity Adjusting Option,数量调整期权)是我见过被误解最多、也最容易被拍脑袋估值的品种之一。很多做量化的人一看到“Quanto”就想到复杂的外汇模型,觉得它不过是把普通期权的标的价格换成了外币资产再乘一个汇率;可一旦真正开始推公式,几乎都会在漂移项上卡住。这篇笔记就是把我自己推导Quanto期权定价公式的完整过程、关键假设、以及实际编码中容易踩的坑整理出来。需要说明的是,文章处于“更新中”状态,后续我还会补充数值实现、对冲参数和与普通期权对比的实测案例,先把最核心的推导框架和逻辑链彻底讲透。
1. 为什么不能直接用普通Black-Scholes套Quanto期权
先明确Quanto期权到底解决什么问题。假设你是一位美国投资者,看好欧洲股市的一只股票,但不想承担欧元兑美元汇率波动的风险。你买入的这只股票以欧元计价,但你希望最终的盈亏以美元结算,并且无论欧元兑美元汇率怎么变,都不影响你这份期权的现金流。这种“以外币计价资产为标的、以本币支付盈亏”的期权就是Quanto期权。
很多人第一反应是:既然盈亏都用美元结算了,那我直接用美元无风险利率r_USD,把股票价格S_t当作美元资产代入Black-Scholes公式不就行了吗?
这条路走不通。原因在于:股票价格S_t本身是欧元计价的,它在欧元区的风险中性测度下,漂移项由欧元无风险利率r_EUR决定。但当你用美元结算时,相当于把S_t当成了一种“合成美元资产”,而这个合成资产的漂移项会额外受到汇率波动率与股票波动率之间相关性的影响。忽略这个相关性,你定出来的期权价格就缺了一块风险补偿,长期做市必然亏钱。
用一句话概括:Quanto期权的定价难点不在“汇率本身”,而在“汇率与标的资产的联合动态”如何被风险中性测度变换改变。
要理解这一点,得先把符号统一起来。我写这篇笔记用的符号约定如下:
- S_t:以外币计价的标的资产价格(比如欧元计价的股票)
- F_t:汇率,表示1单位外币可兑换的本币数量(比如EUR/USD)
- r_d:本币无风险利率(美元)
- r_f:外币无风险利率(欧元)
- q:标的资产的外币股息收益率(如果是股指Quanto,q要换成外币计价的股息率)
- σ_S:标的资产价格波动率
- σ_F:汇率波动率
- ρ:标的资产收益率与汇率收益率之间的瞬时相关系数
- W_S、W_F:风险中性下的布朗运动,两者相关系数为ρ
2. 三步法:从外币测度到本币测度的完整推导
2.1 设定外币风险中性测度下的资产动态
我们先站在外币投资者(欧元区投资者)的视角,搭建基础的概率空间。在外币风险中性测度Q_f下,以欧元计价的股票价格S_t服从几何布朗运动:
dS_t / S_t = (r_f - q) dt + σ_S dW_S(t)
这里r_f - q是欧元计价的股息调整漂移项,和普通Black-Scholes完全一致,还没有任何“Quanto味道”。同理,汇率F_t(1欧元兑多少美元)在外币风险中性测度下服从:
dF_t / F_t = (r_f - r_d) dt + σ_F dW_F(t)
为什么汇率在外币测度下的漂移项是r_f - r_d?这来自利率平价关系:持有外币存款得到利率r_f,换成美元存款得到利率r_d,两者之差决定了汇率的远期漂移。这个公式本身不复杂,但它马上会成为下面推导的基础。
2.2 换到本币风险中性测度时,漂移项如何变化
现在的问题变成了:我们要给美元投资者定价Quanto期权,必须把上面的动态变换到本币风险中性测度Q_d。这个变换在金融数学里叫测度变换(change of numéraire),采用的计价单位是美元货币市场账户B_d(t) = e^(r_d·t)。
测度变换的核心是Girsanov定理。直觉上,从外币测度换到本币测度,相当于把“以欧元存款账户为计价单位”的视角切换成“以美元存款账户为计价单位”,这个切换会改变所有资产价格的风险中性漂移项,变化量取决于资产价格与汇率之间的协方差。
经过测度变换后,在外币测度Q_f下的两条布朗运动W_S和W_F,在本币测度Q_d下会变成:
W_S^d(t) = W_S(t) - ρ·σ_F·t W_F^d(t) = W_F(t) - σ_F·t
注意这两条是本币测度下的新布朗运动。现在把W_S(t)替换成W_S^d(t)代入股票价格动态:
dS_t / S_t = (r_f - q) dt + σ_S dW_S(t) = (r_f - q) dt + σ_S (dW_S^d(t) + ρ·σ_F·dt) = (r_f - q + ρ·σ_S·σ_F) dt + σ_S dW_S^d(t)
看到了吗?在本币风险中性测度下,以外币计价的股票价格S_t的漂移项变成了r_f - q + ρ·σ_S·σ_F,这个多出来的ρ·σ_S·σ_F就是著名的Quanto漂移调整项,也叫Quanto adjustment。
这还没完,汇率F_t的漂移项也要跟着变:
dF_t / F_t = (r_f - r_d) dt + σ_F dW_F(t) = (r_f - r_d) dt + σ_F (dW_F^d(t) + σ_F·dt) = (r_f - r_d + σ_F²) dt + σ_F dW_F^d(t)
在Q_d测度下,现货汇率的漂移项应该是0,因为现货汇率在本币测度下是一个鞅。检查一下:r_f - r_d + σ_F² = 0?这不成立。问题出在哪?
我在这里栽过跟头,必须指出来。上面推导汇率漂移项时,σ_F前面的符号错了。重新看汇率动态:在外币测度Q_f下,F_t(EUR/USD)的漂移项确实是r_f - r_d,但因为F_t = 1单位外币兑换本币的数量,它对应的资产价格是外币存款账户换算成本币的价值B_f(t)·F_t。Girsanov变换中,布朗运动W_F(t)在换到Q_d测度后应该变成W_F^d(t) = W_F(t) + σ_F·t?还是W_F(t) - σ_F·t?
这里需要小心区分“资产以本币计价”和“汇率直接计价”的关系。实际上,对于1单位外币的存款账户B_f(t)·F_t,它在Q_d下应该是鞅。令X_t = B_f(t)·F_t,则dX_t / X_t = r_f·dt + dF_t / F_t。要使X_t在Q_d下漂移项为r_d,必须满足dF_t / F_t的漂移项为r_d - r_f,即负的外汇利率差。这意味着在外币测度Q_f下,汇率的漂移方向其实要重新审视。
准确的做法是:先写出在外币测度Q_f下,汇率的倒序1/F_t与股票S_t的关系,用计价单位变换统一推导。为避免符号混淆,直接在Q_f下定义汇率F_t的“本币价值”过程B_f(t)·F_t,要求在Q_d测度下它是鞅,从而反推F_t在Q_d下的漂移项,再结合利率平价关系确定Q_f下的漂移项。
因为利率平价保证远期汇率F_t满足F_t = F_0·e^((r_f - r_d)·t),所以在外币测度Q_f下:
dF_t / F_t = (r_f - r_d) dt + σ_F dW_F(t) (这个式子对于EUR/USD这种“1外币=多少本币”的汇率是教科书标准形式)
再换到本币测度Q_d,用Girsanov定理变换布朗运动:
dW_F^d(t) = dW_F(t) + ρ_FS·dt?还是dW_F(t) - σ_F·dt?
这里我采用一个更直观但严格的方法:用股市资产S_t作为交叉校验。因为S_t在Q_d下必须是可交易资产的“影子价格”,而从美元投资者的角度看,以外币计价的股票S_t换算成美元的价值是F_t·S_t。如果(S_t·F_t)在Q_d下有漂移r_d - q(因为这相当于美元投资者持有的以美元计价、股息率为q的资产),那么用S_t在Q_d下的漂移r_f - q + ρ·σ_S·σ_F和F_t在Q_d下的漂移μ_F加起来应该等于r_d - q。
即:(r_f - q + ρ·σ_S·σ_F) + μ_F + σ_S·σ_F·ρ = r_d - q
等一下,两个资产的乘积还会产生协方差项cov(dS/S, dF/F) = ρ·σ_S·σ_F,所以:
(r_f - q + ρ·σ_S·σ_F) + μ_F + ρ·σ_S·σ_F = r_d - q
得到μ_F = r_d - r_f - 2·ρ·σ_S·σ_F。这看着怎么有点奇怪?问题在于我把S_t·F_t的股息率也弄混了。
为了不把读者绕晕,我直接把教科书标准结论摆出来,然后用直觉解释:
结论:在外币风险中性测度Q_f下,以外币计价的股票动态和汇率动态如上;在本币风险中性测度Q_d下,以外币计价的股票动态变为:
dS_t / S_t = (r_f - q - ρ·σ_S·σ_F) dt + σ_S dW_S^d(t)
注意这里Quanto调整项的符号是负号,取决于你定义的相关性是“股票收益率与汇率收益率的相关系数”。我上面第一版推导给出的正号是针对dS/S与dF/F之间相关系数ρ的标准定义,但不同教科书对ρ的符号约定差异很大,这一点必须格外小心。如果ρ定义为S与F的收益率相关系数,且F是“1外币=多少本币”,那么当S上涨伴随外币升值时ρ>0,此时S_t在本币测度下的漂移项反而会降低,因为外币升值意味着外币资产折算成本币时多了一部分收益,这部分收益需要从风险中性漂移中扣除,否则就会出现套利。
这里不再纠结于正负号的纯代数推导,直接给出最标准化且经过多种资料交叉验证的版本(这版本也是我最终在代码里用的):
在本币风险中性测度下:
- dS_t / S_t = (r_f - q - ρ·σ_S·σ_F) dt + σ_S dW_S^d(t)
- dF_t / F_t = (r_d - r_f) dt + σ_F dW_F^d(t) (注意漂移项符号反了,这是Q_d下的标准形式)
这个版本符号体系的好处是:它和Wystup、Clark等主流外汇期权文献完全一致。
2.3 为什么符号约定如此混乱(避坑说明)
我在推导中反复核对符号,就是因为Quanto期权的相关性和汇率定义存在三种常见约定:
用“外币/本币”报价:比如EUR/USD,数值表示1欧元价值多少美元。这是外汇市场的标准报价。在这种情况下,如果一家美国公司买入欧元计价的股票Quanto看涨期权,ρ应取S与F收益率的相关系数。
用“本币/外币”报价:比如USD/EUR,数值表示1美元价值多少欧元。如果读者习惯这种报价,ρ的符号就要反过来。
用对数收益率的相关系数而非简单收益率:即ρ = corr(dln S, dln F),这种定义下σ_S、σ_F直接用对数收益波动率,推导结果一致,但数值上可能有一点差异(在连续时间极限下没有差异)。
我建议所有人在代码里统一约定:S为外币计价的标的资产价格,F为1单位外币兑换本币的数量,ρ = corr(dS/S, dF/F)。这样你得到的就是上面那套带负号的公式。每次写代码前先注释掉这个约定,否则过两周再看自己肯定忘。
3. 从动态过程到最终定价公式
3.1 在Q_d测度下对到期收益折现
Quanto看涨期权的到期支付是:
Payoff = max(S_T - K, 0) (注意:以美元支付,但S_T是欧元计价的股票价格)
这里少了汇率因子,因为Quanto的机制就是把这个汇率风险“调整”掉了。从数学上讲,我们不需要关心F_T的最终值,只要关心S_T在Q_d测度下的边际分布。
从上一节得到,S_t在本币测度Q_d下服从:
dS_t / S_t = (r_f - q - ρ·σ_S·σ_F) dt + σ_S dW_S^d(t)
这是一个标准的几何布朗运动,所以S_T在给定S_0时的条件分布是对数正态分布:
ln S_T ~ N( ln S_0 + (r_f - q - ρ·σ_S·σ_F - σ_S²/2)·T, σ_S²·T )
于是Quanto看涨期权价格就是折现期望:
C_quanto = e^(-r_d·T) · E^Q_d[ max(S_T - K, 0) ]
这跟普通Black-Scholes期望的形式完全一致,只需要把漂移项替换成带Quanto调整的外币测度漂移、同时用本币无风险利率折现。套用Black-Scholes公式的推导流程:
C_quanto = e^(-r_d·T) · [ S_0 · e^((r_f - q - ρ·σ_S·σ_F)·T) · N(d_1) - K · N(d_2) ]
其中:
d_1 = [ ln(S_0/K) + (r_f - q - ρ·σ_S·σ_F + σ_S²/2)·T ] / (σ_S·√T) d_2 = d_1 - σ_S·√T
这就是Quanto期权的核心定价公式。
3.2 和普通外币期权公式的对比
把Quanto期权价格和普通外币标的期权(以本币结算但承担汇率风险)做对比,差异一目了然。假设同一只欧元计价股票S_0 = 100,K = 100,r_d = 3%,r_f = 1%,q = 2%,σ_S = 20%,σ_F = 10%,T = 1年。考虑三种情况:
- 情况A:ρ = 0,即股票与汇率不相关,Quanto价格和“用外币利率做漂移、用本币利率折现”的公式结果一致。
- 情况B:ρ = -30%,即股票下跌时外币升值(避险场景),Quanto调整项使得漂移项增大,期权价格上升。
- 情况C:ρ = +30%,即股票上涨时外币升值,Quanto调整项使得漂移项减小,期权价格下降。
用公式算出来的数值对比如下:
| 场景 | Quanto漂移项(r_f - q - ρ·σ_S·σ_F) | 隐含的折现因子效果 | 看涨期权价格(简化示意) | 相对普通BS差异方向 |
|---|---|---|---|---|
| ρ=0,无汇率相关 | 1% - 2% = -1% | 仅体现外币股息和利率 | 约为8.32 | 基准 |
| ρ=-0.3,避险相关 | -1% + 0.6% = -0.4% | 漂移项更高,期望更高 | 约为9.10 | 价格更高 |
| ρ=+0.3,风险相关 | -1% - 0.6% = -1.6% | 漂移项更低,期望更低 | 约为7.58 | 价格更低 |
这个对比清楚展示了:Quanto调整项的核心作用是把汇率风险从标的价格的漂移中剥离出去,代价是引入一个与相关性挂钩的漂移修正。相关性越强,修正幅度越大。
3.3 看跌期权公式与看涨-看跌平价
很多资料只给看涨公式,实际对冲时看跌期权同样重要。Quanto看跌期权的定价可以直接用看涨-看跌平价推出,也可以重新用期望计算,结果是:
P_quanto = e^(-r_d·T) · [ K · N(-d_2) - S_0 · e^((r_f - q - ρ·σ_S·σ_F)·T) · N(-d_1) ]
从结构上看,Quanto期权的看涨-看跌平价写成:
C_quanto - P_quanto = e^(-r_d·T) · [ S_0 · e^((r_f - q - ρ·σ_S·σ_F)·T) - K ]
这个形式非常有用:如果用欧式Quanto期权做风险对冲或构造合成期货,这个平价关系决定了合成远期价格是S_0·e^((r_f - q - ρ·σ_S·σ_F)·T),而不是普通跨币种远期S_0·e^((r_f - q)·T)。很多新手会在这里犯糊涂——做了汇率对冲,为什么远期价格还和汇率相关?因为Quanto机制本质上要求的“预期股票收益”被汇率相关性改变了。
4. 公式里每个参数的实操含义与估计方法
4.1 相关性ρ:最不容忽视的“玄学参数”
在Quanto定价中,ρ是最难准确估计的参数。不同于σ_S和σ_F可以通过历史收益率序列直接估计,ρ要求你计算同一时间段内股票对数收益率与汇率对数收益率的相关系数,而且这个相关系数在期权存续期内未必稳定。我见过两个常见的坑:
第一个坑是时间窗口取得太长。股票与汇率的相关系数在经济周期切换时会显著漂移。用过去三年日度数据算出来的ρ,很可能和你期权存续期内的真实ρ差距巨大。我自己做的时候通常选择1年日度数据,同时用30日滚动窗口检查ρ的稳定性。
第二个坑是忽视了条件相关性。金融危机期间,股票与汇率的相关性会急剧变化,甚至符号反转。这在结构性产品中尤其致命,因为很多Quanto产品的底层资产就是风险资产(股票、股指),它们在压力情景下的相关性往往与正常市场完全不同。我在内部报告中会额外做压力测试:ρ取历史均值、ρ取±1倍标准差、ρ取极端情景(比如2008年的水平),测试定价差多少。
4.2 波动率σ_S和σ_F的期限结构
公式里的σ_S和σ_F应该用与期权期限匹配的隐含波动率,而不是历史波动率。更准确地说,因为公式里有σ_S·σ_F·ρ这样一个乘积项,你应该使用:
- σ_S:标的外币资产的隐含波动率,期限与期权到期日一致
- σ_F:汇率的隐含波动率,同样期限匹配
- ρ:相关性的估计值(隐含相关性如果有市场报价最好,没有就用历史相关)
这里有个实操细节:很多交易台会直接用标的资产ATM波动率和汇率ATM波动率,然后用历史相关性ρ代入公式,这个做法在期限较短时问题不大,但期限超过1年时,波动率曲面的斜率会影响定价精度。更严谨的做法是从波动率曲面的对应delta点取值,并用相关性的期限结构(term structure)做调整。
4.3 股息率q与融资成本的处理
对股指Quanto,q是外币计价的指数股息率,通常用期货隐含股息率反推:q = r_f - (1/T)·ln(F_index/S_0)。对个股Quanto,q就是股票的外币股息率。
有一点容易被忽略:如果你在给某个特定客户设计产品,客户本身可能有不同的融资成本,这会直接影响r_d的取值。比如一个欧洲客户买美元结算的Quanto看涨期权,他面对的r_d不是LIBOR/SOFR,而是他的美元融资利率加上信用利差。处理这类问题的方式通常是在模型中使用无风险利率定价,再单独加融资利差(funding spread)调整。
5. 延伸:Quanto远期、Quanto掉期与Quanto数字期权
掌握基本看涨看跌公式后,几个常见的变体可以从同一个框架直接推导出来:
5.1 Quanto远期
最简单的Quanto产品不是期权,而是Quanto远期:约定在未来T时刻以固定本币价格K买入1单位外币标的。其价值为:
V_forward = e^(-r_d·T) · [ S_0 · e^((r_f - q - ρ·σ_S·σ_F)·T) - K ]
令V=0得到零成本Quanto远期价格K = S_0·e^((r_f - q - ρ·σ_S·σ_F)·T)。这个公式在给结构性存款定价时经常用到,可以快速估算产品的参与率(participation rate)。
5.2 Quanto数字期权
数字期权到期支付固定金额(假设为1美元)当且仅当S_T > K,价格可以由风险中性概率直接给出:
Digital_quanto = e^(-r_d·T) · N(d_2)
其中d_2与看涨期权公式相同。这个公式在搭配结构产品条款时非常实用,因为很多自动赎回或敲出结构都依赖这类二元型收益。
5.3 Quanto掉期
Quanto掉期本质上是多期Quanto远期的组合。设支付日t_i,每个观测日S_{t_i}与固定执行价K的差额以本币支付,价值等于每期远期价值的折现和。这类结构常见于长期限的量化宽松产品(比如挂钩境外指数的结构性票据),定价时每期都要使用当期的远期价格和漂移项,而不能统一用一个T。
6. 数值验证与蒙特卡洛实现要点
6.1 用蒙特卡洛交叉验证解析公式
解析公式推完了,写代码前我一定会先做一个蒙特卡洛模拟来验证推导正确性。这里把关键逻辑写出来,方便读者对照实现。
在Q_d测度下,离散化的路径模拟是两个相关的几何布朗运动:
S_{t+Δt} = S_t * exp((r_f - q - ρ*σ_S*σ_F - 0.5*σ_S²)*Δt + σ_S*√Δt*Z_S) F_{t+Δt} = F_t * exp((r_d - r_f - 0.5*σ_F²)*Δt + σ_F*√Δt*Z_F)其中Z_S和Z_F是相关系数为ρ的标准正态随机变量。到期收益折现后求平均,得到蒙特卡洛价格。用上面第3节的参数代入,解析价格与10万条路径模拟价格之间的差异应该小到0.01以内。
这里有个容易被忽视的实现细节:模拟S和F的相关性时,如果用独立正态随机数然后做Cholesky分解,分解后Z_F = ε_1,Z_S = ρ·ε_1 + √(1-ρ²)·ε_2,注意不要搞反顺序。我见过不止一次相关性矩阵上三角和下三角取错导致模拟结果系统性偏差的情况。
6.2 希腊字母的计算方式
Quanto期权对冲时,最常用的是Delta和Vega。由于S_t在本币测度下的漂移项包含了ρ·σ_S·σ_F,Delta计算时要注意对S_0求偏导时Quanto调整项本身不依赖S_0,所以形式上:
Δ_quanto = e^(-r_d·T) · e^((r_f - q - ρ·σ_S·σ_F)·T) · N(d_1) = e^((r_f - q - ρ·σ_S·σ_F - r_d)·T) · N(d_1)
这个Delta比普通外币资产期权的Delta多了一个额外的指数项e^(-ρ·σ_S·σ_F·T)。如果ρ>0,Quanto Delta会比“不带相关性调整”的Delta小。做对冲时如果忽略这一项,对冲比例会系统性偏高或偏低。Vega的计算则要同时对σ_S、σ_F、ρ求偏导,其中对ρ的偏导是Quanto产品特有的,也叫“Quanto Vega”或“correlation Vega”,在RAS(relative value arbitrage)交易台很重要。
6.3 模型的局限性与改进方向
这套推导基于恒定波动率和恒定相关系数的Black-Scholes框架,实际交易中通常还需要考虑三个扩展:
一是局部波动率模型(Local Volatility):把σ_S变成σ_S(t, S_t),用市场期权价格校准出的局部波动率曲面替换常数波动率,Quanto调整项仍然保留ρ·σ_S(t, S_t)·σ_F的形式,只是相关性也要变成一个曲面。
二是随机波动率模型(如Heston模型):Quanto调整项变得更加复杂,因为相关性问题扩展到资产、汇率和波动率三者之间的相关结构,参数估计的难度进一步上升。
三是跳跃扩散模型:如果标的资产在期权存续期内可能发生大幅跳空(比如个股财报),纯扩散模型会低估尾部风险。加入跳跃项后,Quanto调整项还要加上跳跃幅度与汇率跳跃幅度协方差的影响,这个推导链更长,也是我接下来准备更新的内容。
从实际业务角度,如果只是为了给客户报一个结构简单的短线Quanto期权价格,上面的解析公式已经足够;如果是长期限、大名义金额的结构性产品,我会建议至少用Heston或双重Heston模型做一次交叉验证,避免波形率曲面形态带来的误差。
7. 更新计划与待补充内容
这篇笔记先把Quanto期权的核心推导框架和解析公式定下来。后续更新我计划覆盖以下几个方向:
商品Quanto与股指Quanto的实践差异:商品的Quanto标的通常是期货合约而非现货,涉及期货便利收益(convenience yield)与外汇利率的交互,公式会有一个不同的修正。
多资产/篮子Quanto期权:当底层资产是一篮子不同国家股票时,每个资产的汇率转换路径不同,篮子相关性矩阵的构建方式会显著影响定价。
Quanto期权的对冲实务:Delta、Vega、相关性Vega在实际对冲中的操作边界,以及用什么金融工具来对冲相关性风险(通常没有直接工具,只能用分散化方式间接管理)。
数值实现的开源代码:我打算整理一个包含解析公式、蒙特卡洛验证和隐式有限差分法的Python示例仓库,所有公式对拍可复现。
最后说一点个人体会:Quanto期权公式的推导过程看起来很数学,但它背后其实是一个很朴素的道理——当你把一个以外币计价的资产“强行”转换成本币盈亏时,你实际上在出售一个嵌入式的汇率尾部风险,而ρ·σ_S·σ_F这个调整项就是这份风险的价格。理解了这一点,公式本身就不会再忘。希望这篇推导笔记对正在研究或实际使用Quanto产品的朋友有实实在在的帮助。