期权定价实践

  • 期权定价公式
    • 迭代法
    • 代码实现

期权定价公式

期权定价通常使用BSM公式,如下所示:
C(St,K,t,T,r,σ)=StN(d1)−e−r(T−t)KN(d2)(1.1)C(S_{t}, K, t, T, r, \sigma)=S_{t} N(d_{1})-e^{-r(T-t)}KN(d_{2}) \tag{1.1} C(St​,K,t,T,r,σ)=St​N(d1​)−e−r(T−t)KN(d2​)(1.1)
其中N(d)N(d)N(d)为标准正态分布x∼N(0,1)x \sim N(0,1)x∼N(0,1)时x<dx<dx<d时的概率,如下所示:
N(d)=12π∫−∞de−12x2dx(1.2)N(d)=\frac{1}{\sqrt{2\pi}} \int^{d}_{-\infty} e^{-\frac{1}{2}x^{2}}dx \tag{1.2} N(d)=2π​1​∫−∞d​e−21​x2dx(1.2)
式中d1d_{1}d1​和d2d_{2}d2​为两个常数,定义为:
d1=log⁡StK+(r+σ22)(T−t)σT−t(1.3)d_{1}=\frac{\log \frac{S_{t}}{K} + (r+\frac{\sigma^{2}}{2})(T-t) }{\sigma \sqrt{T-t}} \tag{1.3} d1​=σT−t​logKSt​​+(r+2σ2​)(T−t)​(1.3)
d2=log⁡StK+(r−σ22)(T−t)σT−t(1.4)d_{2}=\frac{\log \frac{S_{t}}{K} + (r-\frac{\sigma ^{2}}{2})(T-t)}{\sigma \sqrt{T-t}} \tag{1.4} d2​=σT−t​logKSt​​+(r−2σ2​)(T−t)​(1.4)
上式中的符号说明如下所示:

  • C:期权价格;
  • StS_{t}St​:标的资产价格;
  • K:期权行权价格;
  • t:当前时间;
  • T:期权到期时间;
  • r:短期无风险利率;
  • σ\sigmaσ:波动率;

迭代法

我们在初始状态下,先设定σ\sigmaσ为一个随机值σ0imp\sigma ^{imp}_{0}σ0imp​,其中上标imp代表是隐含波动率,下标代表是第0步。将σ0imp\sigma ^{imp} _{0}σ0imp​代入上面的公式,就可以求出一个期权的计算值C^\hat{C}C^,其与当前市场上的期权价格CCC的差值可以用来代表我们当初随机取的σ0imp\sigma ^{imp}_{0}σ0imp​接近真实值的程度。
我们可以通过牛顿法来求解,我们首先求出∂C∂σ\frac{\partial{C}}{\partial{\sigma}}∂σ∂C​:
vega=∂C∂σ=StN′(d1))T−t(1.5)vega=\frac{\partial{C}}{\partial{\sigma}} = S_{t} N'(d_{1})) \sqrt{T-t} \tag{1.5} vega=∂σ∂C​=St​N′(d1​))T−t​(1.5)
我们可以通过迭代法来找到更好的σ\sigmaσ的值:
σn+1imp=σnimp−1vega(C^n−C)(1.6)\sigma ^{imp}_{n+1} = \sigma ^{imp}_{n} - \frac{1}{vega}(\hat{C}_{n}-C) \tag{1.6} σn+1imp​=σnimp​−vega1​(C^n​−C)(1.6)
上式中nnn代表迭代步数,C代表期权的真实价格,C^n\hat{C}_{n}C^n​为当前的计算值。

代码实现

我们首先定义期权估值的BS模型类,如下所示:

#
import math
from enum import Enum,unique
from scipy.stats import norm@unique
class DMode(Enum):D1 = 1D2 = 2class BsModel(object):def __init__(self):self.name = 'fak.option.bs_model.BsModel'@staticmethoddef calculate_C(St, K, t, T, r, sigma):'''已知波动率计算期权价格的BS公式'''d1 = BsModel.calculate_d1(St, K, t, T, r, sigma)d2 = BsModel.calculate_d2(St, K, t, T, r, sigma)nd1 = BsModel.calculate_nd(d1)nd2 = BsModel.calculate_nd(d2)return St * nd1 - math.exp(-r*(T-t)) * K * nd2@staticmethoddef calculate_vega(St, K, t, T, r, sigma):'''计算期权价格对d1的导数,即希腊字母vega的值'''d1 = BsModel.calculate_d1(St, K, t, T, r, sigma)nd1p = BsModel.calculate_ndp(d1)return St * nd1p * math.sqrt(T-t)@staticmethoddef calculate_d1(St, K, t, T, r, sigma):return BsModel.calculate_d(St, K, t, T, r, sigma, DMode.D1)@staticmethoddef calculate_d2(St, K, t, T, r, sigma):return BsModel.calculate_d(St, K, t, T, r, sigma, DMode.D2)@staticmethoddef calculate_d(St, K, t, T, r, sigma, mode):if DMode.D1 == mode:numerator = math.log(St / K)  + (r + sigma*sigma / 2.0)*(T - t)else:numerator = math.log(St / K) + (r - sigma*sigma / 2.0)*(T - t)denominator = sigma * math.sqrt(T-t)return numerator / denominator@staticmethoddef calculate_nd(x0, mu=0.0, sigma=1.0):'''计算由均值为mu,方差为sigma的正态分布下,x<=x0时的概率'''return norm.cdf(x0, loc=mu, scale=sigma)@staticmethoddef calculate_ndp(x0, mu=0.0, sigma=1.0):return norm.pdf(x0, loc=mu, scale=sigma)

代码解读如下所示:

  • 第6~9行:定义枚举类来表示BS公式中计算d1还是d2;
  • 第16~24行:根据式(1.1)(1.1)(1.1)计算给定波动率条件下期权价格;
  • 第27~33行:根据式(1.5)(1.5)(1.5)计算期权价格对波动率的导数,即希腊字母vega;
  • 第36~50行:计算BS公式中的d1和d2的值,通过mode来区分;
  • 第53~57行:计算式(1.1)(1.1)(1.1)中N(d)N(d)N(d),该项表示正态分布下值小于d的概率,需要用norm.cdf来计算;
  • 第60、61行:计算式(1.5)(1.5)(1.5)中N(d)的导数,我们用norm.pdf来计算;
    接下来,我们先假设我们知道波动率σ\sigmaσ,然后可以得到对应的期权价格CCC,然后我们随机给一个σ\sigmaσ的值,就可以计算出期权价格的计算值CtimpC^{imp}_{t}Ctimp​,接下来我们求出vega,然后根据式(1.6)(1.6)(1.6)求出新的波动率σtimp\sigma^{imp}_{t}σtimp​,循环上述过程,我们就可以求出波动率的真实值,在本例中就是我们初始时给定的波动率的值,代码如下所示:
    def startup(self):# 初始化变量St = 2100.0 # 标的资产价格K = 2200.0 # 行权价格t = 10 # 当前时间T = 30 # 到期时间r = 0.01 # 短期无风险利率sigma = 0.3 # 波动率# 假设已知波动率的情况下计算期权价格和vegaC = BsModel.calculate_C(St, K, t, T, r, sigma)vega = BsModel.calculate_vega(St, K, t, T, r, sigma)# 随机给出一个波动率,用迭代法求出波动率真值sigma_t = 1200for n in range(10000):C_t = BsModel.calculate_C(St, K, t, T, r, sigma_t)vega_t = BsModel.calculate_vega(St, K, t, T, r, sigma_t)sigma_t = sigma_t - 1/vega * (C_t - C)print('C0={0}; vega={1}; sigma={2};'.format(C_t, vega_t, sigma_t))print('真实值:C={0}; vega={1};'.format(C, vega))

运行结果如下所示:

如上图所示,我们经过1000步迭代,σ\sigmaσ从我们最初给定的随机值1200,逐步收敛到我们初始时设定的真实0.3,这正是我们想要的结果。

期权定价Python实现相关推荐

  1. 二叉树期权定价python代码_欧式和美式期权的二叉树和Greek(1)——PYTHON

    欧式和美式期权(Option)是最基础的衍生证卷.如何定价是初学金融工程者的必备知识.二叉树的又是最简单但是容易理解的工具.在网上有期权计算器可以很容易得到.但是练习自己编写还是有收益的. 欧式期权的 ...

  2. python barrier option pricing_Python王牌加速库深度学习下的障碍期权定价

    Python王牌加速库深度学习下的障碍期权定价 Python王牌加速库:深度学习下的障碍期权定价! 蒙特卡罗模拟需要数以百万计的路径来得到精确的答案,这需要大量的计算.Ryan等人得研究表明,可以训练 ...

  3. python金融工程的工具包_金融工程及其Python应用

    目 录 第1章 金融工程导论 1 1.1 金融工程的概念 2 1.2 国外现代主流金融理论发展历程 2 1.3 国内金融的发展 3 1.4 现代主流金融理论简介 4 1.4.1 投资组合理论 4 1. ...

  4. 金融工程及其python应用pdf_金融工程及其Python应用

    金融工程及其Python应用 编辑 锁定 讨论 上传视频 <金融工程及其Python应用>是2019年1月清华大学出版社出版的图书,作者是朱顺泉. 书    名 金融工程及其Python应 ...

  5. Heston SV model期权定价(基于numpy)

    Heston期权定价python代码 本篇暂未考虑w1与w2相关性,此部分后续会更新进来 ''' Heston SV option pricing-model: Follow:dSt/St = r * ...

  6. 美式期权定价python_【优质好课】Python量化期权实战应用

    优质好课 · 涨价预警 <Python量化期权实战应用>课程,在预售初期就备受关注,课程开始上线以来,内容更是受到了广大学员的一致好评. 现在,眼看着课程就快要更新完毕了,如果还没有开始学 ...

  7. python基于rsa的数字签名实现_青岛宽客聚会期权定价公式基于python的实现

    点击上方蓝字,关注宽客空间 2020年8月16日,宽客空间走进石岭资产,参加了青岛宽客聚会的活动.本次活动分享题目为<期权定价公式基于python的实现>.本次活动的主讲人是来自青岛石岭资 ...

  8. 美式期权定价python_【定价】二叉树(CRR)欧式/美式期权定价的原理及Python实现...

    二叉树一种常用的期权定价方法,相比BSM模型,这个方法适用范围更广,可以为美式期权等一些其他品种定价.该方法是保持波动率不变的条件下,将价格路径做简化,根据简化的路径做分析和计算. 本文首先介绍使用二 ...

  9. python障碍式期权定价公式

    python障碍式期权定价公式 早期写的障碍式期权的定价脚本 #coding:utf-8 ''' 障碍期权 q=x/s H = h/x H 障碍价格 [1] Down-and-in call cdi ...

  10. python学习之路:期权定价与python实现

    一.目前国际上主流的期权定价模型主要有: BSM定价模型 BAW定价模型 CRR定价模型 二叉树模型 二.模型适用,需要说明的是: 1.可以直接用BS模型计算欧式期权的理论价格. 2.BS模型对欧式期 ...

最新文章

  1. centos 5.4 x64 安装nagios 3.2.3
  2. dedecms--数据库
  3. HttpClient 教程 (二)
  4. 使用wordpress创建自己的博客
  5. mybatis中自建的类型别名
  6. 汇编 db,dw,dd
  7. 《iOS应用软件设计之道》—— 2.11 小结
  8. HTTPS请求实现框架
  9. php静态数组变量初始化,为什么数组初始化时,赋值不能是常量?
  10. Oracle命令--为数据文件缩容
  11. Java基础-----选择结构(一)
  12. 在overleaf中使用中文
  13. 人工智能搭档智能云,进入《西部世界》不是梦!
  14. Quartz简答介绍
  15. “无代码”来了,还要程序员干嘛?
  16. 基本数据结构解析之Stack Queue
  17. python定时任务启动与停止_对Python定时任务的启动和停止方法详解
  18. int类型转换byte类型
  19. java项目上线发布的流程
  20. STM32学习之红外遥控

热门文章

  1. dota2自定义地图服务器,RPG DOTA2 自定义地图制作指南——构建模型
  2. html缩放背景不缩放_缩放并不可怕。
  3. 对《小王子》英文原版进行词频统计,发现他最爱的是......
  4. php天猫列表数据抓取,天猫数据抓取方法_简易采集 - 八爪鱼采集器
  5. JDBC 连接mysql数据库出现 client does not support authen…… update mysql client
  6. 从小说网站爬取小说并写入txt文档中
  7. 计算机如何使用键盘复制粘贴,电脑复制粘贴快捷键,小编教你电脑怎么用键盘复制粘贴...
  8. Spring+Struts2+Hibernate概述
  9. ISO639等多语言列表信息
  10. SCI/ISTP和EI论文检索号IDS number和收录号查询方法,详细使用教程和指南手册