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)
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。