随机变量模拟

在当前股票指数水平S0给定的情况下,未来某个日期T的股票指数水平ST可以根据Black-Scholes-Merton公式模拟:

r :无风险利率
σ :S的恒定波动率(= 收益率的标准差)
z:标准正态分布随机变量

#通过 standard_normal模拟几何布朗运动,随机变量呈对数正态分布
S0 = 100
r = 0.05
sigma = 0.25
T = 2.0
I = 10000
ST1 = S0 * np.exp((r - 0.5 * sigma ** 2) * T +sigma * math.sqrt(T) * npr.standard_normal(I))  #如果使用 lognormal 函数直接得出随机变量值,必须向函数提供均值和标准差,通过 lognormal模拟几何布朗运动:
ST2 = S0 * npr.lognormal((r - 0.5 * sigma ** 2) * T,sigma * math.sqrt(T), size=I)  #使用 scipy.stats子库和 print_statistics 比较模拟结果的分布特性
import scipy.stats as scs
def print_statistics(a1, a2):"""Print selected statistics"""sta1 = scs.describe(a1)sta2 = scs.describe(a2)print('%14s %14s %14s' % ('statistic', 'data set 1', 'data set 2'))print(45 * '-')print('%14s %14.3f %14.3f' % ('size', sta1[0], sta2[0]))print('%14s %14.3f %14.3f' % ('min', sta1[1][0], sta2[1][0]))print('%14s %14.3f %14.3f' % ('max', sta1[1][1], sta2[1][1]))print('%14s %14.3f %14.3f' % ('mean', sta1[2], sta2[2]))print('%14s %14.3f %14.3f' % ('std', np.sqrt(sta1[3]), np.sqrt(sta2[3])))print('%14s %14.3f %14.3f' % ('skew', sta1[4], sta2[4]))print('%14s %14.3f %14.3f' % ('kurtosis', sta1[5], sta2[5]))
print_statistics(ST1, ST2)
#差异主要是由于模拟中的所谓采样误差
  statistic     data set 1     data set 2
---------------------------------------------size      10000.000      10000.000min         23.167         27.035max        377.909        433.432mean        110.586        110.652std         40.483         40.817skew          1.090          1.215kurtosis          1.888          2.663

动态形式--几何布朗运动

Black-Scholes-Merton模型的动态形式由下面的随机微分方程(SDE)描述。Zt是标准布朗运动,SDE 被称作几何布朗运动。St的值呈对数正态分布,边际收益 dSt/St 呈正态分布。

公式 Black-Scholes-Merton设置中的随机微分方程

SDE可以由一个欧拉格式精确地离散化,Δt是固定的离散化间隔, zt是标准正态分布随机变量,在Black-Scholes-Merton中动态模拟指数水平:

I = 10000
M = 50
dt = T / M
S = np.zeros((M + 1, I))
S[0] = S0
for t in range(1, M + 1):S[t] = S[t - 1] * np.exp((r - 0.5 * sigma ** 2) * dt +sigma * math.sqrt(dt) * npr.standard_normal(I))  #展示前10条模拟路径:
plt.figure(figsize=(10, 6))
plt.plot(S[:, :10], lw=1.5)
plt.xlabel('time')
plt.ylabel('index level')

均值回归过程--平方根扩散

均值回归过程用于建立短期利率或者波动性过程模型。平方根扩散对应的随机微分方程:

xt :日期 t 的过程水平
k : 均值回归因子
θ :长期过程均值
σ :恒定波动率
Z :标准布朗运动
xt的值可以使用正态分布进行离散化和近似计算。 平方根扩散的欧拉离散化:

  ,       

到期日的模拟平方根扩散:

#用表示短期利率模型的值参数化后续模拟所用的模型
x0 = 0.05
kappa = 3.0
theta = 0.02
sigma = 0.1
I = 10000
M = 50
dt = T / Mdef srd_euler():xh = np.zeros((M + 1, I))x1 = np.zeros_like(xh)xh[0] = x0x1[0] = x0for t in range(1, M + 1):xh[t] = (xh[t - 1]+ kappa * (theta - np.maximum(xh[t - 1], 0)) * dt+ sigma * np.sqrt(np.maximum(xh[t - 1], 0)) * np.sqrt(dt)* random.standard_normal(I))x1 = np.maximum(xh, 0)return x1x1 = srd_euler()
#前十条路径,说明得出的平均偏离值为负值(x0>θ=0.02),收敛于 θ
plt.plot(x1[:, :10], lw=1.5)
plt.xlabel('time')
plt.ylabel('index level')
plt.grid(True)

波动率随机的情况

B-S模型假设波动率恒定。而波动率是随机的。 Heston随机波动率模型的随机徽分方程:

ρ 代表两个标准布朗运动 Zt1 ,Zt2之间的瞬时相关性。用于解释杠杆效应:波动性在衰退市场中上升, 而在牛市下降。

