2015-03-19 2 views
4

Я владею русским языком и работаю с ежедневным индексом дневных рядов из разных стран. Для того, чтобы проводить сравнения между разными индексами (например, корреляцией, причинностью и т. Д.), Мне нужно, чтобы все серии имели одинаковое количество строк, но поскольку различия в праздниках в разных странах, количество строк в каждой серии изменяется.R: Как изменить промежутки (праздники) во временном ряду дневного индекса фондовой биржи по информации предыдущего дня?

Я работаю с извлеченными файлами из Yahoo финансов, с формате .csv, как ...

> head(sp) 
>   Date Open High  Low Close  Volume Adj.Close 
>1288 2010-01-04 1116.56 1133.87 1116.56 1132.99 3991400000 1132.99 
>1287 2010-01-05 1132.66 1136.63 1129.66 1136.52 2491020000 1136.52 
>1286 2010-01-06 1135.71 1139.19 1133.95 1137.14 4972660000 1137.14 

мне нужно ... Например, предположим, что день 2010-01-07 праздник , в этом случае, следующая строка (строка 1285) в файле день 2010-01-08:

> head(sp) 
>   Date Open High  Low Close  Volume Adj.Close 
>1288 2010-01-04 1116.56 1133.87 1116.56 1132.99 3991400000 1132.99 
>1287 2010-01-05 1132.66 1136.63 1129.66 1136.52 2491020000 1136.52 
>1286 2010-01-06 1135.71 1139.19 1133.95 1137.14 4972660000 1137.14 
>1285 2010-01-08 1140.52 1145.39 1136.22 1144.98 4389590000 1144.98 

при необходимости заполнить пробел в 2010-01-07 с днем ​​данных previus, как:

> head(sp) 
>   Date Open High  Low Close  Volume Adj.Close 
>1288 2010-01-04 1116.56 1133.87 1116.56 1132.99 3991400000 1132.99 
>1287 2010-01-05 1132.66 1136.63 1129.66 1136.52 2491020000 1136.52 
>1286 2010-01-06 1135.71 1139.19 1133.95 1137.14 4972660000 1137.14 
>1285 2010-01-07 1135.71 1139.19 1133.95 1137.14 4972660000 1137.14 
>1284 2010-01-08 1140.52 1145.39 1136.22 1144.98 4389590000 1144.98 

Как я могу это сделать ???

Мой код (смотрите всю библиотеку, которую я попытался использовать для решения моей проблемы ККК)

>library(PerformanceAnalytics) 
>library(tseries) 
>library(urca) 
>library(zoo) 
>library(lmtest) 
>library(timeDate) 
>library(timeSeries) 

>setwd("C:/Users/Fatima/Documents/R") 

>sp = read.csv("SP500.csv", header = TRUE, stringsAsFactors = FALSE) 
>sp$Date = as.Date(sp$Date) 
>sp = sp[order(sp$Date), ] 

Sorry о моем плохом английском

+2

любви к '' quantmod' и xts'? – Khashaa

+0

Отличный вопрос! У тебя только первый взлет! –

ответ

3

XTS Пакет полезно здесь:

DF <- read.table(text = "   Date Open High  Low Close  Volume Adj.Close 
1288 2010-01-04 1116.56 1133.87 1116.56 1132.99 3991400000 1132.99 
1287 2010-01-05 1132.66 1136.63 1129.66 1136.52 2491020000 1136.52 
1286 2010-01-06 1135.71 1139.19 1133.95 1137.14 4972660000 1137.14 
1285 2010-01-08 1140.52 1145.39 1136.22 1144.98 4389590000 1144.98", header = TRUE) 

DF$Date <- as.Date(DF$Date) 

library(xts) 
X <- as.xts(DF[,-1], order.by = DF$Date) 
na.locf(merge(X, seq(min(DF$Date), max(DF$Date), by = 1))) 
#    Open High  Low Close  Volume Adj.Close 
#2010-01-04 1116.56 1133.87 1116.56 1132.99 3991400000 1132.99 
#2010-01-05 1132.66 1136.63 1129.66 1136.52 2491020000 1136.52 
#2010-01-06 1135.71 1139.19 1133.95 1137.14 4972660000 1137.14 
#2010-01-07 1135.71 1139.19 1133.95 1137.14 4972660000 1137.14 
#2010-01-08 1140.52 1145.39 1136.22 1144.98 4389590000 1144.98 

Редактировать:

В ответ на ваш комментарий: Вы можете исключить выходные, как это:

dates <- seq(min(DF$Date), max(DF$Date), by = 1) 
#you might have to adjust the following to the translations in your locale 
dates <- dates[!(weekdays(dates) %in% c("Saturday", "Sunday"))] 
na.locf(merge(X, dates)) 
+1

Будет ли это решение работать и в случае отсутствия пропущенных дней? Например. если 2 дня будут отсутствовать, будет ли это также работать? –

+0

@TimBiegeleisen Попробуйте и посмотрите. (Да, это было бы так.) – Roland

+0

hanks много, =) но, как и G. Grothendieck do ... этот код заполняет пробелы в выходные дни, и мне нужно заполнить дни без данных с понедельника по пятницу. Дни, которые праздники на бирже. –

2

Прочтите в использовании read.zoo, добавить недостающие дни путем слияния нулевой шириной зоопарка серии со всеми датами. Наконец, используйте na.locf для заполнения значений NA, сгенерированных слиянием.

Lines <- "Date,Open,High,Low,Close,Volume,Adj.Close 
2010-01-04,1116.56,1133.87,1116.56,1132.99,3991400000,1132.99 
2010-01-05,1132.66,1136.63,1129.66,1136.52,2491020000,1136.52 
2010-01-06,1135.71,1139.19,1133.95,1137.14,4972660000,1137.14 
2010-01-11,1140.52,1145.39,1136.22,1144.98,4389590000,1144.98" 

library(zoo) 
z <- read.zoo(text = Lines, header = TRUE, sep = ",") 
zout <- na.locf(merge(z, zoo(, seq(start(z), end(z), by = "day")))) 

дает:

> zout 
       Open High  Low Close  Volume Adj.Close 
2010-01-04 1116.56 1133.87 1116.56 1132.99 3991400000 1132.99 
2010-01-05 1132.66 1136.63 1129.66 1136.52 2491020000 1136.52 
2010-01-06 1135.71 1139.19 1133.95 1137.14 4972660000 1137.14 
2010-01-07 1135.71 1139.19 1133.95 1137.14 4972660000 1137.14 
2010-01-08 1135.71 1139.19 1133.95 1137.14 4972660000 1137.14 
2010-01-09 1135.71 1139.19 1133.95 1137.14 4972660000 1137.14 
2010-01-10 1135.71 1139.19 1133.95 1137.14 4972660000 1137.14 
2010-01-11 1140.52 1145.39 1136.22 1144.98 4389590000 1144.98 

Альтернатива к na.locf линии является использование na.approx с method = "constant" вместо:

na.approx(z, xout = seq(start(z), end(z), by = "day"), method = "constant") 

дает тот же ответ.

Добавлено Для NA из уикэнды:

library(chron) 
zout[is.weekend(time(zout)), ] <- NA 

или возвращать только будни:

library(chron) 
zout[!is.weekend(time(zout))] 
+0

Спасибо большое, =) но у меня все еще есть проблема, потому что этот метод заполняет пробелы, потому что выходные и мне нужно заполнить только праздники .. другими словами, дни без данных с понедельника по пятницу. –

+0

Добавили код NA или удалили выходные. –

Смежные вопросы