python障碍式期权定价公式

作者:王大锤95 时间:2023-12-08 03:54:53 

早期写的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)

来源:https://blog.csdn.net/qq_41239584/article/details/83269874

标签:python,期权,公式
0
投稿

猜你喜欢

  • MySQL延时复制库方法详解

    2024-01-26 14:21:51
  • 使用OpenCV校准鱼眼镜头的方法

    2022-04-02 01:58:48
  • Mootools 1.2教程(14)——定时器和哈希简介

    2008-12-08 12:50:00
  • pymongo实现控制mongodb中数字字段做加法的方法

    2021-12-15 21:04:06
  • python 基于空间相似度的K-means轨迹聚类的实现

    2022-10-24 07:29:02
  • python 中的 super详解

    2023-09-07 01:27:35
  • Pandas实现一列数据分隔为两列

    2021-01-06 04:31:36
  • 利用Python开发一个自动答题程序

    2022-12-31 10:33:16
  • Vue.js实现文章评论和回复评论功能

    2024-05-29 22:20:31
  • go语言区块链实战实现简单的区块与区块链

    2024-05-10 13:57:33
  • Golang依赖注入工具digo的使用详解

    2023-08-27 13:00:43
  • SQL Server数据库动态交叉表的参考示例

    2009-01-04 14:44:00
  • 利用python和ffmpeg 批量将其他图片转换为.yuv格式的方法

    2023-07-27 11:51:43
  • php绘制圆形的方法

    2023-10-29 17:31:52
  • Python中的两个内置模块介绍

    2023-03-29 08:10:00
  • 多次执行mysql_fetch_array()的指针归位问题探讨

    2024-01-16 00:16:16
  • pytorch中的embedding词向量的使用方法

    2022-03-25 09:05:27
  • Python OpenCV超详细讲解调整大小与图像操作的实现

    2022-07-09 21:16:27
  • 解密SQL Server数据库系统的编译

    2009-03-16 17:33:00
  • js+html5实现半透明遮罩层弹框效果

    2024-05-08 09:33:09
  • asp之家 网络编程 m.aspxhome.com