我有一个非常基本的问题...假设我可以使用
获取xts对象中当前日期的特定符号的收盘价closePrice<-as.double(Cl(get(symbol))[currentDate])
我怎样才能在交易日的一天,两天,三天,......或者前一天或后一天获得收盘价?
closePriceNDaysBefore<-as.double(Cl(get(symbol))[currentDate - n])
不行......
提前致谢。
亲切的问候, 萨莫。
答案 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))