""" Name : c14_25_up_and_out_call.py Book : Python for Finance (2nd ed.) Publisher: Packt Publishing Ltd. Author : Yuxing Yan Date : 6/6/2017 email : yany@canisius.edu paulyxy@hotmail.com """ import scipy as sp from scipy import log,exp,sqrt,stats # def bsCall(S,X,T,r,sigma): d1=(log(S/X)+(r+sigma*sigma/2.)*T)/(sigma*sqrt(T)) d2 = d1-sigma*sqrt(T) return S*stats.norm.cdf(d1)-X*exp(-r*T)*stats.norm.cdf(d2) # def up_and_out_call(s0,x,T,r,sigma,n_simulation,barrier): n_steps=100. dt=T/n_steps total=0 for j in sp.arange(0, n_simulation): sT=s0 out=False for i in range(0,int(n_steps)): e=sp.random.normal() sT*=sp.exp((r-0.5*sigma*sigma)*dt+sigma*e*sp.sqrt(dt)) if sT>barrier: out=True if out==False: total+=bsCall(s0,x,T,r,sigma) return total/n_simulation # s0=30. # today stock price x=30. # exercise price barrier=32 # barrier level T=6./12. # maturity in years r=0.05 # risk-free rate sigma=0.2 # volatility (annualized) n_simulation=100 # number of simulations sp.random.seed(12) # fix a seed # result=up_and_out_call(s0,x,T,r,sigma,n_simulation,barrier) print('up-and-out-call = ', round(result,3))