在 R 中使用 Quantmod 计算波动率

问题描述 投票:0回答:1

我正在使用以下代码:

slideapply<-function(x,n,FUN=sd){
  v<-c(rep(NA,length(x)))
  
  for(i in n:length(x)){
    v[i]<-FUN(x[(i-n+1):i])
  }
  return(v)
}

augenSpike<-function(x,n=20){
  prchg<-c(NA,diff(x))
  lgchg<-c(NA,diff(log(x)))
  stdevlgchg<-slideapply(lgchg,n,sd)
  stdpr<-x*stdevlgchg
  stdpr<-c(NA,stdpr[-length(stdpr)])
  spike<-prchg/stdpr
  return(spike)
}

应用示例:

require(quantmod)
getSymbols("RIVN")
spike<-augenSpike(as.vector(RIVN$RIVN.Adjusted))
RIVN$spike<-spike
tail(spike,5)

> tail(spike,5)
[1] -0.7975099 -0.2885007 -1.7847045 -1.7714723 -0.3163372

如果我要使用新的股票代码,则无需手动更改代码,使用以下代码片段似乎不会返回任何内容:

ticker<-"BABA"
getSymbols(ticker)
tail(ticker,5)
spike<-augenSpike(as.vector(ticker[,5]
tail(spike)

tail(spike)
Error: unexpected symbol in:
"
tail"

您是否可以看一下并告诉我出了什么问题?非常感谢您的帮助。

r dataframe quantmod
1个回答
0
投票

auto.assign = TRUE
调用中使用
getSymbols()
将数据作为 R 对象返回。在下面的代码中,
x
包含
ticker
的数据。并且您可以使用 quantmod 中的
Ad()
函数来获取调整后的关闭列,而不是使用列号。

library(quantmod)
ticker <- "RIVN"
x <- getSymbols(ticker, auto.assign = FALSE)
spike <- augenSpike(as.vector(Ad(x)))
tail(spike)
## [1] -0.7975099 -0.2885007 -1.7847045 -1.7714723 -0.4984712  1.1262579

另外,我会重写您的

augenSpike()
函数以利用 xts 功能。那么您就不需要
as.vector()
电话了。

augen_spike <-
function(x, n = 20) {
    prchg <- diff(x)
    lgchg <- diff(log(x))
    stdevlgchg <- rollapplyr(lgchg, n, sd)
    stdpr <- lag(x * stdevlgchg)
    spike <- prchg/stdpr
    return(spike)
}
tail(augen_spike(Ad(x)))
##            RIVN.Adjusted
## 2024-01-12    -0.7975099
## 2024-01-16    -0.2885007
## 2024-01-17    -1.7847045
## 2024-01-18    -1.7714723
## 2024-01-19    -0.4984712
## 2024-01-22     1.1262579
© www.soinside.com 2019 - 2024. All rights reserved.