13 Python总结之估值

未定权益的估值

蒙特卡洛模拟的最重要应用之一是未定权益(期权,衍生品,混合型工具等)的估值。简单地说,在风险中立的世界中,未定权益的价值是风险中立(鞅)测度下的折现后预期收益。这是所有风险因素(股票、指数等)偏离无风险短期利率的概率测度。根据资产定价基本定理,这种概率测度的存在等价于套利机会的缺失。

金融期权表示在规定(行权期)日期(欧式期权)或者规定时期(美式期权)内,以规定价格(所谓行权价 ) 购买(看涨期权 ) 或者出售(看跌期权)指定金融工具。我们首先考虑估值较为简单的情况一欧式期权。

1 欧式期权

基于某种指数的欧式看涨期权到期日收益通过公式h(ST)≡max(ST−K,0)h(ST)≡max(ST−K,0) 得出,其中 STST 是到期日 T 的指数水平,K 是行权价格。给定相关随机过程(例如 几何布朗运动)的风险中立测度,或者在一个完备市场中,这种权证的价格由下面公式表示。

公式 风险中立预期定价

在这里插入图片描述

下面公式提供了欧式期权的对应蒙特卡洛模拟公式,其中SiT~ 是到期日期的第 i 个模拟指数水平。

公式 风险中立蒙特卡洛模拟公式

在这里插入图片描述

现在考虑几何布朗运动的参数化和估值函数gbm_mcs_stat, 该函数仅以行权价格作为参数。 这里只模拟到期日的指数水平:

import numpy as np
import numpy.random as random
import matplotlib.pyplot as pltS0 = 100.
r = 0.05
sigma = 0.25
T = 1.0
I = 50000# 生成用于过程模拟的标准正态随机数
def gen_sn(M, I, anti_paths=True, mo_math=True):"""Function to generate random numbers for simulation:param M: number of time  intervals for discretization:param I: number of paths to be simulated:param anti_paths: use of antithetic variates:param mo_math: use of moment matching:return:"""if anti_paths is True:sn = random.standard_normal((M + 1, int(I / 2)))sn = np.concatenate((sn, -sn), axis=1)else:sn = random.standard_normal((M + 1, I))if mo_math is True:sn = (sn - sn.mean()) / sn.std()return sndef gbm_mcs_stat(K):"""Valuation of European call option in Black-Scholes-Mertonby Mont Carlo simulation ( of index level at maturity ):param k: float (positive) strike price of the option:return:"""sn = gen_sn(1, I)# simulate index level at maturityST = S0 * np.exp((r - 0.5 * sigma ** 2) * T + sigma * np.sqrt(T) * sn[1])# calculate payoff at maturityhT = np.maximum(ST - K, 0)# calculate MCS estimatorC0 = np.exp(-r * T) * 1 / I * np.sum(hT)return C0

作为参考 , 考虑行权价K=105的情况:

gbm_mcs_stat(K=105.)
9.934031906470926

接下来 , 我们考虑动态模拟方法 , 除了看涨期权之外还可以模拟欧式看跌期权。 函数gbm_mcs_dyna 实现了这一算法:

M = 50def gbm_mcs_dyna(K, option='call'):"""Valuation of European option in Black-Scholes-Merton by Monte Carlo simulation(of index level paths):param K: (positive)strike price of the option:param option::return:"""dt = T / M# simulation of index level pathsS = np.zeros((M + 1, I))S[0] = S0sn = gen_sn(M, I)for t in range(1, M + 1):S[t] = S[t - 1] * np.exp((r - 0.5 * sigma ** 2) * dt + sigma * np.sqrt(dt) * sn[t])# case-based calculation of payoffif option == 'call':hT = np.maximum(S[-1] - K, 0)else:hT = np.maximum(K - S[-1], 0)# calculation of MCS estimatorC0 = np.exp(-r * T) * 1 / I * np.sum(hT)return C0
12.671844318892582

现在,可以比较相同行权价的看涨和看跌期权的价格估算:

