Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >R语言做几何布朗运动的模拟:复杂金融产品的几何布朗运动的模拟

R语言做几何布朗运动的模拟:复杂金融产品的几何布朗运动的模拟

作者头像
拓端
发布于 2020-08-10 08:54:52
发布于 2020-08-10 08:54:52
1.5K00
代码可运行
举报
文章被收录于专栏:拓端tecdat拓端tecdat
运行总次数:0
代码可运行

原文链接:http://tecdat.cn/?p=5334

几何布朗运动(GBM)是模拟大多数依赖某种形式的路径依赖的金融工具的标准主力。虽然GBM基于有根据的理论,但人们永远不应忘记它的最初目的 - 粒子运动的建模遵循严格的正态分布脉冲。基本公式由下式给出:

标准维纳过程代表创新。在对气体进行建模时效果很好,在财务建模方面存在一些严重的缺陷。问题是维纳过程有两个非常严格的条件:

a)创新通常是分布式的,平均零和方差为t

b)创新是独立的

现在,至少有一些金融市场数据暴露的人都知道股票回报不满足第一个条件,有时甚至不满足第二个条件。普遍的共识是,股票收益是扭曲的,是有效的,并且尾巴不均匀。虽然股票收益趋于收敛于正常分布且频率递减(即月收益率比日收益率更正常),但大多数学者会同意t分布或Cauchy分布更适合收益。

然而,在实践中,大多数人在模拟布朗运动时只是采用正态分布,并接受由此产生的资产价格不是100%准确。另一方面,我不满足于这种半解决方案,我将在下面的例子中展示盲目信任GBM的成本是多少。我提出了一种伪布朗方法,其中随机创新是从经验回报的核密度估计而不是假设的正态分布中采样的。这种方法的好处在于它产生的结果更接近于过去观察到的结果而没有完全复制过去(这将是直接从过去的创新中抽样随机创新的结果)。

介绍性例子

在我们进入有趣的部分之前,我们展示了市场上浪费了多少钱,我们从一个简单的例子开始。我们需要加载三个包及其依赖项

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

install.packages("quantmod")
require(quantmod)

对于我们的第一个例子,我们将尝试模拟AT&T的回报。以下命令允许我们从雅虎财经下载价格信息并计算每月日志回报为了确定我在开始时所做的观点,我们将比较回报分布与正态分布。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制


att <- getSymbols("T", from = "1985-01-01", to = "2015-12-31", auto.assign = FALSE)
plot(density(attr), main = "Distribution of AT&T Returns")
rug(jitter(attr))

即使没有艺术史硕士学位,大多数人也会同意这两行不匹配。对于那些不依赖于这种视觉方法的人来说,可靠的Kolmogorov-Smirnov测试提供了一种更正式的方法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

set.seed(2013)
ks.test(attr, rnorm(n = length(attr), mean = mean(attr), sd = sd(attr)))

测试返回的p值为0.027,这远远不够(p值越小,我们必须得出的结论是两个分布不同)。接下来我们设置标准GBM功能。我完全清楚各种GBM函数作为众多包的一部分存在。尽管如此,我还是决定创建自己的函数,以使内部工作更加透明。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

m((mu * dt * x) + #drift
rnorm(1, mean = 0, sd = 1) * sqrt(dt) * sigma * x) #random innovation
x
}

在这个简单的函数中(我知道有更优雅的方法来实现这一点,但结果保持不变)rnorm函数充当Wiener进程驱动程序。毋庸置疑,这并不尊重我们上面所看到的。相比之下,我的伪布朗函数从过去经验回报的核密度估计中抽样随机创新。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

pseudoGBM <- function(x, rets, n, ...) {
N <</div>
y[[i]] <- x + x * (mean(rets) + samp[i])
x <- y[[i]]
}
return(y)
}
 

不可否认,这个函数有点简洁,因为它假设静态增量(即dt = 1)并且几乎不需要用户输入。它只需要一个起始值(x),一个过去返回的向量(rets)和指定的路径长度(n)。...输入允许用户将其他命令传递给密度函数。这使用户可以通过添加带宽命令(bw =)来控制核密度估计的平滑度。没有任何进一步的麻烦,让我们开始使用上述功能进行模拟。在第一个例子中,我们仅使用起始值x中的两个函数来模拟一个价格路径,即系列中的最后一个价格。要查看两个方法的执行情况,我们计算模拟序列的回报并将它们的分布与经验分布进行比较。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制


x <- as.numeric(tail(att$T.Adjusted, n = 1))
set.seed(2013)
attPGBMr <- diff(log(attPGBM))[-1]
d1 <- density(attr)
d2 <- density(attGBMr)
d3 <- density(attPGBMr)
plot(range(d1$x, d3$x), range(d1$y, d3$y), type = "n",
ylab = "Density", xlab = "Returns", main = "Comparison of Achieved Densities")
lines(d1, col = "black", lwd = 1)
lines(d2, col = "red", lty = 2)
lines(d3, col = "blue", lty = 3)

显然,我们看到PGBM函数(蓝线)在产生接近经验回报分布(黑线)的回报时优于标准GBM函数(红线)。同样,关键(或视觉上无能)的读者可以查看KS测试的结果。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

ks.test(attr, attPGBMr)
ks.test(attr, attGBMr)

我们再次看到PGBM函数(p值= 0.41)远远优于GBM函数(p值= 0.02)。

示例

我们首先从雅虎财经下载EUROSTOXX 50价格信息。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
eu <- getSymbols("^STOXX50E", from = "1990-01-01", to = "2015-12-31", auto.assign = FALSE)

接下来,我们看看数据与正态分布的拟合程度如何,或者说多么糟糕。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制


plot(density(eur), main ibution of EUROSTOXX 50 Returns")
ks.tst(eu.r, rnm(n = length(eu.r), mean = mean(eu.r), sd = sd(eu.r)))

从严格的视角来看,这看起来比AT&T分布更糟糕。EUROSTOXX的回报显然是负面偏差,有点leptokurtic。KS测试返回p值为0.06,确认视觉不匹配。现在我们已经确定正态分布不是最合适的,我们可以看看错误地假设它的后果。我们将使用标准GBM和我的PGBM函数运行10,000次迭代的模拟并比较结果。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
x <- as.numer
SIM1 <- as.data.frame(matrix(replicate(10000, {eu.GBM <- myGBM(x=x, mu = mean(eu.r), sigma = sd(
SIM2 <- as.data.frame(matrix(replicate(10000, {eu.PGBM <- pseudoGBM(x = x, n = 240, rets = eu.r)}), ncol = 1000, 10000), SIM1[seq(0, 240, 12), ])), start = c(2016), frequency = 1)
sim2 <- ts(as.matrix(rbind(rep(x, 10000), SIM2[seq(0, 240, 12), ])), start = c(2016), frequency = 1)

当然,我们对EUROSTOXX 50的价格水平不感兴趣,而是在参与率和上限率的约束下评估的回报。好消息是最困难的部分就在我们身后。计算回报和应用约束非常简单。对结果进行调整并不容易。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制


s1.r <-(sim2))
, s2.r*0.2, 0.15*0.20)
S1<-colSums(s1.r)
S2<-colSumS1,arkred")
rug(jitter(S2), side = 1, col = "darkblue")
ks.test(S1, S2)

我们可以清楚地看到,PGBM函数(蓝色)模拟的累积回报表现出负偏差,并且范围比标准GBM函数(红色)模拟的回报更宽。请注意,由于安全性没有下行限制,分布在下尾区看起来并不相同。KS测试以极其确定的方式证实两种分布是不同的(然而,小的p值主要是由大样本量引起的)。现在回答这个百万美元的问题(实际上非常字面)。线路上有多少钱?好吧,如果Generali使用正态分布来预测回报并相应地重新投保,他们会......

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

mean(S1-mean(S2

...低估了累计回报率约0.6%。

结论和局限

那么我们从中学到了什么呢?用于对任何依赖路径的安全定价模型中的创新进行建模的分布可能会产生重大影响。虽然这个陈述本身就很明显,但分布差异的程度令人惊讶。当然,在Generali和其他机构工作的人可能比我更聪明,他们非常清楚正常分布并不总是最佳选择。但是,大多数人会使用更正式的(但可能只是不准确的)分布,如t分布或Cauchy分布。使用核密度分布是一种闻所未闻的方法。这是有原因的。

首先,不能保证核密度估计比未回避的正态分布更准确地表示未知的基础分布。使用过去的数据预测未来总是让任何数据科学家的口味都不好,但不幸的是我们别无选择。然而,标准GBM固有的正态分布确实过于依赖过去的信息(即历史均值和标准偏差),但在形式化解决方案方面具有巨大的优势,因为其核心作用(双关语仅用于后见之明)概率论。

其次,内核密度估计对使用的带宽非常敏感。如果带宽太大,您将获得平滑的分布,但是,与正态分布没有区别。如果带宽太小,您将获得一个非常强调极值的分布,特别是如果您估计内核密度的数据样本相当小。在上面的例子中,我们使用了密度函数中固有的自动带宽选择器,但几乎没有办法知道最佳带宽是什么。

上述方法还有其他局限性,因为我们做了许多非常不切实际的假设。在Generali的例子中,我们假设Generali没有改变参与率和上限率,这是不太可能的。然而,更一般地说,我们对金融市场做出了一些基本假设。知情(希望)我们假设资本市场是有效的。因此,我们假设回报中没有自相关,这是维纳过程的第二个条件,但这是否代表了基础数据?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
acf(eu.r)
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-08-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 拓端数据部落 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
R语言做复杂金融产品的几何布朗运动的模拟
几何布朗运动(GBM)是模拟大多数依赖某种形式的路径依赖的金融工具的标准主力。虽然GBM基于有根据的理论,但人们永远不应忘记它的最初目的 - 粒子运动的建模遵循严格的正态分布脉冲。基本公式由下式给出:
拓端
2020/07/22
9980
R语言做复杂金融产品的几何布朗运动的模拟
PYTHON 用几何布朗运动模型和蒙特卡罗MONTE CARLO随机过程模拟股票价格可视化分析耐克NKE股价时间序列数据|附代码数据
金融资产/证券已使用多种技术进行建模。该项目的主要目标是使用几何布朗运动模型和蒙特卡罗模拟来模拟股票价格。该模型基于受乘性噪声影响的随机(与确定性相反)变量
拓端
2023/01/13
1.8K0
PYTHON 用几何布朗运动模型和蒙特卡罗MONTE CARLO随机过程模拟股票价格可视化分析耐克NKE股价时间序列数据|附代码数据
金融资产/证券已使用多种技术进行建模。该项目的主要目标是使用几何布朗运动模型和蒙特卡罗模拟来模拟股票价格。该模型基于受乘性噪声影响的随机(与确定性相反)变量 ( 点击文末“阅读原文”获取完整代码数据******** )。 最近我们被客户要求撰写关于模拟股票的研究报告,包括一些图形和统计输出。
拓端
2022/11/28
2.2K0
R语言Copula函数股市相关性建模:模拟Random Walk(随机游走)
在引入copula时,大家普遍认为copula很有趣,因为它们允许分别对边缘分布和相依结构进行建模。
拓端
2021/01/29
1.3K0
R语言Copula函数股市相关性建模:模拟Random Walk(随机游走)
R语言布朗运动模拟股市、物种进化树状图、二项分布可视化
布朗运动的数学模型(也称为随机游动)也可以用来描述许多现象以及微小颗粒的随机运动, 如股市的波动和在化石中的物理特性的演变。
拓端
2023/08/31
2360
R语言布朗运动模拟股市、物种进化树状图、二项分布可视化
R语言几何布朗运动GBM模拟股票价格优化建立期权定价用概率加权收益曲线可视化
它有一些很好的属性,通常与股票价格一致,例如对数正态分布(因此向下限制为零),并且期望收益不取决于价格的大小。
拓端
2022/06/08
1.3K0
R语言几何布朗运动GBM模拟股票价格优化建立期权定价用概率加权收益曲线可视化
模拟布朗运动
通过这个轨道图,也容易看出,几何布朗运动是对股票价格的良好模拟,能代表CAMP模型中股票的期望收益率,而是股票风险的度量!
用户3577892
2020/06/11
1.4K0
python数据可视化分析速成笔记_2-2_布朗运动/几何布朗运动(伊藤过程)实现的demo[通俗易懂]
实际上如果是熟悉matlab操作的大神们应该改会发现这些包和matlab里面的是相通的
全栈程序员站长
2022/09/20
9560
python数据可视化分析速成笔记_2-2_布朗运动/几何布朗运动(伊藤过程)实现的demo[通俗易懂]
R语言中的模拟过程和离散化:泊松过程和维纳过程
本文中,我们讨论了一个将Poisson过程与Wiener过程结合在一起的最佳算法的问题。实际上,为了生成泊松过程,我们总是习惯于模拟跳跃之间的持续时间。我们使用给定时间间隔内跳跃的均匀性,该条件取决于跳跃的次数。
拓端
2020/10/24
2.1K0
R语言中的模拟过程和离散化:泊松过程和维纳过程
本文中,我们讨论了一个将Poisson过程与Wiener过程结合在一起的最佳算法的问题。实际上,为了生成泊松过程,我们总是习惯于模拟跳跃之间的持续时间。我们使用给定时间间隔内跳跃的均匀性,该条件取决于跳跃的次数。
拓端
2020/11/04
9710
R语言中的模拟过程和离散化:泊松过程和维纳过程
R语言VaR市场风险计算方法与回测、用LOGIT逻辑回归、PROBIT模型信用风险与分类模型
市场风险指的是由金融市场中资产的价格下跌或价格波动增加所导致的可能损失(点击文末“阅读原文”获取完整代码数据)。
拓端
2023/08/31
6610
R语言VaR市场风险计算方法与回测、用LOGIT逻辑回归、PROBIT模型信用风险与分类模型
常用连续型分布介绍及R语言实现
作者:张丹(Conan), 程序员Java,R,PHP,Javascript blog: http://blog.fens.me 随机变量在我们的生活中处处可见,如每日天气,股价涨跌,彩票中奖等,这些事情都是事前不可预言其结果的,就算在相同的条件下重复进行试验,其结果未必相同。数学家们总结了这种规律,用概率分布来描述随机变量取值。 就算股价不能预测,但如果我们知道它的概率分布,那么有90%的可能我们可以猜出答案。 目录 正态分布 指数分步 γ(伽玛)分布 weibull分布 F分布 T分布 β(贝塔)分布
机器学习AI算法工程
2018/03/13
3.8K0
常用连续型分布介绍及R语言实现
R语言数据分布检验的小例子
今天在B站看了毕导的《我给自己发了2亿个红包,才发现先抢和后抢的差距这么大!》的视频,非常有意思,大家感兴趣也可以到B站观看。
用户7010445
2020/03/03
2.4K0
【数据分析 R语言实战】学习笔记 第五章 数据的描述性分析(上)
分布是描述一个样本数据最核心、最重要的方式。R内嵌了很多常用的统计分布,提供了四类函数:概率密度函数(density),累积分布函数(probability)、分位数(quantile)和伪随机数(random)。在R中分别用d,p,q,r表示这4个项目,后面接分布的英文名称或缩写。
Ai学习的老章
2019/04/10
8520
【数据分析 R语言实战】学习笔记 第五章  数据的描述性分析(上)
R语言GAMLSS模型对艾滋病病例、降雪量数据拟合、预测、置信区间实例可视化
GAMLSS模型是一种半参数回归模型,参数性体现在需要对响应变量作参数化分布的假设,非参数性体现在模型中解释变量的函数可以涉及非参数平滑函数,非参数平滑函数不预先设定函数关系,各个解释变量的非线性影响结果完全取决于样本数据。它克服了GAM模型和广义线性模型(Generalized Linear Models, GLM)的一些局限性。
拓端
2023/03/27
9580
直方图与核密度估计
直方图是一种经常被用于统计的图形表达形式,简单来说它的功能就是用一系列的样本数据,去分析样本的分布规律。而直方图跟核密度估计(Kernel Density Estimation,KDE)方法的主要差别在于,直方图得到的是一个离散化的统计分布,而KDE方法得到的是一个连续的概率分布函数。如果将得到的分布重新用于采样,两者都可以结合蒙特卡洛方法实现这样的功能,但是KDE的优点在于它得到的结果是可微分的,那么就可以应用于有偏估计的分子动力学模拟中,如元动力学(Meta Dynamics)方法。这里主要用Python实现一个简单的KDE函数的功能,也顺带介绍一下Numpy和Matplotlib中关于直方图的使用方法。
DechinPhy
2024/04/18
2750
直方图与核密度估计
R语言有状态依赖强度的非线性、多变量跳跃扩散过程模型似然推断分析股票价格波动
跳跃扩散过程为连续演化过程中的偏差提供了一种建模手段。但是,跳跃扩散过程的微积分使其难以分析非线性模型。本文开发了一种方法,用于逼近具有依赖性或随机强度的多变量跳跃扩散的转移密度。通过推导支配过程时变的方程组,我们能够通过密度因子化来近似转移密度,将跳跃扩散的动态与无跳跃扩散的动态进行对比。在这个框架内,我们开发了一类二次跳跃扩散,我们可以计算出对似然函数的精确近似。随后,我们分析了谷歌股票波动率的一些非线性跳跃扩散模型,在各种漂移、扩散和跳跃机制之间进行。在此过程中,我们发现了周期性漂移和依赖状态的跳跃机制的依据。
拓端
2021/07/16
8130
R语言有状态依赖强度的非线性、多变量跳跃扩散过程模型似然推断分析股票价格波动
R语言对混合分布中的不可观测与可观测异质性因子分析
之前,我们讨论了利率制定中可观察和不可观察异质性之间的区别(从经济角度出发)。为了说明这一点,我们看了以下简单示例。 X 代表一个人的身高。考虑以下数据集
拓端
2020/09/28
6250
R语言对混合分布中的不可观测与可观测异质性因子分析
使用蒙特卡罗模拟的投资组合优化
在金融市场中,优化投资组合对于实现风险与回报之间的预期平衡至关重要。蒙特卡罗模拟提供了一个强大的工具来评估不同的资产配置策略及其在不确定市场条件下的潜在结果。
deephub
2023/11/06
7110
使用蒙特卡罗模拟的投资组合优化
R语言使用Metropolis-Hastings采样算法自适应贝叶斯估计与可视化
1)定义模型(即概率先验)。在此示例中,让我们构建一个简单的线性回归模型(对数)。
拓端
2023/09/25
3120
R语言使用Metropolis-Hastings采样算法自适应贝叶斯估计与可视化
推荐阅读
R语言做复杂金融产品的几何布朗运动的模拟
9980
PYTHON 用几何布朗运动模型和蒙特卡罗MONTE CARLO随机过程模拟股票价格可视化分析耐克NKE股价时间序列数据|附代码数据
1.8K0
PYTHON 用几何布朗运动模型和蒙特卡罗MONTE CARLO随机过程模拟股票价格可视化分析耐克NKE股价时间序列数据|附代码数据
2.2K0
R语言Copula函数股市相关性建模:模拟Random Walk(随机游走)
1.3K0
R语言布朗运动模拟股市、物种进化树状图、二项分布可视化
2360
R语言几何布朗运动GBM模拟股票价格优化建立期权定价用概率加权收益曲线可视化
1.3K0
模拟布朗运动
1.4K0
python数据可视化分析速成笔记_2-2_布朗运动/几何布朗运动(伊藤过程)实现的demo[通俗易懂]
9560
R语言中的模拟过程和离散化:泊松过程和维纳过程
2.1K0
R语言中的模拟过程和离散化:泊松过程和维纳过程
9710
R语言VaR市场风险计算方法与回测、用LOGIT逻辑回归、PROBIT模型信用风险与分类模型
6610
常用连续型分布介绍及R语言实现
3.8K0
R语言数据分布检验的小例子
2.4K0
【数据分析 R语言实战】学习笔记 第五章 数据的描述性分析(上)
8520
R语言GAMLSS模型对艾滋病病例、降雪量数据拟合、预测、置信区间实例可视化
9580
直方图与核密度估计
2750
R语言有状态依赖强度的非线性、多变量跳跃扩散过程模型似然推断分析股票价格波动
8130
R语言对混合分布中的不可观测与可观测异质性因子分析
6250
使用蒙特卡罗模拟的投资组合优化
7110
R语言使用Metropolis-Hastings采样算法自适应贝叶斯估计与可视化
3120
相关推荐
R语言做复杂金融产品的几何布朗运动的模拟
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验