对于模拟股票价格,几何布朗运动 (GBM) 是 事实上的首选 模型。
它有一些很好的属性,通常与股票价格一致,例如对数正态分布(因此向下限制为零),并且期望收益不取决于价格的大小。
当然,GBM 只是一个模型,没有一个模型可以完美地代表现实。
几何布朗运动?
问题一:几何布朗运动的均值函数怎么求
设布朗运动为B(t),布朗运动本身是正态分布,而且满足分布~N(0,t).几何布朗运动是W(t)=exp(B(t));这是一个很好的线性对应关系.所以均值就是(如图)解这个简单的积分,就得到均值:exp(t/2) 顺便方差也求了吧:exp(2t)-exp(t)
问题二:请问如何用R语言做大量次数的几何布朗运动的模拟(参数μ,σ已知) 10分
这上网搜应该搜的到吧,比如这篇文章股票价格行为关于几何布朗运动的模拟–基于中国上证综指的实证研究
,照着几何布朗运动的公式直接写代码应该就行了吧,代码逻辑都很清晰。
下面是照着这片文章模拟一次的代码,模拟多次的话,外面再套个循环应该就行了。然后再根据均方误差(一般用这个做准则的多)来挑最好的。
话说你的数据最好别是分钟或者3s切片数据,不然R这速度和内存够呛。
N
问题三:研究衍生品的时候为什么用几何布朗运动来模拟股票价格的运行轨迹
其实很简单,GBM(至少在一定程度上)符合人们对市场的观察。例如,直观的说,股票的价格看起来很像随机游走,再例如,股票价格不会为负,这样起码GBM比普通的布朗运动合适,因为后者是可以为负的。再稍微复杂一点,对收益率做测试( S(t)/S(t-1) – 1)做测试,发现,哎居然还基本是个正态分布。收益率是正态的,股价就是GBM模型
总之,就是大家做了很多统计测试,发现假设成GBM还能很好的逼近真实数值,比较接近事实。所以就用这个。
其实将精确的数学模型应用到金融的时间非常短。最早是1952年的Markowitz portfolio selection. 那个其实就是一个简单的优化问题。后来的CAPM APT等诸多模型,也仅仅研究的是一系列证券,他们之间回报、收益率以及其他影响因素关系,没有涉及到对股价运动的描述。
第一次提出将股价是GBM应用在严格模型的是black-scholes model 。在这个模型中提出了若干个假设,其中一个就是股价是GBM的。
问题四:如何确定几何布朗运动模型中的参数
几何布朗运动只是模型,是 exp{Bt }这样的形式。你用模型什么事是关键,确定参数,在英文中叫calibration.如果你是用 geometric brownian motion 去模型options, 这样的东西,是关系你的模型本身,比如black-scholes模型,关于它的参数calibration,这样的技术其实已经很完备,经典的金融数学教科书上都有的,其主要是根据市场上option的价格反推出模型的参数的。
特别是,GBM 使用恒定波动率,这显然与现实不符。它也没有考虑跳跃,例如由新闻引起的跳跃。
尽管有这些限制,GBM 仍然是对股票价格行为进行建模的有用起点。特别是,它非常有助于建立对各种金融概念的直觉——尤其是期权定价。
通常,当我们对股票价格进行建模时,我们的用例需要运行大量模拟以生成可能结果的分布。
由于这样的用例需要多次运行 GBM 模拟器,因此考虑优化代码以提高速度是值得的。少量的深思熟虑可以节省大量的时间。
当然,您要避免提早优化的诱惑,以免花费更多时间优化代码,而不是优化本身节省的时间。
在这篇文章中,我将展示两种使用 GBM 模拟价格路径的方法:
- 使用
for
循环迭代价格路径的数量和每个路径中的时间步数 - 向量化,我们一次对整个向量或矩阵进行操作
基于循环的 GBM 模拟
for
下面是在嵌套循环中运行 GBM 模拟的一些代码 :
g_op <- function { gm <- mrix(nol = nsm, nrow = t) for (imu in 1:nim) { gm\[1, smu\] <- S0 for (ay in 2:t) { eslon <- rnrm(1) dt = 1 / 365 bm\[day, imu\] <-bm\[(day-1), smu\] * exp((u - sgma * sima / 2) * dt + sima * epilo * sqt(dt))
100 个时间步长 50 次,年化波动率为 10%,偏移为 0,起始价格为 100,我得到的价格路径如下所示:
gm <- gbo(nsim, t, mu, sigma, S0)
这看起来像是上面指定的参数所描述的随机价格过程的合理表示。这个循环实际上运行得很快。
如果我们要求它进行 50,000 次模拟,让我们看看运行得有多快:
sar <- ys.tme() gm <- gbmlp(nim , t, mu, siga, S0) Sys.time() - srt
随时关注您喜欢的主题
大约十秒钟。
GBM 模拟的矢量化方法
R 中的许多操作都是矢量化的——这意味着操作可以在后台并行发生,或者至少可以使用用 C 编写的、对用户隐藏的紧密循环运行得更快。
向量化的经典例子是两个向量的元素相加。这种操作的 for 循环版本如下所示:
x <- c(1:10) y <- c(10:1) z <- numeric(length(x)) for(i in c(1:length(x))) { z\[i\] <- x\[i\] + y\[i\] } z
通过矢量化,我们可以简单地做到:
z <- x + y z
R 中的许多操作都是矢量化的——事实上,R 的设计就是考虑到这一点。
让我们在我们的 GBM 模拟中对一个操作进行矢量化来演示。
不像我们在循环版本中那样为每天的每个模拟生成一个新的随机数,我们将在一开始就生成一个包含整个模拟所需的所有随机数的矩阵。这就是下面代码中的矩阵 epsilon
。
然后,我们可以在单个操作 中 将该矩阵转换 nsim * t
为具有我们所需参数的 GBM 的实现。
作为最后一步,我们将给定的初始价格添加 S0
到每个模拟的第一个元素,然后我们通过时间累积产品来获得我们的价格路径。
这是代码:
gbc <- function { # 随机抽样的矩阵--每次模拟每天都有一个 epln <- matrix(norm(t*nim), ncol = nsim, nrow = t) # 得到GBM并转换为价格路径 gm <- exp((mu - sgma * sma / 2) * dt + sia pson * sqrtdt) )
如果我运行 50 次,我会得到如下所示的价格路径:
nsim <- 50 ggplot(aes) + geom_line() + theme(leend.poon = 'none')
让我们模拟50,000 条价格路径,看看我们是否在循环版本中获得了加速:
gbm <- gb_ec(nim = 50000) Sys.time() - start
这是一个数量级加速的最佳部分。
GBM 模拟器可以用来做什么?
鉴于我们的模型假设,我们可以使用它来估计未来某个时间点的价格分布:
ggplot(aes(x = pce)) + geom_hstgam(aes(y = ..denity..), biwdth = 0.1) + geom_dnsity() +
从那里,估计被模拟股票期权的 概率加权收益曲线 ,比如一个 看涨期权 在 105 处执行(同样,考虑到我们的模型假设,并忽略远期利率和股息):
proile <- ble( prce = D$x, vaue = casewen(price <= trke ~ 0, TRUE ~ prce - srie) ) # 报酬和概率的数据框架 prieghdyf_pile <- prle %>% muta(desity = D$y/sm(D$y)) ggplot + geom_line() + xlab('price')
最后,我们可以通过对概率加权收益曲线下的面积求和来获得期权的期望值:
expeue <- proile %>% suse(ev = sum(density * value)) explue
结论
几何布朗运动模拟器是您开始对股票价格进行建模时首先使用的工具之一。
特别是,它是一个有用的工具,可以帮助您建立 _期权定价_等概念。
利用 R 的矢量化工具,我们可以立即运行数以万计的模拟。
可下载资源
关于作者
Kaizong Ye是拓端研究室(TRL)的研究员。在此对他对本文所作的贡献表示诚挚感谢,他在上海财经大学完成了统计学专业的硕士学位,专注人工智能领域。擅长Python.Matlab仿真、视觉处理、神经网络、数据分析。
本文借鉴了作者最近为《R语言数据分析挖掘必知必会 》课堂做的准备。
非常感谢您阅读本文,如需帮助请联系我们!