gbm_mcs_dyna(K=110.,option='call')
8.042957534549014
gbm_mcs_dyna(K=110.,option='put')
12.653996825176034

问题是,这些基于模拟的估值方法与Black-Scholes-Merton 估值公式得出的基准值相比表现如何?为了找出这种差别,我们用BSM_Flncrions.py摸块中的Black-Scholes-Metron 分析性欧式看涨期权定价公式生成一定范围行权价的对应期权价值/估值:

def bsm_call_value(S0, K, T, r, sigma):''' Valuation of European call option in BSM model.Analytical formula.Parameters==========S0 : floatinitial stock/index levelK : floatstrike priceT : floatmaturity date (in year fractions)r : floatconstant risk-free short ratesigma : floatvolatility factor in diffusion termReturns=======value : floatpresent value of the European call option'''from math import log, sqrt, expfrom scipy import statsS0 = float(S0)d1 = (log(S0 / K) + (r + 0.5 * sigma ** 2) * T) / (sigma * sqrt(T))d2 = (log(S0 / K) + (r - 0.5 * sigma ** 2) * T) / (sigma * sqrt(T))value = (S0 * stats.norm.cdf(d1, 0.0, 1.0)- K * exp(-r * T) * stats.norm.cdf(d2, 0.0, 1.0))# stats.norm.cdf --> cumulative distribution function#                    for normal distributionreturn value# Vega functionstat_res=[]
dyna_res=[]
anal_res=[]
k_list=np.arange(80.,120.1,5.)
np.random.seed(200000)
for K in k_list:stat_res.append(gbm_mcs_stat(K))dyna_res.append(gbm_mcs_dyna(K))anal_res.append(bsm_call_value(S0,K,T,r,sigma))stat_res = np.array(stat_res)
dyna_res = np.array(dyna_res)
anal_res = np.array(anal_res)# 首先,我们将静态模拟方法的结果与精确的分析值相比;
fig,(ax1,ax2)= plt.subplots(2,1,sharex=True,figsize=(8,6))
ax1.plot(k_list,anal_res,'b',label='analytical')
ax1.plot(k_list,stat_res,'ro',label='static')
ax1.set_ylabel('European call option value')
ax1.grid(True)
ax1.legend(loc=0)
ax1.set_ylim(ymin=0)
wi=1.0
ax2.bar(k_list-wi/2,(np.array(anal_res)-np.array(stat_res))/np.array(anal_res)*100,wi)
ax2.set_xlabel('strike')
ax2.set_ylabel('difference in %')
ax2.set_xlim(left=75,right=125)
ax2.grid(True)

在这里插入图片描述

合并动态模拟和估值方法的类似图表, 可以得到下图的结果。同样,所有估值差异小于1% , 标准差既有负数也有正数的情况。作为一般原则 , 蒙特卡洛估算函数的质量可以通过调整使用的时间间隔 M 和模拟路径数 I 控制。

fig,(ax1,ax2)= plt.subplots(2,1,sharex=True,figsize=(8,6))
ax1.plot(k_list,anal_res,'b',label='analytical')
ax1.plot(k_list,dyna_res,'ro',label='dynamic')
ax1.set_ylabel('European call option value')
ax1.grid(True)
ax1.legend(loc=0)
ax1.set_ylim(ymin=0)
wi=1.0
ax2.bar(k_list-wi/2,(np.array(anal_res)-np.array(dyna_res))/np.array(anal_res)*100,wi)
ax2.set_xlabel('strike')
ax2.set_ylabel('difference in %')
ax2.set_xlim(left=75,right=125)
ax2.grid(True)

在这里插入图片描述

2 美式期权

美式期权的估值比欧式期权更复杂。在这种情况下, 必须解决最优截止问题,提出期权的公允价值。下面公式是将美式期权作为最优截止问题时的估值公式。该问题的公式化已经基于离散的时间网络, 以便用于数值化模拟。 在某种意义上, 更准确地说,这是百慕大式期权的估值公式。 时间间隔收敛干0长度时, 百慕大期权的价值收敛于美式期权的价值。

公式 以最优截止问题形式出现的美式期权价格:

下面描述的算法称为最小二乘蒙特卡洛(LSM)方法。由Vt(s)=max(ht(s),Ct(s))Vt(s)=max(ht(s),Ct(s)) (其中Ct(s)=EQt(e−rΔtVt+Δt(St+Δt)|St=s)Ct(s)=EtQ(e−rΔtVt+Δt(St+Δt)|St=s) ) 给出的任何给定日期 t 的美式(百慕大)期权价值是给定指数水平 St=sSt=s 下的期权持续价值。
现在我们考虑在 M 个等长 (ΔtΔt)的时间间隔中模拟指数水平的 I 条路径。 定义 Yt,i≡e−rΔtVt+Δt,iYt,i≡e−rΔtVt+Δt,i 为路径 i 在时间 t 时的模拟持续价值。我们不能直接使用这个数字,因为它意味着完美的预期。但是,我们可以使用所有模拟持续价值的截面,通过最下二乘回归估算(预期)持续价值。

给定一组基函数 bd,d=1,…,Dbd,d=1,…,D , 然后由回归估算公式 Ct,i=∑Dd=1α∗d,t⋅bd(St,i)Ct,i=∑d=1Dαd,t∗⋅bd(St,i) 算出持续价值,其中最优回归参数 α∗α∗ 是下面公式中最小二乘法问题的解。

公式 美式期权估值的最小二乘回归:
在这里插入图片描述

gbm_mcs_amer 函数实现美式看涨和看跌期权的LSM 算法:

def gbm_mcs_amer(K, option='call'):"""Valuation of American option in Black-Scholes-Mertonby Monte Carlo simulation by LSM algorithm:param K: (positive) strike price of the option:param option: type of the option to be valued ('call','put'):return: estimated present value of American call option"""dt = T / Mdf = np.exp(-r * dt)# simulation of index levelsS = np.zeros((M + 1, I))S[0] = S0sn = gen_sn(M, I)for t in range(1, M + 1):S[t] = S[t - 1] * np.exp((r - 0.5 * sigma ** 2) * dt+ sigma * np.sqrt(dt) * sn[t])# case-based calculation of payoffif option == 'call':h = np.maximum(S - K, 0)else:h = np.maximum(K - S, 0)# LSM algorithmV = np.copy(h)for t in range(M - 1, 0, -1):reg = np.polyfit(S[t], V[t + 1] * df, 7)C = np.polyval(reg, S[t])V[t] = np.where(C > h[t], V[t + 1] * df, h[t])# MSC estimatorC0 = df * 1 / I * np.sum(V[1])return C0
gbm_mcs_amer(110.,option='call')
7.796943788560202
gbm_mcs_amer(110.,option='put')
13.660914609034444

欧式期权的价值处于美式期权价值的下界。 两者的差异通常称作提前行权溢价。 下面,我们比较和以前相同的行权价范围内的欧式和美式期权价值, 以估算期权溢价。 这次我们选择看跌期权:

euro_res = []
amer_res =[]
k_list = np.arange(80., 120.1, 5.)
for K in k_list:euro_res.append(gbm_mcs_dyna(K,'put'))amer_res.append(gbm_mcs_amer(K,'put'))
euro_res = np.array(euro_res)
amer_res = np.array(amer_res)

下图说明对于所选择的行权价范围,溢价可能最高达到10%

fig, (ax1 ,ax2) = plt.subplots(2, 1, sharex=True, figsize=(8, 6))
ax1. plot(k_list, euro_res,'b', label='European put')
ax1. plot(k_list, amer_res,'ro',label='American put')
ax1.set_ylabel('call option value')
ax1.grid(True)
ax1.legend(loc=0)
wi = 1.0
ax2.bar(k_list - wi / 2, (amer_res - euro_res) / euro_res * 100, wi)
ax2.set_xlabel('strike')
ax2.set_ylabel('early exercise premium in %')
ax2.set_xlim(left=75, right=125)
ax2.grid(True)

在这里插入图片描述

欧式期权和LSM蒙特卡洛估算值的对比

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/53975.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2023微信手机号筛选器,快速检测出开通微信的号码,检测国外号码过滤微信状态,判断qq是否开通微信软件

筛选开通微信的号码后,提升加粉效率, | 微信筛选器可以快速检测出哪些开通微信的号码,和未开通的,分开保存,微信筛选过滤,手机号检测是否开通微信,QQ开通微信检测, #微信筛选器# #微…

战地服务器名字不显示号码的电话软件,打电话显示虚拟号码的软件,教你打电话隐藏号码...

打电话不显示号码(iPhone打电话怎么设置不显示号码)我们经常会收到一些莫名其妙的号码,来自法国、美国、巴西……各个地方的陌生电话。不知道的还以为朋友去了国外给自己一个惊喜。 打电话不显示号码(iPhone打电话怎么设置不显示号码) 接到了该怎么处理?…

虚拟号码怎么开通?

虚拟码号的开通方式基本一样 一、首先是企业实名,上传企业的证明文件,法人证件。 二、然后是提出开号需求,号码数量,号码区域 三、然后缴纳费用 四、等待3-8个工作日开号 通过API或者SDK接口接入自己的系统,要不就…

chatgpt赋能python:如何关闭Python中的Figure?

如何关闭Python中的Figure? 简介 在Python中使用Matplotlib生成图形时,我们会使用到Figure对象,它是图形的容器。在一些情况下,我们可能需要手动关闭这个Figure,例如多次运行程序导致Figure叠加、或者让程序周期性的…

用户登录·验证码测试登录

实现用户界面进行验证码测试登录 具体要求是: 实现一个网页中需要两次的判断,一个判断验证码是否正确,一个登录学号与密码是否正确; 代码如下: 1.LoginController的代码 1.这里的判断语句中,如果验证码…

利用kaptcha生成登录验证码

利用kaptcha生成登录验证码 导入包 <dependency><groupId>com.github.penggle</groupId><artifactId>kaptcha</artifactId><version>2.3.2</version></dependency>由于spring没有整合kaptcha&#xff0c;自定义一个katcha的…

登录的验证码

登录的验证码样板如下&#xff1a; 代码如下&#xff1a; 前端&#xff1a; * 获取验证码 *<div class"form-group row" style"margin-right:-65px;"><div class"col-sm-9 col-xl-10 pr-0"><div class"input-group"&…

登入验证码的识别

放在前面 无深度学习无机器学习 在以前的博客中,教务系统一键查询成绩我在登入这一步,使用的腾讯文字识别的api虽然说免费用3000次,但总觉得受限于人,今天捣鼓了一天,终于用自己的方法实现了验证码识别,虽然很简陋,但是终归是实现了,哈哈. 在昨天刚了解完支持向量机,当时就想…

kaptcha 验证码技术的应用

一.背景 图形验证码的生成与使用&#xff08;防止机器恶意攻击&#xff09; 二.代码&#xff08;使用&#xff09; 1.添加Maven依赖 <!--验证码 --> <dependency><groupId>com.github.penggle</groupId><artifactId>kaptcha</artifactId&…

王田苗对话四位AI领军人物:具身智能的机遇与挑战

一个新的机器人时代已经开启&#xff0c;几位顶级AI、机器人大佬&#xff0c;如何思考具身智能&#xff1f;大模型给机器人带来了怎样的变革意义&#xff1f;人形机器人多久能进入家庭&#xff1f; 从早稻田大学1972年研发的WABOT&#xff0c;到特斯拉2022年首秀的Optimus&…

玖章算术CEO叶正盛在数据技术嘉年华分享NineData AIGC的应用实践