S0 = 100
r = 0.05
v0 = 0.1
kappa = 3.0
theta = 0.25
sigma = 0.1
rho = 0.6
T = 1.0
#确定两个随机过程相关矩阵的柯列斯基分解:
corr_mat = np.zeros((2, 2))
corr_mat[0, :] = [1.0, rho]
corr_mat[1, :] = [rho, 1.0]
cho_mat = np.linalg.cholesky(corr_mat)
cho_mat
# array([[ 1. ,  0. ],
#        [ 0.6,  0.8]])
# 为指数过程和波动性过程生成整组随机数
M = 50
I = 10000
ran_num = random.standard_normal((2, M + 1, I))
# 以平方根扩散过程类型建模波动性过程
dt = T / M
v = np.zeros_like(ran_num[0])
vh = np.zeros_like(v)
v[0] = v0
vh[0] = v0
for t in range(1, M + 1):ran = np.dot(cho_mat, ran_num[:, t, :])vh[t] = (vh[t - 1] + kappa * (theta - np.maximum(vh[t - 1], 0)) * dt+ sigma * np.sqrt(np.maximum(vh[t - 1], 0)) * np.sqrt(dt)* ran[1])v = np.maximum(vh, 0)
#使用几何布朗运动的欧拉格式建模指数水平过程
S = np.zeros_like(ran_num[0])
S[0] = S0
for t in range(1, M + 1):ran = np.dot(cho_mat, ran_num[:, t, :])S[t] = S[t - 1] * np.exp((r - 0.5 * v[t]) * dt +np.sqrt(v[t]) * ran[0] * np.sqrt(dt))#指数水平过程和波动性过程的模拟结果
#到期日的模拟随机波动率模型
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(9, 5))
ax1.hist(S[-1], bins=50)
ax1.set_xlabel('index level')
ax1.set_ylabel('frequency')
ax1.grid(True)
ax2.hist(v[-1], bins=50)
ax2.set_xlabel('volatility')
ax2.grid(True)

#模拟随机波动率模型路径
fig, (ax1, ax2) = plt.subplots(2,1,sharex=True, figsize=(7, 6))
ax1.plot(S[:,:10],lw=1.5)
ax1.set_ylabel('index level')
ax1.grid(True)
ax2.plot(v[:,:10],lw=1.5)
ax2.set_xlabel('time')
ax2.set_ylabel('volatility')
ax2.grid(True)
#每个过程的前10条模拟路径表明波动性过程的平均漂移值为正数,收敛于 θv=0.25

python模拟B-S期权定价模型相关推荐

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

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

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

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

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

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

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

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

  5. FRM模型一:BSM期权定价模型

    模型一:Black-Scholes-Merton模型 最近在学习Frm课程,发现有很多模型可以用python实现出来,于是查阅了一些资料,准备将相关内容用python实现.复现的第一个模型就是大名鼎鼎 ...

  6. python模拟按键_python 模拟按键放在模拟器Python初学者的17个技巧

    Python初学者的17个技巧,有需要的朋友可以参考下. W WW.002pc .COM认为此文章对<python 模拟按键放在模拟器Python初学者的17个技巧>说的很在理. 交换变量 ...

  7. Python模拟赌博实验,赌博为什么能赌到倾家荡产?

    Python模拟赌博实验 作者:dalalaa http://www.jianshu.com/p/2d919a028600 概述 前言 实验思路 实验步骤 统计数据 结论 阿广说 福利一刻 推荐阅读 ...

  8. python 模拟键盘_Python 模拟键盘输入 | 学步园

    Python 模拟键盘输入,留着备用. #coding=utf-8 import win32gui,win32api,win32con import time import threading def ...

  9. python 模拟HTTP服务端

    使用python模拟http服务端,自定义返回信息头部:#!/usr/bin/python import os from BaseHTTPServer import BaseHTTPRequestHa ...

  10. python模拟登录qq账号密码_最新的Python模拟登陆QQ脚本,一键批量登录,强行过验证!...

    Python模拟QQ批量登陆脚本,以下代码附带解释以便于理解思路. Python代码: #coding=utf-8 import os import time import win32gui impo ...

最新文章

  1. matlab练习程序(Log Polar变换)
  2. 2017年ICPC西安邀请赛A、XOR(线段树套线性基 + 思维)
  3. h3c 3600 交换机配置Telnet登录
  4. 令人惊叹的前端路由原理解析和实现方式
  5. Leetcode--128. 最长连续序列
  6. RabbitMQ入门学习系列(三).消息发送接收
  7. 孙鑫VC学习笔记:第十七讲 (三) 用命名管道实现进程间的通信
  8. 地图标识符号大全_资源小结:中国分省地图大全(10.23版)
  9. 使用运放构建电压跟随器
  10. 爬虫BeautifulSoup库学习-小猪短租网
  11. 集成学习方法之Bagging,Boosting,Stacking
  12. Docker学习之docker重启参数--restart=always的作用
  13. 企业级 Go 项目实战,记住这 5 大核心要点
  14. js正则去除头尾的指定符号
  15. Oracle -PL/SQL Developer错误解决方案(ORA-02291)
  16. 安装更强大更美观的zsh,配置oh my zsh及插件
  17. HTML行内元素、块级元素和行内块元素
  18. 火遍全球家喻户晓的小游戏——开心消消乐
  19. Codeforces 676D Theseus and labyrinth 模拟+bfs
  20. 输入两个整数,要求输出其中值较大者。要求用函数求出最大值

热门文章

  1. 中美计算机软件著作权登记差异与比较
  2. 头条小程序服务器设置,今日头条小程序如何注册申请
  3. 育儿书籍阅读顺序的建议
  4. 通过DeviceIoControl获取真实网卡地址
  5. 大学计算机技术导论,北京邮电大学计算机学院网络技术导论第一章资料.ppt
  6. 每周分享第 58 期
  7. 网络工程师必备 5款网络故障排除工具
  8. 验证volatile可见性之诡异事件
  9. python哥德巴赫猜想_Python验证哥德巴赫猜想
  10. 远程接入Linux、unix、Windows工具-opentext ETX