Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #E:/py/scripts/finance/blackScholes.py
- import matplotlib.pyplot as plt
- import numpy as np
- from pprint import pprint
- from scipy.stats import norm
- #self.N=lambda x: norm.cdf(x)
- #self.dN=lambda x: norm.pdf(x)
- #add Monte Carlo pricing option
- class blackScholes:
- '''class for Black-Scholes derived options and greeks'''
- def __init__(self,S,K,vol,div=0,r=.025,dte=30,opt='call',dates='calendar'):
- self.S=S
- self.K=K
- self.vol=vol
- self.div=div
- self.r=r
- self.dte=dte
- self.opt=opt
- self.dates=dates
- if self.dates=='calendar':
- self.T=self.dte/365.0
- elif self.dates=='business':
- self.T=self.dte/252.0
- self.d1=((((np.log(self.S)-np.log(self.K))+(self.r-self.div+
- (.5*self.vol**2))*self.T))/(self.vol*np.sqrt(self.T)))
- self.d2=self.d1-(self.vol*np.sqrt(self.T))
- self.dN1=norm.pdf(self.d1)
- self.dN2=norm.pdf(self.d2)
- if opt=="call":
- self.N1=norm.cdf(self.d1)
- self.N2=norm.cdf(self.d2)
- elif opt=="put":
- self.N1=norm.cdf(-self.d1)
- self.N2=norm.cdf(-self.d2)
- def val(self):
- S,K,vol,T=self.S,self.K,self.vol,self.T
- div,r=self.div,self.r
- if self.opt=="call":
- val=(((S*np.exp(-div*T))*(self.N1))-((K*np.exp(-r*T))*(self.N2)))
- elif self.opt=="put":
- val=((K*np.exp(-r*T))*(self.N2))-((S*np.exp(-div*T))*(self.N1))
- return val
- def delta(self):
- S,K,vol,T=self.S,self.K,self.vol,self.T
- div,r=self.div,self.r
- if self.opt == 'call':
- delta=(np.exp(-div*T))*self.N1
- elif self.opt == 'put':
- delta=(-np.exp(-div*T))*self.N1
- return delta
- def gamma(self):
- S,K,vol,T=self.S,self.K,self.vol,self.T
- div,r,d1,d2=self.div,self.r,self.d1,self.d2
- gamma = ((norm.pdf(d1))/(S*vol*np.sqrt(T)))
- return gamma
- def vega(self):
- S,K,vol,T=self.S,self.K,self.vol,self.T
- div,r,d1,d2=self.div,self.r,self.d1,self.d2
- vega=(.01*((S*np.exp(-div*T))*(norm.pdf(d1))*(np.sqrt(T))))
- return vega
- def adj_vega(self):
- S,K,vol,T,dte=self.S,self.K,self.vol,self.T,self.dte
- div,r,d1,d2=self.div,self.r,self.d1,self.d2
- adj=np.sqrt(30.0/dte)
- adj_vega=adj*(.01*((S*np.exp(-div*T))*(norm.pdf(d1))*(np.sqrt(T))))
- return adj_vega
- def theta(self):
- S,K,vol,T,dte,dN1,dN2=self.S,self.K,self.vol,self.T,self.dte,self.dN1,self.dN2
- div,r,d1,d2,N1,N2=self.div,self.r,self.d1,self.d2,self.N1,self.N2
- a=(div*S*np.exp(-div*T))*N1
- b=-(r*K*np.exp(-r*T))*N2
- cn=-((K*np.exp(-r*T))*norm.pdf(d2)*vol)
- cd=(2*np.sqrt(T))
- c=cn/cd
- theta=(a+b+c)
- if self.opt=='call':
- theta=theta
- if self.opt=='put':
- d=theta
- e=(r*K*np.exp(-r*T))
- f=(div*S*np.exp(-div*T))
- theta=(d+e+f)
- if self.dates=='calendar':
- theta=theta/365.0
- elif self.dates=='business':
- theta=theta/252.0
- return theta
- def rho(self):
- S,K,vol,T,dte,dN1,dN2=self.S,self.K,self.vol,self.T,self.dte,self.dN1,self.dN2
- div,r,d1,d2,N1,N2=self.div,self.r,self.d1,self.d2,self.N1,self.N2
- if self.opt=='call':
- rho=(T*K*np.exp(-r*T))*N2
- elif self.opt=='put':
- rho=-(T*K*np.exp(-r*T))*N2
- return rho/100.0
- def psi(self):
- S,K,vol,T,dte,dN1,dN2=self.S,self.K,self.vol,self.T,self.dte,self.dN1,self.dN2
- div,r,d1,d2,N1,N2=self.div,self.r,self.d1,self.d2,self.N1,self.N2
- if self.opt=='call':
- psi=-T*S*np.exp(-div*T)*N1
- elif self.opt=='put':
- psi=T*S*np.exp(-div*T)*N1
- return psi/100.0
- #estimated parameters
- def vega_atm(self):
- '''approximation of atm vega'''
- S,K,vol,T,dte=self.S,self.K,self.vol,self.T,self.dte
- div,r,d1,d2=self.div,self.r,self.d1,self.d2
- vega_atm=(.01*S*np.sqrt(T/(2*np.pi)))
- return vega_atm
- def atm_opt(self):
- '''approximation for atm call or put'''
- S,K,vol,T,dte=self.S,self.K,self.vol,self.T,self.dte
- div,r,d1,d2=self.div,self.r,self.d1,self.d2
- atm_opt=vol*(S*np.sqrt(T/(2*np.pi)))
- return atm_opt
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement