R语言收益率和波动性模拟股票价格COMP226带自测题

在本工作表中,我们将研究价格、收益率和波动性。波动性通常用收益率的均方差来衡量,例如夏普比率的分母,它被用作风险的衡量标准。

由Kaizong Ye,Liao Bao撰写

我们将使用股票价格的平均对数收益率和波动性(对数回报的均方差)来模拟股票价格。

价格和收益率

library(quantmod)
getSymbols("AAPL")
price_AAPL <- Ad(AAPL)
plot(price_AAPL, main = "AAPL prices")

我们注意到的第一件事是,这个价格序列似乎不是平稳的,也就是说,没有明显的平均价格(因此谈论价格的均方差实际上没有意义)。使用这种非平稳时间序列是非常有问题的——时间序列分析的大部分集中在平稳时间序列上;在实词时间序列中使用时间序列的第一步通常是导出平稳时间序列,也就是说,一个随时间变化具有恒定均值和均方差的时间序列。由于价格不是平稳的,我们将注意力转向股票的收益率。

returns_AAPL <- diff(log(price_AAPL)) 
plot(returns_AAPL, main = "AAPL % returns") 


视频

随机波动率SV模型原理和Python对标普SP500股票指数时间序列波动性预测

探索见解

去bilibili观看

探索更多视频

请注意,在收益率图中有一些聚类,不是在收益率的符号中(这对交易AAPL股票直接有用),而是在收益率的幅度中,也就是说,明天的收益率可能在幅度上与今天的收益率相似(无论是正的还是负的)。除此之外,收益率比价格稳定得多。让我们看看它们的柱状图。

hist(returns_AAPL, breaks = 100, col="brown") 

练习

检查当我们使用简单收益率而不是对数收益率时,我们刚才看到的两个数字是否非常相似

解答

library(TTR)
dev.off()

R语言时间序列GARCH模型分析股市波动率

阅读文章



随时关注您喜欢的主题


请注意,简单的收益率直方图非常相似,但不完全相同。

收益率的分布似乎有点像正态(高斯)分布。像布莱克-斯科尔斯期权定价公式这样的模型是基于收益率实际上是对数正态分布的假设。事实上,这只是对现实的近似——实际股价收益率比正态分布所暗示的更有可能出现极值(也就是说,实际回报分布有肥尾)。

独立性怎么样?

这些收益率在时间上是相互独立的吗?这里有一个快速的方法来部分回答这个问题:

acf(returns_AAPL[-1], main = "Autocorrelation of returns") 

该自相关检查给定周期与未来周期之间的相关性。

请注意,连续收益率之间似乎没有任何自相关。

然而,我们已经注意到收益率幅度的一些聚类,这通常被称为波动率聚类。使用acf重复上面的图表,但使用收益率的绝对值(使用函数abs()获得)。你现在将观察到自相关。

解答

acf(abs(returns_AAPL[-1]), main = "Autocorrelation of absolute returns")
dev.off()

请注意下面新图中的自相关。

这些回报的平均值和均方差是多少?

> mu
[1] 0.001369495
> sigma
[1] 0.02572958

什么是波动性?

定义

波动率是收益率的年化均方差。20的波动率意味着一年后资产价格从现值下跌或上涨超过20%的可能性约为三分之一。这是基于收益率是对数正态分布的假设,这不是真的,但它仍然是一个有用的建模假设,至少作为起点。在R中,给定一系列每日价格,对数回报的年化均方差的计算如下:

sqrt(252) * sd(diff(log(priceSeriesDaily))) * 100

使用收益率模拟股票价格

似乎对数收益率有一个稳定的均值和均方差。让我们假设它们实际上是正态分布的,所以模拟股票价格的目的。假设对数收益率正态分布为均方差μ和均方差sigma。那么我们如何模拟价格?回想一下对数收益率的定义:

重新安排我们得到

因此,我们将使用以下方法来模拟股票价格:

1.设置一个初始化价格(在下面的代码中是100)。2.从正态分布中绘制一个随机数,平均μ和均方差sigma是模拟的参数。这个数字将代表日志返回。3.对日志返回进行指数运算,并将其与之前的价格相乘以获得新的价格。4.重复步骤2.和3.进行许多模拟步骤。

练习

执行上述步骤以模拟价格过程并生成单个模拟价格轨迹,并绘制它以生成如下图的图形:

解答

plot(p, type = "l"
dev.off()

练习

将上一个练习中的模拟代码包装在一个函数中,并使用它来产生6种不同的模拟价格轨迹。使用

par(mfrow=c(3,3)) 

将它们放在3×3的网格中,以便可以直观地比较。它们可能会产生如下内容:

解答

 
par(mfrow=c(3,3))
for (i in 1:6) dotion(simNumber=i)
dev.off()


可下载资源

关于作者

Kaizong Ye拓端研究室(TRL)的研究员。在此对他对本文所作的贡献表示诚挚感谢,他在上海财经大学完成了统计学专业的硕士学位,专注人工智能领域。擅长Python.Matlab仿真、视觉处理、神经网络、数据分析。

本文借鉴了作者最近为《R语言数据分析挖掘必知必会 》课堂做的准备。

​非常感谢您阅读本文,如需帮助请联系我们!

 
QQ在线咨询
售前咨询热线
15121130882
售后咨询热线
0571-63341498

关注有关新文章的微信公众号


永远不要错过任何见解。当新文章发表时,我们会通过微信公众号向您推送。

技术干货

最新洞察

This will close in 0 seconds