#-*-coding:utf-8 -*-
import math
import numpy as np
def European_option_value(S0, K, T, r, q, sigma, otype, M=50):
'''
参数基本含义
==========
S0 : 标的物在0时点的价格
K : 期权执行价格
T : 期权期限
r : 无风险利率
q : 标的物股息率
sigma : 标的物波动率
otype : 表示 'call' or 'put'
M : 表示二叉树步数
'''
# 生成二叉树
dt = T / M # 表示每步的时间长度
df = math.exp(-r * dt) # 每个时间区间的折现率
u = math.exp(sigma * math.sqrt(dt)) # 标的物向上的幅度
d = 1 / u # 标的物向下的幅度
q = (math.exp((r-q) * dt) - d) / (u - d) # 标的物价格每步向上的概率
# 初始化幂矩阵
mu = np.arange(M + 1)
mu = np.resize(mu, (M + 1, M + 1))
md = np.transpose(mu)
mu = u ** (mu - md)
md = d ** md
#得到各节点的股票价格
S = S0 * mu * md
# 得到叶子结点的期权价值
if otype == 'call':
V = np.maximum(S - K, 0) # 欧式看涨期权内在价值
else:
V = np.maximum(K - S, 0) # 欧式看跌期权内在价值
#逐步向前加权平均并折现,得到期初期权价值
for z in range(0, M): # 从后向前滚动计算
#逐列更新期权价值,相当于二叉树中的逐层向前折算
V[0:M - z, M - z - 1] = (q * V[0:M - z, M - z] +
(1 - q) * V[1:M - z + 1, M - z]) * df
return V[0, 0]
#调用函数
European_option_value(50, 55, 2, 0.04, 0.01,0.25, 'call', M=80) #6.158715906058669
European_option_value(50, 55, 2, 0.04, 0.01,0.25, 'put', M=80) #7.920181291985709
task.rar_partjh5_二叉树_期权定价_美式期权 python_美式看涨
版权申诉
5星 · 超过95%的资源 131 浏览量
2022-07-14
19:53:03
上传
评论 4
收藏 3KB RAR 举报
钱亚锋
- 粉丝: 86
- 资源: 1万+
评论14