Search code examples
rfinancetime-seriesquantmodyahoo-finance

How to turn the quarterly data returned by quantmod's viewfin function into a monthly time series?


...either spline- (best) or linear-interpolated (OK) or just repeated values (fine) throughout the quarter. The issue is that I do not know how to convert the data type returned by getFin() and viewFin() into something timeSeries-type usable. Here is my code:

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

My desired output is

> 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

However, here is some actual output:

> 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" ...

It looks like the x object is in some strange reverse format, where the key is the numeric value, and the value is a character string of the date. When I try to extract dates, or the numeric component, I cannot isolate the numeric portion to generate a time series object.

Ideally, to get to my desired output, I would be able to say

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

But I can't seem to extract the numeric data portion.

UPDATE

From here and here, I adapted the following code:

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

However, my output mangles the dates a bit and messes up the interpolation:

>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 

As you can see, I have both 12-30 and 12-31, 3 values for March-2011, but no February, etc. How to solve this?


Solution

  • UPDATE 2:

    Please post a better answer! This is really ugly, but here's how I got something acceptable:

    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]
    

    Which converts

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

    into

    > 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 
    

    I find this too ugly to be true, so I post this answer, but want someone else to post a handsomer one.