1、函数实现:binomial_european_option_price函数基于二叉树模型计算欧式期权的价格,其中:
二叉树构建:通过上涨因子 u = e^(σ√Δt) 和下跌因子 d = 1/u 模拟标的资产价格路径。
风险中性概率:p = (e^(rΔt) - d)/(u - d),用于计算未来现金流的期望值。
折现因子:df = e^(-rΔt),将未来价值折现到当前。
初始化到期价值:计算到期时所有可能价格路径的期权内在价值。
逆向推导:从到期日倒推,逐层计算每个节点的折现期望价值,最终得到当前期权价格。
2、输入参数:
S:标的资产当前价格。
K:行权价。
T_days:剩余到期天数(自动转换为年。本代码中使用的是自然日)。
sigma:年化波动率(例如0.2代表20%)。
r:无风险利率(例如0.05代表5%)。
3、注意事项:
n_steps步数越多结果越精确(但计算量增大)。
n_steps 较大时结果会收敛到Black-Scholes模型的解。
import math
def binomial_european_option_price(S, K, T_days, sigma, r, n_steps=100):
"""
使用二叉树模型计算欧式期权的认购和认沽价格
输入参数:
S: 标的价格
K: 行权价
T_days: 剩余到期天数
sigma: 年化波动率
r: 无风险利率(年化)
n_steps: 二叉树步数(默认100)
返回:
C: 认购期权价格
P: 认沽期权价格
"""
T = T_days / 365.0
if T <= 0:
return (max(S-K, 0.0), max(K-S, 0.0))
dt = T / n_steps
u = math.exp(sigma * math.sqrt(dt))
d = 1 / u
p_raw = (math.exp(r * dt) - d) / (u - d)
p = max(0.0, min(1.0, p_raw))
df = math.exp(-r * dt)
# 初始化价值数组
call = [0.0] * (n_steps + 1)
put = [0.0] * (n_steps + 1)
# 计算到期价值
for j in range(n_steps + 1):
ST = S * (u ** (n_steps - j)) * (d ** j)
call[j] = max(ST - K, 0.0)
put[j] = max(K - ST, 0.0)
# 逆向推导
for m in range(n_steps, 0, -1):
for j in range(m):
call[j] = (p * call[j] + (1-p) * call[j+1]) * df
put[j] = (p * put[j] + (1-p) * put[j+1]) * df
return (call[0], put[0])
# 示例使用
if __name__ == "__main__":
S = 100.0 # 标的价格
K = 100.0 # 行权价
T_days = 30 # 剩余到期天数
sigma = 0.2 # 波动率
r = 0.05 # 无风险利率
C, P = binomial_european_option_price(S, K, T_days, sigma, r)
print(f"认购期权价格: {C:.4f}")
print(f"认沽期权价格: {P:.4f}")