我有一个大的时间序列文件,我从我的工作目录导入,然后通过以下方式将它们转换为日志返回:
read.csv("/Volumes/3TB/ALLsince1996.csv",header=T)-> ALL
all <- xts(ALL[,2:dim(ALL)[2]], order.by= as.POSIXct(ALL[,1], format="%m/%d/%y"))
RETS <- CalculateReturns(all, method= c("log"))
RETS<- na.locf(RETS)
RETS[is.na(RETS)] <- 0
然后我通过FRED下载3个月的Treaury:
# 3-Mo Treasury
data <- new.env()
FEDs <- c( "DGS3MO") # DGS3MO : 3-Mo Treasury Constant maturity
getSymbols( FEDs
, src = "FRED"
, env = data
)
data$DGS3MO -> TB3
TB3/100/365 -> TB3
na.locf(TB3["1996-01-01::"])-> TB3
然后我尝试使用cbind()
将日志返回系列与3个月的资金库相结合,并获得以下内容:
both <- cbind(RETS[,1], TB3)
两个
row.names ZX.Adjusted DGS3MO
1 1995-12-31 16:00:00 NA NA
2 1996-01-01 00:00:00 0 NA
3 1996-01-01 16:00:00 NA 0.0001424658
4 1996-01-02 00:00:00 0 NA
5 1996-01-02 16:00:00 NA 0.0001424658
6 1996-01-03 00:00:00 0 NA
7 1996-01-03 16:00:00 NA 0.0001421918
8 1996-01-04 00:00:00 0 NA
9 1996-01-04 16:00:00 NA 0.0001421918
但是这会每天返回两次矢量;例如1996-01-01 00:00:00
和1996-01-01 16:00:00
。我想要的是按日期而不是时间将两者结合起来。
可重复数据:
#Pull Data from getSymbols()
library(quantmod)
dataset<- xts()
symbols <- c( "GLD", "IWM", "SPY", "GS")
system.time(
for(i in 1:length(symbols)) {
symbols[i]-> symbol
tryit <- try(getSymbols(symbol, from="1995-12-31", src='yahoo'))
if(inherits(tryit, "try-error")){
i <- i+1
} else {
data <- getSymbols(symbol, from="1995-12-31", src='yahoo')
dataset <- merge(dataset, Ad(get(symbols[i])))
rm(symbol)
}
}
)
因为它是一个大文件,我将dataset
和index(dataset)
保存在两个单独的文件中,因为我无法使用数据集保存索引
write.csv(dataset, "dataset.csv")
write.csv(index(dataset), "index.csv")
我后来在Excel&amp;中打开了index.csv
文件。手动将索引粘贴到dataset.csv
&amp;保存了该文件。我后来尝试重新打开.csv
到我的工作区&amp;计算日志返回
read.csv("dataset.csv",header=T)-> ALL
all <- xts(ALL[,2:dim(ALL)[2]], order.by= as.POSIXct(ALL[,1], format="%m/%d/%y"))
RETS <- CalculateReturns(all, method= c("log"))
RETS<- na.locf(RETS)
RETS[is.na(RETS)] <- 0
下载3个月的T-Bill,与上面相同的代码......
# 3-Mo Treasury
data <- new.env()
FEDs <- c( "DGS3MO") # DGS3MO : 3-Mo Treasury Constant maturity
getSymbols( FEDs
, src = "FRED"
, env = data
)
data$DGS3MO -> TB3
TB3/100/365 -> TB3
na.locf(TB3["1996-01-01::"])-> TB3
现在尝试将RETS1
与TB3
...
both <- cbind(RETS1, TB3)
答案 0 :(得分:1)
@Rime,在没有时间信息的情况下重新格式化索引,使用strptime
函数,然后使用上面建议的merge
系列。
index(dataset) <- strptime(index(dataset),"%Y-%m-%d")
更简单,更优雅地完成您要做的事情的方法是使用具有很多实用程序和辅助函数的奇妙qmao-package(https://r-forge.r-project.org/R/?group_id=1113)来使用makeReturnFrame
函数这种东西。
library(quantmod)
library(qmao)
symbols <- c( "GLD", "IWM", "SPY", "GS")
getSymbols(symbols, from="1995-12-31", src='yahoo')
rets <- makeReturnFrame(symbols,silent = TRUE)
FEDs <- c( "DGS3MO") # DGS3MO : 3-Mo Treasury Constant maturity
data <- new.env()
getSymbols( FEDs
, src = "FRED"
, env = data
)
data$DGS3MO -> TB3
TB3/100/365 -> TB3
na.locf(TB3["1996-01-01::"])-> TB3
series.merged <- merge(rets,TB3,join = "inner")
> tail(series.merged)
GLD IWM SPY GS DGS3MO
2014-08-07 4.050035e-03 -0.004844797 -0.005429405 -0.0037775986 8.219178e-07
2014-08-08 7.924872e-05 0.009666235 0.011502456 0.0185147075 8.219178e-07
2014-08-11 -1.824311e-03 0.009485466 0.002893760 0.0011603622 1.095890e-06
2014-08-12 2.381425e-04 -0.006905738 -0.001394160 -0.0007540822 8.219178e-07
2014-08-13 1.665411e-03 0.007787650 0.006746170 0.0002320859 1.095890e-06
2014-08-14 8.712527e-04 0.001497468 0.004710710 0.0020863525 1.095890e-06
答案 1 :(得分:0)
必须从两个数据集的索引中删除时间组件,才能在日期索引
之间进行正确的合并#Read stock returns data
require(quantmod)
data_agg<- xts()
symbols <- c( "GLD", "IWM", "SPY", "GS")
for(i in 1:length(symbols)) {
symbols[i]->symbol #assign
tryit <- try(getSymbols(symbol, from="1995-12-31", src='yahoo'))
if(inherits(tryit, "try-error")){
i <- i+1
} else {
data <- getSymbols(symbol, from="1995-12-31", src='yahoo')
data_agg <- merge(data_agg, Ad(get(symbols[i])))
rm(symbol)
}
}
head(data_agg)
# GLD.Adjusted IWM.Adjusted SPY.Adjusted GS.Adjusted
#1996-01-02 05:30:00 NA NA 44.91 NA
#1996-01-03 05:30:00 NA NA 45.03 NA
#1996-01-04 05:30:00 NA NA 44.60 NA
#1996-01-05 05:30:00 NA NA 44.51 NA
#1996-01-08 05:30:00 NA NA 44.68 NA
#1996-01-09 05:30:00 NA NA 43.91 NA
#Read interest rate data
data <- new.env()
FEDs <- c( "DGS3MO") # DGS3MO : 3-Mo Treasury Constant maturity
getSymbols( FEDs
, src = "FRED"
, env = data
)
TB3 <- data$DGS3MO
TB3 <- TB3/100/365
TB3 <- na.locf(TB3["1996-01-01::"])
head(TB3)
# DGS3MO
#1996-01-01 NA
#1996-01-02 0.0001424658
#1996-01-03 0.0001424658
#1996-01-04 0.0001421918
#1996-01-05 0.0001421918
#1996-01-08 0.0001419178
cbind不建议用于合并目的,因为它通过强制转换为相同的格式并排放置输入。 merge.xts是跨xts对象合并的方法
#The index of the datasets contain time component hence the doubled rows here
head(merge.xts(data_agg,TB3))
# GLD.Adjusted IWM.Adjusted SPY.Adjusted GS.Adjusted DGS3MO
#1996-01-01 NA NA NA NA NA
#1996-01-01 NA NA 44.91 NA NA
#1996-01-02 NA NA NA NA 0.0001424658
#1996-01-02 NA NA 45.03 NA NA
#1996-01-03 NA NA NA NA 0.0001424658
#1996-01-03 NA NA 44.60 NA NA
head(as.Date(index(data_agg)))
#[1] "1996-01-02" "1996-01-03" "1996-01-04" "1996-01-05" "1996-01-08" "1996-01-09"
#Only one observation per day, since there are no duplicate dates
#We can safely strip the time component from dates
any(duplicated(as.Date(index(data_agg))))
#[1] FALSE
any(duplicated(as.Date(index(TB3))))
#[1] FALSE
#Keep only the date component across both datasets
index(data_agg)<-as.Date(index(data_agg))
index(TB3)<-as.Date(index(TB3))
#Properly merged datasets across date index
head(merge.xts(data_agg,TB3))
# GLD.Adjusted IWM.Adjusted SPY.Adjusted GS.Adjusted DGS3MO
#1995-12-31 NA NA 44.91 NA NA
#1996-01-01 NA NA 45.03 NA 0.0001424658
#1996-01-02 NA NA 44.60 NA 0.0001424658
#1996-01-03 NA NA 44.51 NA 0.0001421918
#1996-01-04 NA NA NA NA 0.0001421918
#1996-01-06 NA NA 44.68 NA NA
您可以使用complete.cases
仅保留非缺失的退货。