#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)