#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)
本文介绍了一种基于数学统计的方法来计算不同类型障碍期权的价格。利用历史数据计算波动率,并通过精确的数学公式确定各种障碍期权(如Down-and-In、Up-and-Out等)的理论价值。

被折叠的 条评论
为什么被折叠?



