def f_sigma(x):
# 通过Python定义一个计算变量波动率的函数
# x:代表变量的样本值,可以用列表的数据结构输入
n = len(x)
u_mean = sum(x)/n #计算变量样本值的均值
z = [] #生成一个空列表
for t in range(n):
z.append((x[t]-u_mean)**2)
return (sum(z)/(n-1))**0.5# n-1 自由度
a = f_sigma(x = [1,2,3])
print('样本方差:', a)
设定参数
r=0.032 # risk-free interest rate
t=float(30)/365 # time to expire (30 days)
q=0 # dividend yield
S0=2.3 # underlying price
X=2.2 # strike price
mktprice=0.18 # market price
# 用二分法求implied volatility,暂只针对call option
sigma=0.3 # initial volatility
C=P=0
upper=1
lower=0
while abs(C-mktprice)>1e-6:
d1=(np.log(S0/X)+(r-q+sigma**2/2)*t)/(sigma*np.sqrt(t))
d2=d1-sigma*np.sqrt(t)
C=S0*np.exp(-q*t)*norm.cdf(d1)-X*np.exp(-r*t)*norm.cdf(d2)
P=X*np.exp(-r*t)*norm.cdf(-d2)-S0*np.exp(-q*t)*norm.cdf(-d1)
if C-mktprice>0:
upper=sigma
sigma=(sigma+lower)/2
else:
lower=sigma
sigma=(sigma+upper)/2
print sigma # implied volatility