python解zuobiaoxi方程_欧式期权定价的python实现

0. pre

在《给你的二叉树期权定价》中就挖了坑要写期权定价的代码,这会有时间来填坑啦5b8dafa1b983374e42b1b79b4d367fa0.png5b8dafa1b983374e42b1b79b4d367fa0.png
本文将会用python实现欧式期权定价。具体的定价算法分别是基于BS公式的、蒙特卡洛的以及二叉树的
对于二叉树和BS公式还不熟悉的小伙伴可以移步至往期关于二叉树期权定价和BS公式的3篇文章先熟悉一下二叉树和BS公式本身,然后再来看代码实现。当然,如果您对于理论推导部分不感兴趣也可以考虑跳过该部分直接看代码。只是这样可能理解起来稍微麻烦些bc83bf69f4d2b60f1e53bc54f822144e.png
接下来我们将先描述基于蒙特卡洛的期权定价方法,然后再分别对三种方法进行python代码的实现。

1.基于蒙特卡洛的期权定价

1.1 蒙特卡洛思想

蒙特卡洛是基于随机抽样的一种统计模拟方法。由于大数定律的成立,此方法可以用于计算一些难搞的期望的数值解或者是进行数值积分的计算。
由于在风险中性的假设下,欧式期权价格等于到期时期权价值的期望在无风险利率下的贴现。因此,这里的问题就成了如何计算时刻期权价值的期望。
由于标的资产服从的既定分布,蒙特卡洛模拟通过生成随机数的方式模拟资产价格的若干条路径,并以此得到这若干条价格路径在到期时的价格。
又由于看涨和看跌期权到期时的价值分别为和。因此我们便可以通过到期时标的资产价格计算期权价值,再由大数定律知样本量足够大时均值趋于期望而计算出时刻期权价值的期望。最后用无风险利率将该期望贴现到0时刻便得到期权价格。

1.2 蒙特卡洛期权定价的数学语言

(1) 标的资产价格服从对数正态分布
首先,资产价格服从几何布朗运动:又有伊藤引理:因此,对于来讲有:所以:
(2) 蒙特卡罗模拟步骤
1、生成若干个标准正态分布随机数。
2、将这n个标准正态分布随机数带入方程得到n个到期时的标的资产价格。
3、求这n个标的资产价格的均值得。
4、用无风险利率对贴现得0时刻的期权价格。

2. 参数初始化

import numpy as npfrom numpy.random import normalfrom scipy.stats import normclass european_option_pricing:"""
    Desc: 此类用于实现各种方式的欧式期权定价
    """def __init__(self, r, sigma, T, K, s0, call):"""
        :param r: 无风险利率
        :param sigma: 标的资产波动率
        :param T: 期权期限
        :param K: 行权价
        :param s0: 标的资产当前价格
        :param call: 是否是看涨期权
        """
        self.r = r
        self.sigma = sigma
        self.T = T
        self.K = K
        self.s0 = s0
        self.call = call

3.基于BS公式的代码实现

基于BS公式的期权定价相对简单,只需要将5个参数填入一下两个看涨和看跌的定价公式。注意:下面的代码都是类european_option_pricing下的方法,每一种方法分别对应一种期权定价算法。
def bs_formula(self):"""
    Desc: 由BS公式计算欧式期权价格
    """
    d1 = (np.log(self.s0/self.K) + (self.r + self.sigma**2 / 2) * self.T) / (self.sigma * np.sqrt(self.T))
    d2 = (np.log(self.s0/self.K) + (self.r - self.sigma**2 / 2) * self.T) / (self.sigma * np.sqrt(self.T))if self.call:
        f0 = self.s0 * norm.cdf(d1) - \
             self.K * np.exp(-self.r * self.T) * norm.cdf(d2)                      # c = s0*N(d1) - Ke^{-rT} * N(d2)else:
        f0 = self.K * np.exp(-self.r * self.T) * norm.cdf(-d2) - \
             self.s0 * norm.cdf(-d1)                                           # p = Ke^{-rT} * N(-d2) - s0 * N(-d1)return f0

4.基于蒙特卡洛的代码实现

