我正在使用以下代码:
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"
您是否可以看一下并告诉我出了什么问题?非常感谢您的帮助。
在
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