4月8日下午&#xff0c;为期两天的第十二届数据技术嘉年华&#xff08;DTC 2023&#xff09;在北京新云南皇冠假日酒店圆满落下帷幕。大会得到了工业和信息化部电子五所的支持和指导&#xff0c;围绕“开源融合数字化——引领数据技术发展&#xff0c;释放数据要素价值”这一主…

软件技术基础知识忏悔录C#.NET篇(一)

为何开始 人已是大三之年&#xff0c;虽是身在985&#xff0c;心里却没有半分985的底气&#xff0c;自从大二分流以来&#xff0c;自己几乎是没再系统的学过什么&#xff0c;除了几位知识还算渊博的老师教了较为详细的数据库、数据结构的知识之外&#xff0c;其他老师大抵都是迷…

聊聊简历怎么写

大家好&#xff0c;我是柠檬哥。 年初看机会、准备换工作的同学比较多&#xff0c;后台也有很多同学请教如何准备面试&#xff0c;精力有限&#xff0c;一个个回复肯定是回不过来。 关于求职面试这块的的话题有点大&#xff0c;大部分人内心OS估计是&#xff1a; 忍了一年的SX领…

程序员该如何去写自己的简历-代码而成的简历

首先&#xff0c;声明这是写给程序员看的&#xff0c;而不是码农。其次&#xff0c;如果你不幸是码农那么请成为程序员。最后&#xff0c;码农和程序员是有区别的&#xff0c;程序员应该是有思想的手工艺人&#xff0c;在这个机械高度生产化的世界里&#xff0c;人口众多的手工…

【总结】1637- 如何利用 ChatGPT 提升 JavaScript 编程能力?

最新文章&#xff1a; 【工具】1636- 高效办公&#xff01;5款腾讯免费AI工具 【工具】1634- 提高工作效率&#xff0c;这 10 款 AI 工具不能错过&#xff01; 【分享】1632- 推荐 20 款顶级 AI 聊天机器人&#xff0c;轻松畅聊未来 最近几天&#xff0c;GPT-4、ChatGPT Plugin…

可以用什么软件画流程图?看看这几款画流程图软件

我们在日常的学习和工作中&#xff0c;经常会需要制作一些流程图来帮助我们梳理工作的流程或知识点&#xff0c;帮助我们能够更好地理清思路&#xff0c;让我们可以更加顺利地完成学习和工作任务。那大家知道在线画流程图工具有哪些吗&#xff1f;还不知道的小伙伴&#xff0c;…

绘制交互流程图的方法

转载自&#xff1a;http://blog.sina.com.cn/s/blog_6b6abdc10100wpny.html 下面介绍一个设计方法&#xff0c;这是一个用于兼顾“为流程”与“为结构”的信息架构&#xff08;IA&#xff09;的设计方法。是2010年底&#xff0c;我和seven共同分析总结出来的。在广州的“2010年…

分别画出程序的软件流程图、NS图、PAD图; 程序

1、分别画出程序的软件流程图、NS图、PAD图&#xff1b; 程序 #include<stdio.h> #include<stdlib.h> int main(int argc, char *argv[]) {int Edge_a,Edge_b,Edge_c;printf("Input three int type data between space:\n");scanf("%d %d %d"…

分享一个开源的流程图绘制软件--Diagram Designer

最近在写专利文件&#xff0c;在制作说明书附图时想到自己还只会用wps进行简单的绘制&#xff0c;于是想学习下&#xff0c;填补下这方面的短板。这两天查到了DiagramDesigner这个小工具&#xff0c;派上了大用场。用它写完了一个发明专利&#xff0c;还给zigbee产品设计了一个…

交互流程图用什么软件做?

产品经理在进行产品设计等工作时&#xff0c;会使用交互流程图来提高团队效率。这种流程图适用于传达方案、评审目标等需要团队协作的场景&#xff0c;视觉设计师、产品开发等工作团队只需看图便能迅速理解图示要义&#xff0c;极大地节省了理解时间&#xff0c;有效提高沟通效…