def monte_carlo(self, log, path_num, step_num):"""
    Desc: 风险中性假设下利用蒙特卡洛方法计算欧式期权价格
    :param log: 是否根据标的资产对数来模拟路径。
        True: 假设标的资产价格服从对数正态分布[logSt ~ N(logS0 + (r-sigma^2/2)t, sigma^2 *t)]并以此计算sT。
        False: 假设标的资产价格服从几何布朗运动[ds = r*s*dt + sigma*s*dz]并以此计算sT。
    :param path_num: 蒙特卡洛生成的路径数量
    :param step_num: 每条价格路径的步数
    """# (1) 风险中性下模拟标的资产价格路径并计算到期时各路径下的价格if log:# 生成1000条价格路径
        log_sT = np.log(self.s0) + (self.r - self.sigma**2/2) * self.T + \
                 self.sigma * normal(size=path_num) * np.sqrt(self.T)
        sT = np.exp(log_sT)else:# 生成path_num条价格路径,每条路径走1000步
        sT = []for i in range(path_num):
            simu_ret = self.r * self.T/step_num + self.sigma * normal(size=step_num) * np.sqrt(self.T/step_num)     # ds/s = r * dt + sigma * dz
            cum_ret = (1 + simu_ret).prod()
            sT.append(self.s0 * cum_ret)# (2) 基于模拟的到期日标的资产价格计算期权价格if self.call:
        fT = np.array([max(0, s - self.K) for s in sT])                   # 看涨期权到期时各路径下的价格else:
        fT = np.array([max(0, self.K - s) for s in sT])                   # 看跌期权到期时各路径下的价格
    f0 = np.mean(fT * np.exp(-self.r * self.T))return f0

5.基于二叉树的代码实现

def binary_tree(self, step_num):"""
    Desc: 利用二叉树,从期权到期时的叶节点倒推地计算前面各个节点的期权价值,直到0时刻即得出期权价格。
    Note: 欧式期权只需要倒推地计算每一层各个节点期权的隐含价值但美式期权还要比较每个节点期权隐含价值与直接行权价值
          的相对大小,并最终取价值大的那一个作为该节点的期权价值。
    :param step_num:  二叉树步数
    """# (1) 计算 u, d, p, q and dt
    dt = self.T/step_num
    u = np.exp(self.sigma * np.sqrt(dt))
    d = np.exp(-self.sigma * np.sqrt(dt))
    p = (np.exp(self.r * dt) - d)/(u - d)
    q = 1 - p# (2) 构造二叉树价格路径的矩阵(n步二叉树需要一个n+1*n+1矩阵来装价格路径)
    s = np.array([[0] * (1 + step_num)] * (1 + step_num), dtype=float)for i in range(0, 1 + step_num):                           # 遍历每一步for j in range(i+1):                                   # 遍历每一步中标的资产价格的每种可能
            s[j, i] = self.s0 * u**(i-j) * d**j# (3) 构造二叉树下期权内涵价值路径的矩阵
    f = np.array([[0] * (1 + step_num)] * (1 + step_num), dtype=float)for i in range(step_num, -1, -1):# 倒推地计算期权价值if i == step_num:# 最后一步的期权价格if self.call:
                f[:, i] = [max(sT - self.K, 0) for sT in s[:, i]]else:
                f[:, i] = [max(self.K - sT, 0) for sT in s[:, i]]else:# 其他时候的期权价格(因为基于风险中性,所以第t时刻的期权价值等于t+1时刻期权价值的贴现)for j in range(i+1):
                f[j, i] = np.exp(-self.r * dt) * (p * f[j, i+1] + q * f[j+1, i+1])
    f0 = f[0, 0]return f0

6.测试比较

(1)首先,计算BS公式下的期权价格。
europe_opt_price = european_option_pricing(r=0.05, sigma=0.2, T=1, K=10, s0=10, call=True)
bs_price = europe_opt_price.bs_formula()
print('BS公式下的期权价格:', bs_price)
BS公式下的期权价格: 1.045058357218557

(2)接着,计算蒙特卡洛下的期权价格。
for num in [10, 100, 1000, 10000, 100000, 100000]:
    monte_carlo_price = europe_opt_price.monte_carlo(log=True, path_num=num, step_num=100)
    print('{}条路径下的蒙特卡洛下的期权价格:'.format(num), monte_carlo_price)10条路径下的蒙特卡洛期权定价: 1.28783643643895100条路径下的蒙特卡洛期权定价: 0.87416519605453771000条路径下的蒙特卡洛期权定价: 0.987155982802952410000条路径下的蒙特卡洛期权定价: 1.062215087666785100000条路径下的蒙特卡洛期权定价: 1.0439738276791009500000条路径下的蒙特卡洛期权定价: 1.0445916779825162

(3)最后,计算二叉树下的期权价格。
for num in [10, 50, 100, 500, 1000]:
    binary_tree_price = europe_opt_price.binary_tree(step_num=num)
    print('{}步二叉树下的期权价格:'.format(num), binary_tree_price)10步二叉树下的期权价格: 1.025340904487193750步二叉树下的期权价格: 1.041069154073265100步二叉树下的期权价格: 1.043061166224914500步二叉树下的期权价格: 1.04465851364465381000步二叉树下的期权价格: 1.0448584103764602

从上面三种方法的计算结果可知BS公式、二叉树和蒙特卡洛模拟相互间是一致的。当二叉树步数和蒙特卡洛路径数量越来越大时他们的定价结果与BS公式越接近。而这一点也是与理论预期相符的。
话说欧式搞定了,美式还会远么a9c8f93802eacecc6b434b753ec766c4.pnga9c8f93802eacecc6b434b753ec766c4.png

坑继续挖着,心情好的时候又来填609aec03ce554b9e46e3e0cc50028e80.png609aec03ce554b9e46e3e0cc50028e80.png
参考文献:《期权期货及其他衍生品》 by John Hull 

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

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

相关文章

去除标签_有效去除“狗皮膏药”标签,快学起来吧

去除商品标签向来是比较头疼一件事,有时候在去掉标签后会留下粘性残留物,它会粘上灰尘和其他脏东西,把表面变成脏兮兮的颜色,让人看着太不舒服了。其实去除标签残留粘胶并不难,可能家里就有去除它的工具哦~那今天小编就…

win10很多软件显示模糊_还在使用第三方软件?Win10可以直接显示显卡温度啦

微软刚刚开始向参与快速通道测试的用户推送Windows 10 20H1 Build 18963 版带来部分新功能和优化等。这个版本也是常规优化版本因此带来的新功能很少,但这次更新为任务管理器带来原生的显示显卡温度功能。用户打开任务管理器点击性能选项卡然后找到「独立显卡」即可…

分数怎么化成带分数_小升初数学总复习第三个基础模块:分数的认识

今天我们开始小升初数学总复习第三个基础模块的复习:分数的认识分数的认识一共分为8个知识考点。第一,分数的意义把单位“1”.平均分成若干份,表示这样的一份或者几份的数叫做分数。表示其中一份的数叫做分数单位。第二&#xff0…

active mq topic消费后删除_《我想进大厂》之MQ夺命连环11问

继之前的mysql夺命连环之后,我发现我这个标题被好多套用的,什么夺命zookeeper,夺命多线程一大堆,这一次,开始面试题系列MQ专题,消息队列作为日常常见的使用中间件,面试也是必问的点之一&#xf…

嘀嗒还是滴答_2021年顺风车车主口碑榜!滴滴、滴答、一喂顺风车成TOP3

出行平台烧钱抢用户抢司机,大家都见怪不怪了,只是近期平台为自身利益而牺牲司机的例子层出不穷,在司机刚进入平台补贴多流水多,没多久司机收入都不够交车租的,司机踩坑,全家受罪,很多司机表示自…

wampserver橙色如何变成绿色_实验室如何自建数据库和网站主页

本文首发于微信公众号:火行(ID:firegotech)实验室如何自建数据库和网站主页作者:沐倾(火行科研Club创始成员)编辑:火花(声明:本文适用于非计算机专业领域人士&#xff09…

远程连接电脑_Python黑科技:在家远程遥控公司电脑,python+微信一键连接!

有时候需要远程家里的台式机使用,因为我平时都是用 MAC 多,但是远程唤醒只能针对局域网,比较麻烦,于是我想用微信实现远程唤醒机器。准备工作本程序主要是实现远程管理 Windows10操作系统的开机和关机:在 Windows机器的…

302 found是什么意思_犯罪大师心中的恶魔答案是什么 心中的恶魔答案真相分析...

犯罪大师是今年很热门的一个破案题材的游戏,游戏中有很多匪夷所思的案件,需要玩家解答,游戏中经常更新一些突发案件,最新的突发案件是心中的恶魔是一个很不错的案件,那么到底要怎么才能找到正确的凶手呢?希…

mysql源码安装报错_mysql 的二进制和源码包 安装的报错总结

MySQL报错总结报错原因:/application/mysql-5.6.44/tmp不存在解决方法:mkdir /application/mysql-5.6.44/tmp报错原因: /application/mysql-5.6.44/存放socket 目录没有权限解决方法:chown -R mysql.mysql /application/mysql-5.6…

hao123电脑版主页_建议Lenovo用户卸载监守自盗的联想电脑管家

最近我一直很迷惑,作为一个不用笔记本电脑上xxxxhub/2048等奇妙平台的正经大学生,为什么时而会出现辣鸡页游广告弹窗?好吧,最后我耐心等待,终于在某次弹出垃圾广告的时候定位了这个进程——AdvPopForm.exe在“wprst”的…

怎么彻底重装清空电脑_电脑开不了机怎么重装系统?不用送去维修店啦!

小白系统免费的人工客服点击联系电脑无法启动的时候怎么办呢?很多朋友直接送去电脑城了,但是去一次就如同在百度上查询自己得了什么病是一样的,查一下自己不舒服就癌症了,电脑城查一下就问你卖多少钱,费时费力&#xf…

日语输入法电脑版_日语轻松入门小百科

如果你一直以来都对日语抱有强烈的兴趣,那么就赶紧跟我一起轻松入门吧~科普之一:日语五十音图什么是假名?什么是五十音图?日语的字母叫做假名,每个假名代表一个音节。假名有两种书写方式,即平假名和片假名&…

a jni error has occurred_A-08 幂函数、有理函数、代数函数

欢迎光临我的专栏《微积分学习之旅》,一起学习,共同提高。函数是微积分的基础,我们已经学习了直线函数和多项式函数,本篇中我们继续学习幂函数、有理函数和代数函数。幂函数(Power Functions)如果一个函数形…

echarts 浏览器兼容性_谷歌浏览器不再使用quot;黑名单quot; / iPhone可能放弃lightning充电口//微软中国被列为被执行人/QQ 音乐上线...

# 避免种族歧视 ,谷歌浏览器将不再使用"黑名单"6月9日报道,由于全球各地反对种族歧视的呼声高涨,谷歌决定修改Chrome浏览器中可能引发种族歧视联想的表述,包括“黑名单”、“白名单”等词。报道称,谷歌将通过…

python输出结果每5个换行_python for循环 - python基础入门(11)

文章首发微信公众号,微信搜索:猿说python在python开发中,除了前篇文章介绍的while循环还有一个for循环也经常使用,两者使用都是大同小异,for循环的使用相对于while循环更加灵活,下面我们一起来了解下具体区…

cad钣金展开插件_钣金折弯展开的计算方法汇总

提醒:点上方↑↑↑“钣金学习网”免费关注90度折弯折弯系数最简单的计算方法就属90度折弯系数经验公式:1.7倍料厚计算方法了。这个公式是怎么使用的?用在90钣金折弯加工中,一个直角弯减去1.7倍的料厚。比如:材料是1mm铁…

pcb设计实战与应用智能手机_一种针对毫米波雷达天线应用而优化设计的PCB层压板...

常见的复合材料印制电路板(PCB)其介质层大多采用玻璃纤维作为填充料,但是由于玻璃纤维特殊的编织结构,导致PCB板局部的介电常数(Dk)会发生变化。尤其是在毫米波(mmWave)频率下,较薄层压板的玻璃编织效应会更加明显,Dk的局部不均匀…

GPS 校验和 代码_Linux recovery 移除签名校验

原创作者:王锐,多年 Linux 系统、龙芯平台移植与优化研发经验,Linux Contributor、Mozillian。背景某个设备配套的刷机程序是个 Linux recovery kernel,刷机过程会先从U盘加载刷机脚本,仅在签名校验通过后才执行脚本。…