第四章:亚式期权定价——从理论到实战
亚式期权,说白了就是「看平均」的期权。普通欧式期权看的是到期日那一天的标的价格,亚式期权看的是一段时间内的平均价格。这个「平均」两个字,让它的风险特征完全不一样了。
我在做市商那几年,亚式期权是我最常接触的奇异期权之一。为什么?因为很多企业客户喜欢用它来对冲汇率风险——他们每天都有现金流进出,用亚式期权比用普通期权更贴合实际需求。
4.1 亚式期权的定义与分类
亚式期权有两种主流分类方式,我建议你记牢:
- 平均价格亚式期权(Average Price Option):结算时,用标的资产在存续期内的平均价格代替到期价格。看涨期权 payoff = max(0, S_avg - K),看跌期权 payoff = max(0, K - S_avg)。
- 平均执行价亚式期权(Average Strike Option):结算时,用平均价格代替执行价。看涨期权 payoff = max(0, S_T - K_avg),看跌期权 payoff = max(0, K_avg - S_T)。
你想想看,这两种期权哪个更便宜?
嗯,平均价格亚式期权通常比普通期权便宜,因为平均价格的波动率比瞬时价格低。我在项目中遇到过客户问:「为什么亚式期权报价比欧式低这么多?」其实原因很简单——波动率被平均掉了。
核心区别:平均价格亚式期权降低的是标的资产价格的不确定性,平均执行价亚式期权降低的是执行价的不确定性。两者都能起到平滑风险的作用。
另外,按平均方式还可以分为:
- 算术平均亚式期权:S_avg = (S₁ + S₂ + ... + Sₙ) / n
- 几何平均亚式期权:S_avg = (S₁ × S₂ × ... × Sₙ)^(1/n)
算术平均更常见,但几何平均有解析解。为什么?因为几何平均的对数仍然服从正态分布,算术平均就不行。这个数学性质决定了定价的难易程度。
4.2 几何平均亚式期权的解析解
几何平均亚式期权之所以有解析解,是因为它和普通欧式期权在数学结构上是「同构」的。我当年推导这个公式时,花了整整一个下午——但一旦理解了,你会发现它其实很优雅。
假设标的资产价格服从几何布朗运动:
dS = μS dt + σS dW
几何平均价格定义为:
G = exp( (1/T) ∫₀ᵀ ln(S(t)) dt )
经过推导,几何平均价格 G 仍然服从对数正态分布,其参数为:
μ_G = μ - σ²/2 - (σ²/6)
σ_G = σ / √3
你没看错,波动率变成了原来的 1/√3。这就是为什么亚式期权比普通期权便宜——波动率被压缩了。
那么,几何平均亚式看涨期权的定价公式就是:
C = e^(-rT) * [F * N(d₁) - K * N(d₂)]
其中:
F = S₀ * exp( (r - q - σ²/6) * T )
d₁ = (ln(F/K) + σ_G² * T / 2) / (σ_G * √T)
d₂ = d₁ - σ_G * √T
σ_G = σ / √3
实战技巧:我在做市时,经常用几何平均亚式期权的解析解作为蒙特卡洛模拟的「对照基准」。如果蒙特卡洛结果和解析解偏差超过 0.5%,我就知道模拟参数设置有问题。
4.3 蒙特卡洛定价实现
实际交易中,算术平均亚式期权更常用。但算术平均没有解析解,只能用蒙特卡洛模拟。我曾经用 C++ 写过一套亚式期权定价引擎,下面给你看核心逻辑。
蒙特卡洛定价的基本步骤:
- 生成标的资产价格路径
- 计算路径上的平均价格
- 计算该路径下的期权 payoff
- 对所有路径的 payoff 取平均并贴现
下面是一个 Python 实现示例:
import numpy as np
def arithmetic_asian_option_mc(S0, K, r, sigma, T, n_steps, n_paths, option_type='call', avg_type='price'):
"""
算术平均亚式期权蒙特卡洛定价
S0: 初始价格
K: 执行价
r: 无风险利率
sigma: 波动率
T: 到期时间
n_steps: 时间步数
n_paths: 模拟路径数
"""
dt = T / n_steps
discount = np.exp(-r * T)
# 生成所有路径
S = np.zeros((n_paths, n_steps + 1))
S[:, 0] = S0
for i in range(1, n_steps + 1):
Z = np.random.standard_normal(n_paths)
S[:, i] = S[:, i-1] * np.exp((r - 0.5 * sigma**2) * dt + sigma * np.sqrt(dt) * Z)
# 计算平均价格(跳过初始价格,从第一个观测点开始)
S_avg = np.mean(S[:, 1:], axis=1)
if avg_type == 'price':
# 平均价格亚式
if option_type == 'call':
payoff = np.maximum(S_avg - K, 0)
else:
payoff = np.maximum(K - S_avg, 0)
else:
# 平均执行价亚式
ST = S[:, -1]
if option_type == 'call':
payoff = np.maximum(ST - S_avg, 0)
else:
payoff = np.maximum(S_avg - ST, 0)
price = discount * np.mean(payoff)
return price
# 使用示例
price = arithmetic_asian_option_mc(
S0=100, K=100, r=0.05, sigma=0.2,
T=1.0, n_steps=252, n_paths=100000
)
print(f"算术平均亚式看涨期权价格: {price:.4f}")
避坑指南:我曾经在模拟时忘记排除初始价格,导致平均价格偏高,定价偏差了 2% 以上。记住,亚式期权的平均通常从第一个观测日开始,不是从 t=0 开始。
4.4 蒙特卡洛的方差缩减技巧
做市商每天要报几百个亚式期权价格,蒙特卡洛模拟太慢可不行。我常用的方差缩减方法有:
- 对偶变量法:生成一组随机数 Z,同时用 -Z 生成另一条路径。两条路径负相关,能有效降低方差。
- 控制变量法:用几何平均亚式期权的解析解作为控制变量。算术平均和几何平均高度相关,但几何平均有精确解,可以用来校正算术平均的模拟结果。
下面是对偶变量法的实现:
def asian_option_antithetic(S0, K, r, sigma, T, n_steps, n_paths):
"""使用对偶变量法的亚式期权定价"""
dt = T / n_steps
discount = np.exp(-r * T)
payoffs = np.zeros(n_paths)
for j in range(n_paths):
Z = np.random.standard_normal(n_steps)
# 正向路径
S_plus = S0
sum_plus = 0
for i in range(n_steps):
S_plus *= np.exp((r - 0.5*sigma**2)*dt + sigma*np.sqrt(dt)*Z[i])
sum_plus += S_plus
# 对偶路径
S_minus = S0
sum_minus = 0
for i in range(n_steps):
S_minus *= np.exp((r - 0.5*sigma**2)*dt - sigma*np.sqrt(dt)*Z[i])
sum_minus += S_minus
avg_plus = sum_plus / n_steps
avg_minus = sum_minus / n_steps
payoff_plus = max(avg_plus - K, 0)
payoff_minus = max(avg_minus - K, 0)
payoffs[j] = 0.5 * (payoff_plus + payoff_minus)
price = discount * np.mean(payoffs)
return price
用对偶变量法,同样的路径数,方差能降低 30%-50%。我在做市系统里一直用这个方法,效果很稳定。
4.5 知识体系总览
下面这张图总结了亚式期权定价的核心逻辑:
这张图把亚式期权的分类和定价方法串起来了。你从根节点往下看,先选分类,再选定价方法,逻辑很清晰。
4.6 实战中的注意事项
最后,分享几个我在做市实战中积累的经验:
- 观测频率:亚式期权的平均频率会影响价格。日频观测比周频观测更贵,因为高频平均更接近连续路径。我一般用 252 个交易日作为年化基准。
- 波动率曲面:亚式期权的隐含波动率通常低于平值欧式期权。如果你用欧式期权的波动率来定价亚式,价格会偏高。
- 对冲难度:亚式期权的 Delta 和 Gamma 比欧式期权更平滑,但 Vega 对波动率路径更敏感。我习惯用「波动率 Greeks」来管理风险。
我的习惯:每次上线新的亚式期权产品,我都会先用几何平均解析解做一次「合理性检查」,再用蒙特卡洛跑 50 万条路径做精细定价。两个结果对得上,我才敢报给客户。
亚式期权定价,说白了就是「平均的艺术」。理解了这个平均过程,你就能理解它的风险特征和定价逻辑。下一节我们会聊到亚式期权的 Greeks 计算和对冲策略,那才是做市商真正赚钱的地方。
公众号:蓝海资料掘金营,微信deep3321