我有一个价格时间序列,我正在尝试创建一个函数,在新的给定列中:
这是我的代码:
inv <- function(x){
if(length(x) <2 ){x = 100}
else if(data$ma10 > data$ma30 && length(x) > 1){x = shift(x, 1L, type ="lag") * data$price / shift(data$price, 1L, type = "lag")}
else if(data$ma10 < data$ma30 && length(x) > 1){x = shift(x, 1L, type = "lag")}
}
data$invest = inv(data$invest)
以下是如何重现数据:
# Random prices
data = data.table(price = rnorm(1:300, mean = 100))
#Moving average function
mav <- function(x,n=30) if(length(x) >= n)stats::filter(x,rep(1/n,n), sides=1) else NA_real_
data$ma30 = as.numeric(mav(data$price, n = 30))
data$ma10 = as.numeric(mav(data$price, n = 10))
#Remove NAs
data = subset(data, ma30 != "NA")
不幸的是,我的功能不起作用,只能在所有观察结果中产生大约1的值。
任何提示:)?
答案 0 :(得分:0)
根据定义的data
,你可以做到
data$invest = 100 * cumprod(c(1,ifelse(data$ma10 > data$ma30,
data$price / shift(data$price, 1, type="lag"),
1)[-1]))
基本上这是使用ifelse
语句创建逐年增加因素的虚拟列,删除第一个值(NA
由于滞后)并将其替换为{{1}然后获取这些的累积乘积并乘以1
的起始值。
请注意,您需要加载100
才能使用data.table
功能。否则你可以使用shift
做同样的事情。