为什么雪球期权的delta为delta[i] = norm.cdf((np.log(S[i + 1] / K) + (r + 0.5 * sigma ** 2) * dt) / (sigma * np.sqrt(dt)))
时间: 2023-10-29 07:05:51 浏览: 39
在雪球期权中,Delta是衡量期权价格变动与标的资产价格变动之间关系的指标。Delta的计算方法如下:假设标的资产价格从S到S+dS变动,期权价格从V到V+dV变动,那么Delta等于dV/dS。
根据Black-Scholes模型,期权价格V是标的资产价格S、行权价K、无风险利率r、波动率sigma和时间t的函数,即V = f(S, K, r, sigma, t)。对该函数关于S求导,即可得到Delta的计算方法。
根据公式,Delta[i] = dV/dS = N(d1),其中d1=(ln(S[i]/K)+(r+0.5*sigma^2)T)/(sigma*sqrt(T)),N表示标准正态分布的累积分布函数。
在这个公式中,d1的分子表示标的资产价格变化所带来的收益率,分母表示波动率对于标的资产价格变化的影响。N(d1)表示标的资产价格变动对期权价格变动的敏感程度,即Delta。
因此,雪球期权的Delta公式为delta[i] = norm.cdf((np.log(S[i + 1] / K) + (r + 0.5 * sigma ** 2) * dt) / (sigma * np.sqrt(dt))),其中norm.cdf表示标准正态分布的累积分布函数。
相关问题
如何将下面的代码写成一个class:def oprobit(theta): beta=theta[0] BX = x*beta mu1=theta[1] mu2=theta[2] mu3=theta[3] mu4=theta[4] output=np.copy(y) part0=(np.log(stats.norm.cdf(mu1-BX[y==0])-stats.norm.cdf(-np.inf-BX[y==0]))) part1=(np.log(stats.norm.cdf(mu2-BX[y==1])-stats.norm.cdf(mu1-BX[y==1]))) part2=(np.log(stats.norm.cdf(mu3-BX[y==2])-stats.norm.cdf(mu2-BX[y==2]))) part3=(np.log(stats.norm.cdf(mu4-BX[y==3])-stats.norm.cdf(mu3-BX[y==3]))) part4=(np.log(stats.norm.cdf(np.inf-BX[y==4])-stats.norm.cdf(mu4-BX[y==4]))) return -(part0.sum()+part1.sum()+part2.sum()+part3.sum()+part4.sum()) minimize(oprobit, x0=np.array([0.8,4,5,6,7]))
可以将代码写成如下的class:
```python
import numpy as np
from scipy import stats
from scipy.optimize import minimize
class Oprobit:
def __init__(self, x, y):
self.x = x
self.y = y
def __call__(self, theta):
beta = theta[0]
BX = self.x * beta
mu1 = theta[1]
mu2 = theta[2]
mu3 = theta[3]
mu4 = theta[4]
output = np.copy(self.y)
part0 = (np.log(stats.norm.cdf(mu1 - BX[self.y == 0]) - stats.norm.cdf(-np.inf - BX[self.y == 0])))
part1 = (np.log(stats.norm.cdf(mu2 - BX[self.y == 1]) - stats.norm.cdf(mu1 - BX[self.y == 1])))
part2 = (np.log(stats.norm.cdf(mu3 - BX[self.y == 2]) - stats.norm.cdf(mu2 - BX[self.y == 2])))
part3 = (np.log(stats.norm.cdf(mu4 - BX[self.y == 3]) - stats.norm.cdf(mu3 - BX[self.y == 3])))
part4 = (np.log(stats.norm.cdf(np.inf - BX[self.y == 4]) - stats.norm.cdf(mu4 - BX[self.y == 4])))
return -(part0.sum() + part1.sum() + part2.sum() + part3.sum() + part4.sum())
```
然后可以通过如下方式调用:
```python
model = Oprobit(x, y)
result = minimize(model, x0=np.array([0.8, 4, 5, 6, 7]))
```
优化这段代码:def oprobit(theta): beta=theta[0] BX = x*beta mu1=theta[1] mu2=theta[2] mu3=theta[3] mu4=theta[4] output=np.copy(y) part0=(np.log(stats.norm.cdf(mu1-BX[y==0])-stats.norm.cdf(-np.inf-BX[y==0]))) part1=(np.log(stats.norm.cdf(mu2-BX[y==1])-stats.norm.cdf(mu1-BX[y==1]))) part2=(np.log(stats.norm.cdf(mu3-BX[y==2])-stats.norm.cdf(mu2-BX[y==2]))) part3=(np.log(stats.norm.cdf(mu4-BX[y==3])-stats.norm.cdf(mu3-BX[y==3]))) part4=(np.log(stats.norm.cdf(np.inf-BX[y==4])-stats.norm.cdf(mu4-BX[y==4]))) return -(part0.sum()+part1.sum()+part2.sum()+part3.sum()+part4.sum())
可以尝试使用向量化计算,减少循环和重复计算。具体地,可以将 `part0`, `part1`, `part2`, `part3`, `part4` 的计算用向量表示,如下所示:
```
cdfs = stats.norm.cdf(np.array([mu1, mu2, mu3, mu4, np.inf]) - BX)
part0 = np.log(cdfs[0, y == 0] - stats.norm.cdf(-np.inf - BX[y == 0]))
part1 = np.log(cdfs[1, y == 1] - cdfs[0, y == 1])
part2 = np.log(cdfs[2, y == 2] - cdfs[1, y == 2])
part3 = np.log(cdfs[3, y == 3] - cdfs[2, y == 3])
part4 = np.log(stats.norm.cdf(np.inf - BX[y == 4]) - cdfs[3, y == 4])
```
其中,`cdfs` 是一个 $5 \times n$ 的数组,第 $i$ 行表示 $N(\mu_i, 1)$ 的累积分布函数值,$n$ 是样本数量。这样,代码的运行速度将得到显著提升。