python障碍式期权定价公式
人气:0早期写的python障碍式期权的定价脚本,供大家参考,具体内容如下
#coding:utf-8 ''' 障碍期权 q=x/s H = h/x H 障碍价格 [1] Down-and-in call cdi [2] Up-and-in call cui [3] Down-and-in put pdi [4] Up-and-in put pui [5] Down-and-out call cdo [6] Up-and-out call cuo [7] Down-and-out put pdo [8] Up-and-out put puo ''' from math import log,sqrt,exp,ceil from scipy import stats import datetime import tushare as ts import pandas as pd import numpy as np import random import time as timess import os def get_codes(path='D:\\code\\20180313.xlsx'): #从代码表格从获取代码 codes = pd.read_excel(path) codes = codes.iloc[:,1] return codes def get_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文件 名称为股票代码 解gbk skiprows跳过前两行文字 第一行不做为表头 date_c = datas.iloc[:,[0,4,5]] #只用第0 列代码数据和第4列收盘价数据 date_c.index = datas[0] return date_c def get_sigma(close,std_th): x_i = np.log(close/close.shift(1)).dropna() sigma = x_i.rolling(window=std_th).std().dropna()*sqrt(244) return sigma def get_mu(sigma,r): mu = (r-pow(sigma,2)/2)/pow(sigma,2) return mu def get_lambda(mu,r,sigma): lam = sqrt(mu*mu+2*r/pow(sigma,2)) return lam def x_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) return x1,x2,y1,y2,z def get_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)) return f1,f2,f3,f4,f5,f6 def main(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 for i in range(len(codes)): sdbs = [] for j in typeflag: 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) if j=='cdi': sdb = f1-f2+f4+f5 if j=='cui': sdb = f2-f3+f4+f5 if j=='pdi': sdb = f1+f5 if j=='pui': sdb = f3+f5 if j=='cdo': sdb = f2+f6-f4 if j=='cuo': sdb = f1-f2+f3-f4+f6 if j=='pdo': sdb = f6 if j=='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)
您可能感兴趣的文章:
加载全部内容