根据进入/退出值xts聚合位置值

时间:2014-09-18 19:09:31

标签: r xts finance

我尝试使用进入/退出信号生成位置/信号数据列以进行分析。我希望输入信号是累积的,并且退出值表示所有当前输入位置的退出。此外,我希望能够处理没有任何当前进入位置的退出信号(当然,这应该没有任何结果)。在保留累积属性的同时,似乎无法合理地合并最后一个函数。

我以为我可以用这个解决方案到达那里。我无法让最后一部分为我工作。

Change value of some column in xts based on other columns values with lookback

从引用的问题中借用一些任意的输入/退出数据:

> Entry <- c(1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0)
> Exit <- c(0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1)

所需的解决方案如下所示:

> DesiredOutcome
      Entry Exit Signal
 [1,]     1    0      1
 [2,]     0    0      1
 [3,]     0    0      1
 [4,]     1    0      2
 [5,]     0    0      2
 [6,]     0    0      2
 [7,]     1    0      3
 [8,]     0    0      3
 [9,]     0    1      3
[10,]     0    0      0
[11,]     0    0      0
[12,]     0    1      0
[13,]     1    0      1
[14,]     0    0      1
[15,]     0    0      1
[16,]     1    0      2
[17,]     0    0      2
[18,]     0    0      2
[19,]     0    1      2
[20,]     0    0      0
[21,]     0    1      0
[22,]     1    0      1
[23,]     0    0      1
[24,]     0    1      1

非常感谢任何帮助!

更新。根据要求,这里有一些尝试来解决那个效率不高的问题。

不是使用Entry / Exit / Signal列,而是尝试使用嵌套的ifelse语句查询指示符(在这种情况下为s $ Z203)。输入值小于-2,退出大于2。

  

s $ position&lt; - ifelse(s $ Z203&gt; = 2,0,       ifelse(S $ Z203&LT; = - 2,S $位置+ 1,S $位置+滞后(S $位置)))

使用多列方法我认为我可以使用简单的算法(如在已发布的示例中)并避免在迭代数据时查询xts对象的前一行。有几个课程列来完成程序让我接近,但仍然没有解决1退出触发器应用于所有聚合入口信号并忽略没有任何入口位置的退出信号。

1 个答案:

答案 0 :(得分:1)

您按小组计算cumsum Entry,其中小组是滞后cumsum列的Exit。有很多方法可以“分裂,应用,结合”。其中之一是ave

> cbind(Entry, Exit, Signal=ave(Entry, cumsum(c(0, head(Exit, -1))), FUN=cumsum))
      Entry Exit Signal
 [1,]     1    0      1
 [2,]     0    0      1
 [3,]     0    0      1
 [4,]     1    0      2
 [5,]     0    0      2
 [6,]     0    0      2
 [7,]     1    0      3
 [8,]     0    0      3
 [9,]     0    1      3
[10,]     0    0      0
[11,]     0    0      0
[12,]     0    1      0
[13,]     1    0      1
[14,]     0    0      1
[15,]     0    0      1
[16,]     1    0      2
[17,]     0    0      2
[18,]     0    0      2
[19,]     0    1      2
[20,]     0    0      0
[21,]     0    1      0
[22,]     1    0      1
[23,]     0    0      1
[24,]     0    1      1

如果你开始使用xts,你可以这样做

x <- .xts(cbind(Entry, Exit), seq_along(Entry))
x$Signal <- with(xx, ave(Entry, cumsum(c(0, lag(Exit, na.pad=FALSE))), FUN=cumsum))