美式期权的蒙特卡洛模拟定价python
时间: 2025-01-06 22:22:43 浏览: 16
### 使用Python进行美式期权蒙特卡洛模拟定价
对于美式期权而言,由于其可以在到期日前任何时间行使的特点,使得估值变得复杂。为了处理这种提前执行的可能性,通常会应用最小二乘法蒙特卡洛(Least Squares Monte Carlo, LSMC)算法。
#### 最小二乘蒙特卡洛方法简介
该方法由Longstaff和Schwartz于2001年提出,它结合了回归分析与传统的蒙特卡洛仿真技术来近似计算早期行权价值。具体来说,在每一个可能的行权时刻t_i处构建一个关于内在价值V(t_i,X_{t_i})对未来现金流现值E[V(T)]之间关系的经验模型f(X),其中X表示标的资产的价格向量;接着利用这些拟合出来的函数去估算继续持有而非立即行权所能获得的最大期望收益[^2]。
#### Python代码实现
下面给出一段基于上述原理编写用于评估单一股票上的简单美式看涨/跌期权合约价值的Python脚本:
```python
import numpy as np
from scipy.stats import norm
def american_option_mc(spot_price, strike_price, risk_free_rate,
volatility, maturity_years, num_simulations=10000):
dt = 1 / 365.
n_steps = int(maturity_years * 365)
# Generate stock price paths using geometric Brownian motion model
z = np.random.normal(size=(num_simulations, n_steps))
s_t = spot_price * (np.cumprod(np.exp(
(risk_free_rate - 0.5 * volatility ** 2) * dt +
volatility * np.sqrt(dt) * z), axis=-1))
payoff_matrix = np.maximum(strike_price - s_t[:, ::-1], 0.)
continuation_values = []
exercise_boundary = []
for t in range(n_steps)[::-1]:
if t == n_steps - 1:
continue_value = payoff_matrix[:, t]
else:
X = sm.add_constant(s_t[:, -(t + 1)])
y = np.fmax(payoff_matrix[:, t],
discount_factor * continuation_values[-1])
reg = LinearRegression().fit(X, y)
continue_value = reg.predict(X)
should_exercise = payoff_matrix[:, t] >= continue_value
discounted_payoffs = payoff_matrix[should_exercise, t].mean() \
or max(continue_value.mean(), 0.)
continuation_values.append(discounted_payoffs *
np.exp(-risk_free_rate * dt))
boundary_point = None
try:
idx = list(should_exercise).index(True)
boundary_point = s_t[idx, -(t + 1)]
except ValueError:
pass
exercise_boundary.insert(0,boundary_point)
option_value = sum(cval*np.exp(-risk_free_rate*(i*dt))
for i,cval in enumerate(reversed(continuation_values)))
return {'option value': float(option_value),
'exercise boundaries': exercise_boundary}
```
这段程序实现了对给定参数下的美式看跌期权价格及其对应的最优行权边界进行估计的功能。注意这里假设无股息支付,并采用了几何布朗运动作为股价变动过程的基础模型。
阅读全文