您好,登錄后才能下訂單哦!
早期寫(xiě)的python障礙式期權(quán)的定價(jià)腳本,供大家參考,具體內(nèi)容如下
#coding:utf-8 ''' 障礙期權(quán) q=x/s H = h/x H 障礙價(jià)格 [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\\'): #獲取數(shù)據(jù)N=1當(dāng)天數(shù)據(jù) datas = pd.read_csv(path+eval(code)+'.csv',encoding='gbk',skiprows=2,header=None,skipfooter=N,engine='python').dropna() #讀取CSV文件 名稱為股票代碼 解gbk skiprows跳過(guò)前兩行文字 第一行不做為表頭 date_c = datas.iloc[:,[0,4,5]] #只用第0 列代碼數(shù)據(jù)和第4列收盤(pán)價(jià)數(shù)據(jù) 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)
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持億速云。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。