python障碍式期权定价公式
早期写的python障碍式期权的定价脚本,供大家参考,具体内容如下
#coding:utf-8 ''' 障碍期权 q=x/s H=h/xH障碍价格 [1]Down-and-incallcdi [2]Up-and-incallcui [3]Down-and-inputpdi [4]Up-and-inputpui [5]Down-and-outcallcdo [6]Up-and-outcallcuo [7]Down-and-outputpdo [8]Up-and-outputpuo ''' frommathimportlog,sqrt,exp,ceil fromscipyimportstats importdatetime importtushareasts importpandasaspd importnumpyasnp importrandom importtimeastimess importos defget_codes(path='D:\\code\\20180313.xlsx'):#从代码表格从获取代码 codes=pd.read_excel(path) codes=codes.iloc[:,1] returncodes defget_datas(code,N=1,path='D:\\data\\'):#获取数据N=1当天数据 datas=pd.read_csv(path+eval(code)+'.csv',encoding='gbk',skiprows=2,header=None,skipfooter=N,engine='python').dropna()#读取CSV文件名称为股票代码解gbkskiprows跳过前两行文字第一行不做为表头 date_c=datas.iloc[:,[0,4,5]]#只用第0列代码数据和第4列收盘价数据 date_c.index=datas[0] returndate_c defget_sigma(close,std_th): x_i=np.log(close/close.shift(1)).dropna() sigma=x_i.rolling(window=std_th).std().dropna()*sqrt(244) returnsigma defget_mu(sigma,r): mu=(r-pow(sigma,2)/2)/pow(sigma,2) returnmu defget_lambda(mu,r,sigma): lam=sqrt(mu*mu+2*r/pow(sigma,2)) returnlam defx_y(sigma,T,mu,H,lam,q=1): x1=log(1/q)/(sigma*sqrt(T))+(1+mu)*sigma*sqrt(T) x2=log(1/(q*H))/(sigma*sqrt(T))+(1+mu)*sigma*sqrt(T) y1=log(H*H/q)/(sigma*sqrt(T))+(1+mu)*sigma*sqrt(T) y2=log(q*H)/(sigma*sqrt(T))+(1+mu)*sigma*sqrt(T) z=log(q*H)/(sigma*sqrt(T))+lam*sigma*sqrt(T) returnx1,x2,y1,y2,z defget_standardBarrier(eta,phi,mu,sigma,r,T,H,lam,x1,x2,y1,y2,z,q=1): f1=phi*1*stats.norm.cdf(phi*x1,0.0,1.0)-phi*q*exp(-r*T)*stats.norm.cdf(phi*x1-phi*sigma*sqrt(T),0.0,1.0) f2=phi*1*stats.norm.cdf(phi*x2,0.0,1.0)-phi*q*exp(-r*T)*stats.norm.cdf(phi*x2-phi*sigma*sqrt(T),0.0,1.0) f3=phi*1*pow(H*q,2*(mu+1))*stats.norm.cdf(eta*y1,0.0,1.0)-phi*q*exp(-r*T)*pow(H*q,2*mu)*stats.norm.cdf(eta*y1-eta*sigma*sqrt(T),0.0,1.0) f4=phi*1*pow(H*q,2*(mu+1))*stats.norm.cdf(eta*y2,0.0,1.0)-phi*q*exp(-r*T)*pow(H*q,2*mu)*stats.norm.cdf(eta*y2-eta*sigma*sqrt(T),0.0,1.0) f5=(H-1)*exp(-r*T)*(stats.norm.cdf(eta*x2-eta*sigma*sqrt(T),0.0,1.0)-pow(H*q,2*mu)*stats.norm.cdf(eta*y2-eta*sigma*sqrt(T),0.0,1.0)) f6=(H-1)*(pow(H*q,(mu+lam))*stats.norm.cdf(eta*z,0.0,1.0)+pow(H*q,(mu-lam))*stats.norm.cdf(eta*z-2*eta*lam*sigma*sqrt(T),0.0,1.0)) returnf1,f2,f3,f4,f5,f6 defmain(param,t,r=0.065): typeflag=['cdi','cdo','cui','cuo','pdi','pdo','pui','puo'] r=log(1+r) T=t/365 codes=get_codes() H=1.2 foriinrange(len(codes)): sdbs=[] forjintypeflag: code=codes.iloc[i] datas=get_datas(code) close=datas[4] sigma=get_sigma(close,40)[-1] mu=get_mu(sigma,r) lam=get_lambda(mu,r,sigma) x1,x2,y1,y2,z=x_y(sigma,T,mu,H,lam) eta=param[j]['eta'] phi=param[j]['phi'] f1,f2,f3,f4,f5,f6=get_standardBarrier(eta,phi,mu,sigma,r,T,H,lam,x1,x2,y1,y2,z) ifj=='cdi': sdb=f1-f2+f4+f5 ifj=='cui': sdb=f2-f3+f4+f5 ifj=='pdi': sdb=f1+f5 ifj=='pui': sdb=f3+f5 ifj=='cdo': sdb=f2+f6-f4 ifj=='cuo': sdb=f1-f2+f3-f4+f6 ifj=='pdo': sdb=f6 ifj=='puo': sdb=f1-f3+f6 sdbs.append(sdb) print(T,r,sigma,H,sdbs) if__name__=='__main__': param={'cdi':{'eta':1,'phi':1},'cdo':{'eta':1,'phi':1},'cui':{'eta':-1,'phi':1},'cuo':{'eta':-1,'phi':1}, 'pdi':{'eta':1,'phi':-1},'pdo':{'eta':1,'phi':-1},'pui':{'eta':-1,'phi':-1},'puo':{'eta':-1,'phi':-1}} t=30 main(param,t)
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。