FRM模型一:BSM期权定价模型
模型一: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=S0N(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)−S0N(−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π S0T 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)/∂σnimpC(σ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期权定价模型相关推荐
- matlab期权定价模型比较,期权定价模型与数值方法(Matlab+Jupyter Notebook)
[实例简介] 期权定价模型与数值方法(Matlab+Jupyter Notebook) 这是在JupyterNotebook上运行的Matlab代码,其中包括:隐含波动率计算.二叉树模型.欧式期权蒙特 ...
- python 布莱克舒尔斯_布莱克-舒尔斯-墨顿期权定价模型
1. 布莱克-舒尔斯-墨顿期权定价模型(Black–Scholes–Merton Option Pricing Model) 布莱克-舒尔斯-墨顿模型(Black–Scholes–Merton mod ...
- 预报校正格式matlab,期权定价模型的高精度差分法
长沙理工大学 硕士 2016 O241.8 期权定价模型的高精度差分法 High Precision Difference Method of Option Pricing Model 黄振平 张宏伟 ...
- 期权定价的数值方法之二项式期权定价模型【附pyrhon代码】
期权定价的数值方法之二项式期权定价模型[附pyrhon代码] 前言 本章将开始期权定价模型的介绍与python量化实践.首先介绍一下期权定价的数值方法. 作为常用的数值方法,二项式期权定价模型(又称二 ...
- python 布莱克舒尔斯_布莱克—舒尔斯期权定价模型
布莱克-舒尔斯期权定价模型.ppt Neokodama | 2011-09-23 17:37 21页 | 220KB | 2次下载 | (3人评价) 举报 | 用手机看文档 扫一扫,手机看文档 布莱 ...
- 期权组合策略用matlab分析,通过matlab 运用蒙特卡罗模型运算一个期权投资组合的VaR....
通过matlab 运用蒙特卡罗模型运算一个期权投资组合的VaR. 2016/03/01 18:22 通过matlab 运用蒙特卡罗模型运算一个期权投资组合的VaR. 题目: a bank has wr ...
- python与金融建模_【用Python金融建模】从二叉树谈起:衍生品Option期权定价模型的构建...
内容首发 乐学偶得(http://lexueoude.com) 公众号: 乐学Fintech 用代码理解分析解决金融问题 在金融里面很多地方都出现过一个理念就是"货币的时间价值", ...
- FRM模型二:时间序列建模
这里写自定义目录标题 时间序列建模 建模步骤 步骤一:检验数据是否平稳 步骤二:差分 步骤三:选模型 步骤四:建模 步骤五:模型残差检验 步骤六:预测后一期数据 时间序列建模 在FRM一级Book2中 ...
- 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 ...
最新文章
- Ejabberd源码解析前奏--配置
- php示例代码使用mysql_fetch_assoc函数
- Hibernate(1) 阻抗不匹配
- 微软加入了面向Java的Cloud Foundry
- 深入解析Windows窗口创建和消息分发
- PDF签名系列(1):PDF签名机制的漏洞分析
- 雇佣K个工人的最小费用 Minimum Cost to Hire K Workers
- 家庭记账本开发进度4
- Java编程练习题2
- 流程图中的实线_流程图符号_流程图中的带箭头的线段代表什么?
- OPENCV Linux 显示中文 arm64
- linux版本的火狐浏览器,火狐浏览器Linux版本
- 北航基物1101英文波尔共振实验
- Adobe国际认证让科技赋能时尚
- centos 安装frp 实现内网穿透进行电信物联网NBIOT开发
- 职场语录:新人,没人会告诉你的职场潜规则
- nodejs使用addon调用c/c++
- web聊天室项目开发过程及重难点整理
- [矩阵论] Unit 0. 线性代数 - 部分知识点整理
- 什么是Alpha策略?有什么作用吗?