1

作業ディレクトリからインポートした大きな時系列ファイルがあり、次の方法でそれらをログ リターンに変換します。

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 か月国債をダウンロードします。

# 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

しかし、これは 1 日 2 回のベクトルを返します。1996-01-01 00:00:00やなど1996-01-01 16:00:00。私が望むのは、時間ではなく日付で2つを結合することです。

再現可能なデータ:

#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)
}
}
)

データセットと一緒にインデックスを保存できなかったため、2 つの別々のファイルに保存datasetした大きなファイルだったのでindex(dataset)

write.csv(dataset, "dataset.csv")
write.csv(index(dataset), "index.csv")

後でindex.csvExcel でファイルを開き、インデックスを手動で貼り付けてファイルをdataset.csv保存しました。後で.csv、ワークスペースに再びアクセスして、ログの戻り値を計算しようとしました

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)
4

2 に答える 2

1

@Rime、時間情報なしでインデックスを再フォーマットするには、strptime関数を使用し、後でmerge上記のシリーズを使用します。

index(dataset) <- strptime(index(dataset),"%Y-%m-%d")

あなたがやろうとしていることを達成するためのはるかに簡単でエレガントな方法はmakeReturnFrame、素晴らしい qmao-package ( https://r-forge.r-project.org/R/?group_id=1113 ) を使用して関数を使用することです。この種のもののための多くのユーティリティとヘルパー関数。

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
于 2014-08-17T09:04:00.850 に答える
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欠落していない返品のみを保持するために使用できます。

于 2014-08-17T09:01:21.383 に答える