关于如何在xts中获取next / previous元素的基本问题

时间:2011-02-24 22:40:21

标签: r finance xts

我有一个非常基本的问题...假设我可以使用

获取xts对象中当前日期的特定符号的收盘价
closePrice<-as.double(Cl(get(symbol))[currentDate]) 

我怎样才能在交易日的一天,两天,三天,......或者前一天或后一天获得收盘价?

closePriceNDaysBefore<-as.double(Cl(get(symbol))[currentDate - n]) 

不行......

提前致谢。

亲切的问候, 萨莫。

4 个答案:

答案 0 :(得分:3)

根据“当前日期”的含义,您可以相当轻松地完成此操作。

如果当前日期是最后一个条目(只是提取最新数据),那么last和first将有所帮助:

> x <- xts(1:10, Sys.Date()-0:9)
> x <- xts(1:10, Sys.Date()-0:9)
> x
           [,1]
2011-02-16   10
2011-02-17    9
2011-02-18    8
2011-02-19    7
2011-02-20    6
2011-02-21    5
2011-02-22    4
2011-02-23    3
2011-02-24    2
2011-02-25    1

# gets the last 3 periods (days here)
> last(x,3)  # or last(x, "3 days")
           [,1]
2011-02-23    3
2011-02-24    2
2011-02-25    1

# this would get you the 3rd day back from the end
> first(last(x,3),1)
           [,1]
2011-02-23    3

如果您需要当前日期表示您在此特定循环/上下文中关注的日期,则该子集的 which.i = TRUE 参数将有所帮助 - 因为它使用了非常相同的快速ISO查找,但返回匹配的位置。也就是说,它没有做子集。

> x[x["2011-02-25", which.i=TRUE] - 0]  # today
           [,1]
2011-02-25    1

> x[x["2011-02-25", which.i=TRUE] - 1]  # yesterday
           [,1]
2011-02-24    2
> x[x["2011-02-25", which.i=TRUE] - 2]  # 2 days ago...
           [,1]
2011-02-23    3

> x[x["2011-02-25", which.i=TRUE] - 3]  # you get the idea ;-)
           [,1]
2011-02-22    4

> x["2011-02-25", which.i=TRUE] 
[1] 10

答案 1 :(得分:0)

假设您的数据是每日且仅包含交易日,则在子集化之前滞后时间序列。

closePriceNDaysBefore <- as.double(lag(Cl(get(symbol)),n)[currentDate])

如果这不起作用,请更具体地说明您的数据结构。

答案 2 :(得分:0)

使用which()并将日期字符串与rownames匹配。然后结果是数字,可以作为数字索引处理:

M <- as.xts(read.table(textConnection(" SPY.Close    mavg      dn.1      up.1 
2010-11-18    119.96 120.713 118.17955 119.99845   
2010-11-19    120.29 120.470 118.33112 120.09688   
2010-11-22    120.19 120.240 118.47911 120.18489   
2010-11-23    118.45 119.924 118.55112 120.20888   
2010-11-24    120.20 119.734 118.63565 120.27635   
") ) )
> M[which(rownames(M)=="2010-11-22"), "SPY.Close"]
[1] 120.19
> M[which(rownames(M)=="2010-11-22")-1, "SPY.Close"]
[1] 120.29

感谢J. Winchester指出由quantmod的顺序应用getSymbols和Cl函数生成的xts对象具有空或NULL rownames,但time()函数可以访问该信息并用作:
which(as.character(time(M))=="2010-11-22")

答案 3 :(得分:0)

记住你可以通过取尾或头来向任一方向移动矢量是很有用的。在您的情况下,在开始时附加NA,因为第一天没有“昨天”。

M$Prev.Close <- c(NA, head(M$SPY.Close, -1))