Advertisement
jtrive84

blackScholes class

Mar 16th, 2014
201
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.41 KB | None | 0 0
  1. #E:/py/scripts/finance/blackScholes.py
  2.  
  3. import matplotlib.pyplot as plt
  4. import numpy as np
  5. from pprint import pprint
  6. from scipy.stats import norm
  7.  
  8. #self.N=lambda x: norm.cdf(x)
  9. #self.dN=lambda x: norm.pdf(x)
  10.  
  11.  
  12. #add Monte Carlo pricing option
  13.  
  14.  
  15. class blackScholes:
  16.     '''class for Black-Scholes derived options and greeks'''
  17.     def __init__(self,S,K,vol,div=0,r=.025,dte=30,opt='call',dates='calendar'):
  18.         self.S=S
  19.         self.K=K
  20.         self.vol=vol
  21.         self.div=div
  22.         self.r=r
  23.         self.dte=dte
  24.         self.opt=opt
  25.         self.dates=dates
  26.         if self.dates=='calendar':
  27.             self.T=self.dte/365.0
  28.         elif self.dates=='business':
  29.             self.T=self.dte/252.0
  30.         self.d1=((((np.log(self.S)-np.log(self.K))+(self.r-self.div+
  31.                 (.5*self.vol**2))*self.T))/(self.vol*np.sqrt(self.T)))
  32.         self.d2=self.d1-(self.vol*np.sqrt(self.T))
  33.         self.dN1=norm.pdf(self.d1)
  34.         self.dN2=norm.pdf(self.d2)
  35.         if opt=="call":
  36.             self.N1=norm.cdf(self.d1)
  37.             self.N2=norm.cdf(self.d2)
  38.         elif opt=="put":
  39.             self.N1=norm.cdf(-self.d1)
  40.             self.N2=norm.cdf(-self.d2)
  41.  
  42.  
  43.     def val(self):
  44.         S,K,vol,T=self.S,self.K,self.vol,self.T
  45.         div,r=self.div,self.r
  46.         if self.opt=="call":
  47.             val=(((S*np.exp(-div*T))*(self.N1))-((K*np.exp(-r*T))*(self.N2)))
  48.         elif self.opt=="put":
  49.             val=((K*np.exp(-r*T))*(self.N2))-((S*np.exp(-div*T))*(self.N1))
  50.         return val
  51.  
  52.     def delta(self):
  53.         S,K,vol,T=self.S,self.K,self.vol,self.T
  54.         div,r=self.div,self.r
  55.         if self.opt == 'call':
  56.             delta=(np.exp(-div*T))*self.N1
  57.         elif self.opt == 'put':
  58.             delta=(-np.exp(-div*T))*self.N1
  59.         return delta
  60.  
  61.     def gamma(self):
  62.         S,K,vol,T=self.S,self.K,self.vol,self.T
  63.         div,r,d1,d2=self.div,self.r,self.d1,self.d2
  64.         gamma = ((norm.pdf(d1))/(S*vol*np.sqrt(T)))
  65.         return gamma
  66.  
  67.     def vega(self):
  68.         S,K,vol,T=self.S,self.K,self.vol,self.T
  69.         div,r,d1,d2=self.div,self.r,self.d1,self.d2
  70.         vega=(.01*((S*np.exp(-div*T))*(norm.pdf(d1))*(np.sqrt(T))))
  71.         return vega
  72.  
  73.     def adj_vega(self):
  74.         S,K,vol,T,dte=self.S,self.K,self.vol,self.T,self.dte
  75.         div,r,d1,d2=self.div,self.r,self.d1,self.d2
  76.         adj=np.sqrt(30.0/dte)
  77.         adj_vega=adj*(.01*((S*np.exp(-div*T))*(norm.pdf(d1))*(np.sqrt(T))))
  78.         return adj_vega
  79.  
  80.     def theta(self):
  81.         S,K,vol,T,dte,dN1,dN2=self.S,self.K,self.vol,self.T,self.dte,self.dN1,self.dN2
  82.         div,r,d1,d2,N1,N2=self.div,self.r,self.d1,self.d2,self.N1,self.N2
  83.         a=(div*S*np.exp(-div*T))*N1
  84.         b=-(r*K*np.exp(-r*T))*N2
  85.         cn=-((K*np.exp(-r*T))*norm.pdf(d2)*vol)
  86.         cd=(2*np.sqrt(T))
  87.         c=cn/cd
  88.         theta=(a+b+c)
  89.         if self.opt=='call':
  90.             theta=theta
  91.         if self.opt=='put':
  92.             d=theta
  93.             e=(r*K*np.exp(-r*T))
  94.             f=(div*S*np.exp(-div*T))
  95.             theta=(d+e+f)
  96.         if self.dates=='calendar':
  97.             theta=theta/365.0
  98.         elif self.dates=='business':
  99.             theta=theta/252.0
  100.         return theta
  101.  
  102.     def rho(self):
  103.         S,K,vol,T,dte,dN1,dN2=self.S,self.K,self.vol,self.T,self.dte,self.dN1,self.dN2
  104.         div,r,d1,d2,N1,N2=self.div,self.r,self.d1,self.d2,self.N1,self.N2
  105.         if self.opt=='call':
  106.             rho=(T*K*np.exp(-r*T))*N2
  107.         elif self.opt=='put':
  108.             rho=-(T*K*np.exp(-r*T))*N2
  109.         return rho/100.0
  110.  
  111.     def psi(self):
  112.         S,K,vol,T,dte,dN1,dN2=self.S,self.K,self.vol,self.T,self.dte,self.dN1,self.dN2
  113.         div,r,d1,d2,N1,N2=self.div,self.r,self.d1,self.d2,self.N1,self.N2
  114.         if self.opt=='call':
  115.             psi=-T*S*np.exp(-div*T)*N1
  116.         elif self.opt=='put':
  117.             psi=T*S*np.exp(-div*T)*N1
  118.         return psi/100.0
  119.  
  120.  
  121. #estimated parameters
  122.  
  123.     def vega_atm(self):
  124.         '''approximation of atm vega'''
  125.         S,K,vol,T,dte=self.S,self.K,self.vol,self.T,self.dte
  126.         div,r,d1,d2=self.div,self.r,self.d1,self.d2
  127.         vega_atm=(.01*S*np.sqrt(T/(2*np.pi)))
  128.         return vega_atm
  129.  
  130.     def atm_opt(self):
  131.         '''approximation for atm call or put'''
  132.         S,K,vol,T,dte=self.S,self.K,self.vol,self.T,self.dte
  133.         div,r,d1,d2=self.div,self.r,self.d1,self.d2
  134.         atm_opt=vol*(S*np.sqrt(T/(2*np.pi)))
  135.         return atm_opt
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement