模型一:Black-Scholes-Merton模型

最近在学习Frm课程,发现有很多模型可以用python实现出来,于是查阅了一些资料,准备将相关内容用python实现。复现的第一个模型就是大名鼎鼎的期权定价模型——BSM模型。

一、期权定价公式

1. 欧式看涨期权

C = S 0 N ( d 1 ) − X e − r T N ( d 2 ) C=S_0N(d_1)-Xe^{-rT}N(d_2) C=S0​N(d1​)−Xe−rTN(d2​)

其中 S 0 S_0 S0​表示标的资产价格,X表示标的资产行权价,r表示连续复利的无风险利率, σ \sigma σ表示股票回报率的年度波动率。 N ( d 1 ) N ( d 2 ) N(d_1)N(d_2) N(d1​)N(d2​)表示累积正态概率。

d 1 , d 2 d_1,d_2 d1​,d2​的计算公式如下:
d 1 = ln ⁡ S 0 X + ( r + σ 2 2 ) T σ T d_1=\frac{\ln{\frac{S_0}{X}}+(r+\frac{\sigma^2}{2})T}{\sigma\sqrt{T}} d1​=σT ​lnXS0​​+(r+2σ2​)T​
d 2 = d 1 − σ T d_2=d_1-\sigma\sqrt{T} d2​=d1​−σT ​

代码实现

# BSM Option Valuation FRM1B4
# Black-Scholes-Merton (1973) European Call & Put Valuation
import math
from scipy import stats# Valuation on European Call Option
def BSM_call_value(S,X,T,r,sigma):'''Parameters:S: underlying price, floatX: strike price, floatT: maturity date, floatr: risk-free rate, floatsigma: volatility, floatReturns:Value: present value of the European call option, float'''d1 = (math.log(S/X) + (r + 0.5 * sigma ** 2) * T) / (sigma * math.sqrt(T))d2 = d1 - sigma * math.sqrt(T)value = (S * stats.norm.cdf(d1, 0, 1) - X * exp(-r * T) * stats.norm.cdf(d2, 0, 1))return value

2. 欧式看跌期权

已知欧式看涨期权,计算欧式看跌期权时也可以用买卖权平价公式(Put-Call Parity)。这里为了更好地理解BSM模型,所以仍然采用BSM模型来计算看跌期权的公式。
P = X e − r T N ( − d 2 ) − S 0 N ( − d 1 ) P=Xe^{-rT}N(-d_2)-S_0N(-d_1) P=Xe−rTN(−d2​)−S0​N(−d1​)
这里字母的含义和看涨期权相同。

代码实现

# Valuation on European Put Option
def BSM_put_value(S,X,T,r,sigma):'''Parameters:S: underlying price, floatX: strike price, floatT: maturity date, floatr: risk-free rate, floatsigma: volatility, floatReturns:Value: present value of the European put option, float'''d1 = (math.log(S/X) + (r + 0.5 * sigma ** 2) * T) / (sigma * math.sqrt(T))d2 = d1 - sigma * math.sqrt(T)value = (X * exp(-r * T) * stats.norm.cdf(-d2, 0, 1) - S * stats.norm.cdf(-d1, 0, 1))return value

二、BSM公式中的变量

此处frm教材中未涉及,参考《衍生工具与风险管理》(第七版)一书,Don M.Chance, Robert Brooks著。

1. 希腊字母

1.1 delta

d e l t a = N ( d 1 ) delta=N(d_1) delta=N(d1​)

代码实现
# BSM Call Greeks
def BSM_delta(S,X,T,r,sigma):'''Parameters:S: underlying price, floatX: strike price, floatT: maturity date, floatr: risk-free rate, floatsigma: volatility, floatReturns:delta: float'''d1 = (math.log(S/X) + (r + 0.5 * sigma ** 2) * T) / (sigma * math.sqrt(T))delta = stats.norm.cdf(d1, 0, 1)return delta

1.2 gamma

g a m m a = e − d 1 2 2 S 0 σ 2 π T gamma=\frac{e^{-\frac{d_1^2}{2}}}{S_0\sigma\sqrt{2\pi T}} gamma=S0​σ2πT ​e−2d12​​​

代码实现
def BSM_gamma(S,X,T,r,sigma):'''Parameters:S: underlying price, floatX: strike price, floatT: maturity date, floatr: risk-free rate, floatsigma: volatility, floatReturns:gamma: float'''d1 = (math.log(S / X) + (r + 0.5 * sigma ** 2) * T) / (sigma * math.sqrt(T))gamma = math.exp(-0.5 * d1 ** 2) / (S * sigma * math.sqrt(2 * math.pi * T))return gamma

1.3 theta

t h e t a = − S 0 σ e − d 1 2 2 2 2 π T − r X e − r T N ( d 2 ) theta=-\frac{S_0\sigma e^{-\frac{d1^2}{2}}}{2\sqrt{2\pi T}}-rXe^{-rT}N(d_2) theta=−22πT ​S0​σe−2d12​​−rXe−rTN(d2​)

代码实现
def BSM_theta(S,X,T,r,sigma):d1 = (math.log(S / X) + (r + 0.5 * sigma ** 2) * T) / (sigma * math.sqrt(T))d2 = d1 - sigma * math.sqrt(T)theta = -(S * math.exp(-0.5 * d1 ** 2) * sigma / (2 * math.sqrt(2 * math.pi * T)) - r * X * math.exp(-r * T)*stats.norm.cdf(d2, 0, 1))return theta

1.4 rho

R h o = T X e − r T N ( d 2 ) Rho=TXe^{-rT}N(d_2) Rho=TXe−rTN(d2​)

代码实现
def BSM_rho(S,X,T,r,sigma):d1 = (math.log(S / X) + (r + 0.5 * sigma ** 2) * T) / (sigma * math.sqrt(T))d2 = d1 - sigma * math.sqrt(T)rho = X * T * math.exp(-r * T) * stats.norm(d2, 0, 1)return rho

1.5 vega

v e g a = S 0 T e − d 1 2 2 2 π vega=\frac{S_0\sqrt{T}e^{-\frac{d_1^2}{2}}}{\sqrt{2\pi}} vega=2π ​S0​T ​e−2d12​​​

代码实现
def BSM_vega(S,X,T,r,sigma):d1 = (math.log(S / X) + (r + 0.5 * sigma ** 2) * T) / (sigma * math.sqrt(T))vega = S * math.sqrt(T) * math.exp(-0.5 * d1 ** 2) / math.sqrt(2 * math.pi)return vega

2. 隐含波动率的计算

此处参考《Python金融大数据分析》一书,Yves Hilpisch著。

隐含波动率是使BSM模型价格等于期权当前市场价格的标准差值。在BSM模型中,已知看涨期权的价格、S、X、T和r,求解 σ \sigma σ值。但BSM模型是没有办法直接解出 σ \sigma σ的,只能通过不断代入新的 σ \sigma σ值,直到有一个 σ \sigma σ值使得BSM模型求解出的看涨期权价格刚好等于市场价格。解决这种多数方程寻找近似根常用的方法就是牛顿迭代法。

牛顿迭代法的解读可参考这篇知乎文章:知乎-牛顿迭代法解读

牛顿迭代法下的隐含波动率求解公式
σ n + 1 i m p = σ n i m p − C ( σ n i m p ) − C ∂ C ( σ n i m p ) / ∂ σ n i m p \sigma_{n+1}^{imp}=\sigma_{n}^{imp}-\frac{C(\sigma_{n}^{imp})-C}{\partial C(\sigma_n^{imp})/\partial \sigma_n^{imp}} σn+1imp​=σnimp​−∂C(σnimp​)/∂σnimp​C(σnimp​)−C​

其中波动率的偏微分又称为Vega,所以上述公式变为:
σ n + 1 i m p = σ n i m p − C ( σ n i m p ) − C V e g a \sigma_{n+1}^{imp}=\sigma_{n}^{imp}-\frac{C(\sigma_{n}^{imp})-C}{Vega} σn+1imp​=σnimp​−VegaC(σnimp​)−C​

代码实现
# Implied Volatility of European call option in BSM model
def BSM_call_imp_vol(S,X,T,r,c,sigma_est,iter = 100):'''Parameters:S: underlying price, floatX: strike price, floatT: maturity date, floatr: risk-free rate, floatsigma_est: estimate of implied volatility, floatiter:number of iternationsReturns:sigma_est: estimate of implied volatility'''for i in range(iter):sigma_est += ((BSM_call_value(S,X,T,r,sigma_est) - c)/ BSM_vega(S,X,T,r,sigma_est))return sigma_est

FRM模型一:BSM期权定价模型相关推荐

  1. matlab期权定价模型比较,期权定价模型与数值方法(Matlab+Jupyter Notebook)

    [实例简介] 期权定价模型与数值方法(Matlab+Jupyter Notebook) 这是在JupyterNotebook上运行的Matlab代码,其中包括:隐含波动率计算.二叉树模型.欧式期权蒙特 ...

  2. python 布莱克舒尔斯_布莱克-舒尔斯-墨顿期权定价模型

    1. 布莱克-舒尔斯-墨顿期权定价模型(Black–Scholes–Merton Option Pricing Model) 布莱克-舒尔斯-墨顿模型(Black–Scholes–Merton mod ...

  3. 预报校正格式matlab,期权定价模型的高精度差分法

    长沙理工大学 硕士 2016 O241.8 期权定价模型的高精度差分法 High Precision Difference Method of Option Pricing Model 黄振平 张宏伟 ...

  4. 期权定价的数值方法之二项式期权定价模型【附pyrhon代码】

    期权定价的数值方法之二项式期权定价模型[附pyrhon代码] 前言 本章将开始期权定价模型的介绍与python量化实践.首先介绍一下期权定价的数值方法. 作为常用的数值方法,二项式期权定价模型(又称二 ...

  5. python 布莱克舒尔斯_布莱克—舒尔斯期权定价模型

    布莱克-舒尔斯期权定价模型.ppt Neokodama |  2011-09-23 17:37 21页 | 220KB | 2次下载 | (3人评价) 举报 | 用手机看文档 扫一扫,手机看文档 布莱 ...

  6. 期权组合策略用matlab分析,通过matlab 运用蒙特卡罗模型运算一个期权投资组合的VaR....

    通过matlab 运用蒙特卡罗模型运算一个期权投资组合的VaR. 2016/03/01 18:22 通过matlab 运用蒙特卡罗模型运算一个期权投资组合的VaR. 题目: a bank has wr ...

  7. python与金融建模_【用Python金融建模】从二叉树谈起:衍生品Option期权定价模型的构建...

    内容首发 乐学偶得(http://lexueoude.com) 公众号: 乐学Fintech 用代码理解分析解决金融问题 在金融里面很多地方都出现过一个理念就是"货币的时间价值", ...

  8. FRM模型二:时间序列建模

    这里写自定义目录标题 时间序列建模 建模步骤 步骤一:检验数据是否平稳 步骤二:差分 步骤三:选模型 步骤四:建模 步骤五:模型残差检验 步骤六:预测后一期数据 时间序列建模 在FRM一级Book2中 ...

  9. Black Scholes期权定价模型

    data BS; input S X r v T; d1 = (log(S/X) + (r+v**2/2)*T)/v/sqrt(T); d2 = d1 - v*sqrt(T); *编辑公式计算买权ca ...

最新文章

  1. Ejabberd源码解析前奏--配置
  2. php示例代码使用mysql_fetch_assoc函数
  3. Hibernate(1) 阻抗不匹配
  4. 微软加入了面向Java的Cloud Foundry
  5. 深入解析Windows窗口创建和消息分发
  6. PDF签名系列(1):PDF签名机制的漏洞分析
  7. 雇佣K个工人的最小费用 Minimum Cost to Hire K Workers
  8. 家庭记账本开发进度4
  9. Java编程练习题2
  10. 流程图中的实线_流程图符号_流程图中的带箭头的线段代表什么?
  11. OPENCV Linux 显示中文 arm64
  12. linux版本的火狐浏览器,火狐浏览器Linux版本
  13. 北航基物1101英文波尔共振实验
  14. Adobe国际认证让科技赋能时尚
  15. centos 安装frp 实现内网穿透进行电信物联网NBIOT开发
  16. 职场语录:新人,没人会告诉你的职场潜规则
  17. nodejs使用addon调用c/c++
  18. web聊天室项目开发过程及重难点整理
  19. [矩阵论] Unit 0. 线性代数 - 部分知识点整理
  20. 什么是Alpha策略?有什么作用吗?

热门文章

  1. 通用预约小程序,可广泛应用于医疗、政务、教育、培训、体育、金融、生活服务等行业领域,基于腾讯小程序云开发,无须服务器和域名
  2. 阅读一本书的三个步骤
  3. python需要电脑多大内存合适_电脑内存多大合适?对于不同的人内存多大才够用?...
  4. 用双引号作为for 里面delims的分隔符
  5. IPMItool: IPMI 管理工具
  6. 为什么负负得正,减负数的意义
  7. 有了danmu,二十行代码轻松愉快对弹幕进行二次开发
  8. 日内交易值不值得做?日内交易好在哪儿?
  9. Leetcode: 股票买卖大全
  10. 你要学习你要学习你要学习