import numpy as np
import pandas as pd
from scipy.stats import norm
from scipy import interpolate
from math import log, sqrt, exp
from scipy.optimize import brentq
import matplotlib.pylab as plt
import datetime as dt
from scipy.optimize import minimize
def BlackScholesCall(S, K, r, sigma, T):
d1 = (np.log(S/K)+(r+sigma**2/2)*T) / (sigma*np.sqrt(T))
d2 = d1 - sigma*np.sqrt(T)
return S*norm.cdf(d1) - K*np.exp(-r*T)*norm.cdf(d2)
def impliedCallVolatility(S, K, r, price, T):
impliedVol = brentq(lambda x: price -
BlackScholesCall(S, K, r, x, T),
1e-6, 1)
return impliedVol
def BlackScholesPut(S, K, r, sigma, T):
d1 = (np.log(S/K)+(r+sigma**2/2)*T) / (sigma*np.sqrt(T))
d2 = d1 - sigma*np.sqrt(T)
return K*np.exp(-r*T)*norm.cdf(-d2)-S*norm.cdf(-d1)
def impliedPutVolatility(S, K, r, price, T):
impliedVol = brentq(lambda x: price -
BlackScholesPut(S, K, r, x, T),
1e-6, 1)
return impliedVol
#Displaced-diffusion model
def black76Call(F,K,r,sigma,T):
d1 = (np.log(F/K)+(r+sigma**2/2)*T) / (sigma*np.sqrt(T))
d2 = d1 - sigma*np.sqrt(T)
return exp(-r*T)*(F*norm.cdf(d1) - K*norm.cdf(d2))
#Displaced-diffusion model
def black76Put(F,K,r,sigma,T):
d1 = (np.log(F/K)+(r+sigma**2/2)*T) / (sigma*np.sqrt(T))
d2 = d1 - sigma*np.sqrt(T)
return exp(-r*T)*(K*norm.cdf(-d2)-F*norm.cdf(-d1))
def DisplacedDiffusionCall(F0,K,r,sigma,T,beta):
F=F0/beta
K=K+(1-beta)/beta*F0
sigma=beta*sigma
return black76Call(F,K,r,sigma,T)
def DisplacedDiffusionPut(F0,K,r,sigma,T,beta):
F=F0/beta
K=K+(1-beta)/beta*F0
sigma=beta*sigma
return black76Put(F,K,r,sigma,T)
def sabrcalibration(x, strikes, vols, F, T):
err = 0.0
for i, vol in enumerate(vols):
err += (vol - SABR(F, strikes[i], T,
x[0], 0.8, x[1], x[2]))**2
return err
def SABR(F, K, T, alpha, beta, rho, nu):
X = K
if F == K:
numer1 = (((1 - beta)**2)/24)*alpha*alpha/(F**(2 - 2*beta))
numer2 = 0.25*rho*beta*nu*alpha/(F**(1 - beta))
numer3 = ((2 - 3*rho*rho)/24)*nu*nu
VolAtm = alpha*(1 + (numer1 + numer2 + numer3)*T)/(F**(1-beta))
sabrsigma = VolAtm
else:
z = (nu/alpha)*((F*X)**(0.5*(1-beta)))*np.log(F/X)
zhi = np.log((((1 - 2*rho*z + z*z)**0.5) + z - rho)/(1 - rho))
numer1 = (((1 - beta)**2)/24)*((alpha*alpha)/((F*X)**(1 - beta)))
numer2 = 0.25*rho*beta*nu*alpha/((F*X)**((1 - beta)/2))
numer3 = ((2 - 3*rho*rho)/24)*nu*nu
numer = alpha*(1 + (numer1 + numer2 + numer3)*T)*z
denom1 = ((1 - beta)**2/24)*(np.log(F/X))**2
denom2 = (((1 - beta)**4)/1920)*((np.log(F/X))**4)
denom = ((F*X)**((1 - beta)/2))*(1 + denom1 + denom2)*zhi
sabrsigma = numer/denom
return sabrsigma
option valuation function
最新推荐文章于 2022-11-05 12:19:07 发布