R - 从第一行的初始投资开始,然后在满足条件时乘以价格回报

时间:2018-03-15 20:25:49

标签: r data.table time-series finance moving-average

我有一个价格时间序列,我正在尝试创建一个函数,在新的给定列中:

  • 对于第一行(价格时间序列的第一天),值为100(初始投资的示例)
  • 然后,对于后续行,将100的初始投资乘以今天的价格/昨天的价格,如果满足条件(这里,ma 10> ma 30)。

这是我的代码:

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的值。

任何提示:)?

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做同样的事情。