Как превратить квартальные данные, возвращаемые функцией viewfin для Quantmod, в месячные временные ряды? - PullRequest
2 голосов
/ 17 ноября 2011

... либо сплайн- (лучший) или линейно-интерполированный (ОК), либо просто повторные значения (штраф) в течение квартала.Проблема в том, что я не знаю, как преобразовать тип данных, возвращаемый getFin() и viewFin(), во что-то пригодное для использования timeSeries.Вот мой код:

getFin('F')
x <- viewFin(F.f, "BS", period="Q")["Total Common Shares Outstanding",]*1000

Мой желаемый вывод -

> x
GMT     x.ts
2011-09-01  3816000
2011-08-01  3816000
2011-07-01  3816000
2011-06-01  3815000
2011-05-01  3815000
2011-04-01  3815000
2011-03-01  3813000
2011-02-01  3813000
2011-01-01  3813000
2010-12-01  3778000
2010-11-01  3778000
2010-10-01  3778000
2010-09-01  3484000

Однако, вот фактический вывод:

> x
2011-09-30 2011-06-30 2011-03-31 2010-12-31 2010-09-30 
   3816000    3815000    3813000    3778000    3484000 
> str(x)
 Named num [1:5] 3816000 3815000 3813000 3778000 3484000
 - attr(*, "names")= chr [1:5] "2011-09-30" "2011-06-30" "2011-03-31" "2010-12-31" ...

Это похоже на объект xв каком-то странном обратном формате, где ключом является числовое значение, а значением является символьная строка даты.Когда я пытаюсь извлечь даты или числовой компонент, я не могу выделить числовую часть для создания объекта временного ряда.

В идеале, чтобы получить желаемый результат, я мог бы сказать

mydates <- timeSequence(from = "2011-01-01", to=Sys.Date(), by = "month")
series <- timeSeries(x$data, mydates)

Но я не могу извлечь часть числовых данных.

ОБНОВЛЕНИЕ

С здесь и здесь , я адаптировал следующий код:

getFin('F')
x <- viewFin(F.f, "BS", period="Q")["Total Common Shares Outstanding",]*1000
zoox = zoo(x, order.by=as.Date(names(x)))
x2 <- na.spline(merge(zoox, foo=zoo(NA, order.by=seq(start(zoox), end(zoox), "month")))[, 1])

Однако мой вывод немного искажает даты и портит интерполяцию:

>x2
2010-09-30 2010-10-30 2010-11-30 2010-12-30 2010-12-31 2011-01-30 2011-03-02 
   3484000    3623591    3720509    3776671    3778000    3804738    3813071 
2011-03-30 2011-03-31 2011-04-30 2011-05-30 2011-06-30 2011-07-30 2011-08-30 
   3813025    3813000    3813100    3814116    3815000    3814976    3814884 
2011-09-30 
   3816000 

Как видите, у меня есть 12-30 и 12-31, 3 значения дляМарт-2011, но не февраль и т. Д. Как это решить?

Ответы [ 2 ]

1 голос
/ 26 мая 2013

У меня была такая же проблема - я написал две функции, чтобы это произошло.

Во-первых, вы хотите, чтобы функция даты перемещала даты, так как вы, вероятно, хотите, чтобы даты окончания месяца были, но R обрабатывает даты первого числа гораздо проще.

Функции даты

toLastDay <- function(dateObj, monAdv=0, ToFirst = FALSE)
# takes date object, transforms and returns a dat object
{
  tt <- as.POSIXlt(dateObj)
  tt$mon <- tt$mon + monAdv # moves the month
  tt$mday <- 1L             # make date the first
  if(ToFirst) {             
      tt <- as.Date(tt)
  } else { 
      tt$mon <- tt$mon + 1L # go to the first of the next month
      tt <- as.Date(tt) - 1L # subtract one day, yielding the last of prior month
  }
  return(tt)
}

Теперь вам нужна функция, которая принимает данные и выполняет линейное взаимодействие - я использую функцию na.approx в zoo и xts.Здесь вам, вероятно, нужны даты середины квартала - большинство моих данных лучше всего считать серединой квартала.

# make Qtrly monthly -- with obsv in the mid qtr
qtr2Mon <- function(QD) 
{
    fromD <- toLastDay(index(first(QD)), -2L, ToFirst = TRUE)
    toD <- toLastDay(index(last(QD)), ToFirst = TRUE)
    q2m_dates <- toLastDay(seq(fromD, toD, by = 'mon'))
    emptyX <- xts(, q2m_dates)
    QD_adj <- QD
    index(QD_adj) <- toLastDay(index(QD), monAdv = -1L)
    mm <- merge(emptyX, QD_adj)
    mm_filled <- na.approx(mm)
    return(mm_filled)
}

Сначала мы создаем объект qtrly xts - представьте, что он равен qtrly GDP или некоторым другим

Sys.setenv(TZ = 'GMT')
require(xts)

qdates <- seq(as.Date("2000-03-01"), as.Date("2013-06-01"), by = "3 mon")
qdates <- toLastDay(qdates)
qdata <- rnorm(length(qdates), mean = 1)
qtr_XTS <- xts(qdata, order.by = qdates)

Теперь мы можем использовать перечисленные выше библиотечные функции для преобразования его вежемесячно, при условии линейного роста и т. д.

mon_fromQtr <- qtr2Mon(qtr_XTS)

готово!

0 голосов
/ 18 ноября 2011

ОБНОВЛЕНИЕ 2 :

Пожалуйста, оставьте лучший ответ!Это действительно уродливо, но вот как я получил что-то приемлемое:

getFin('F')
x <- viewFin(F.f, "BS", period="Q")["Total Common Shares Outstanding",]*1000
zoox = zoo(x, order.by=as.Date(names(x)))
foo=zoo(NA, order.by=seq(as.Date(as.character(timeFirstDayInMonth(start(zoox)))), as.Date(as.character(timeFirstDayInMonth(end(zoox)))), "month"))
foo2 <- na.approx(merge(zoox, foo)[, 1])
fx <- merge(foo2,foo, all=FALSE)[,1]

, который преобразует

> x
2011-09-30 2011-06-30 2011-03-31 2010-12-31 2010-09-30 
   3816000    3815000    3813000    3778000    3484000 

в

> fx
2010-10-01 2010-11-01 2010-12-01 2011-01-01 2011-02-01 2011-03-01 2011-04-01 
   3487196    3586261    3682130    3778389    3790444    3801333    3813022 
2011-05-01 2011-06-01 2011-07-01 2011-08-01 2011-09-01 
   3813681    3814363    3815011    3815348    3815685 

Я считаю, что это слишком уродливоправда, поэтому я отправляю этот ответ, но хочу, чтобы кто-то еще опубликовал более красивый.

...