Skip to content

PerformanceAnalytics - Style Analysis- plotting R squared over time

9 messages · Philipp Haumueller, Kent Russell, Brian G. Peterson +3 more

#
Take a look at the code itself - it implements what you are asking for. 
In particular, pay attention to the rollapply functions.
function (R.fund, R.style, method = c("constrained", "unconstrained",
    "normalized"), leverage = FALSE, selection = "none", width = 12,
    main = paste(colnames(R.fund)[1], " Rolling ", width, "-Month Style
Weights",
        sep = ""), space = 0, ...)
{
    R.fund = checkData(R.fund[, 1, drop = FALSE], method = "zoo")
    R.style = checkData(R.style, method = "zoo")
    method = method[1]
    columns.fund = ncol(R.fund)
    columns.style = ncol(R.style)
    columnnames.fund = colnames(R.fund)
    columnnames.style = colnames(R.style)
    merged.assets = na.omit(merge(R.fund, R.style))
    result = rollapply(data = merged.assets, FUN = function(x) {
        t(style.fit(R.fund = x[, 1, drop = FALSE], R.style = x[,
            -1, drop = FALSE], method = method, leverage = leverage,
            selection = selection)$weights)
    }, width = width, by = 1, by.column = FALSE, na.pad = FALSE,
        align = "right")
    fit = rollapply(data = merged.assets, FUN = function(x) {
        t(style.fit(R.fund = x[, 1, drop = FALSE], R.style = x[,
            -1, drop = FALSE], method = method, leverage = leverage,
            selection = selection)$R.squared)
    }, width = width, by = 1, by.column = FALSE, na.pad = FALSE,
        align = "right")
    colnames(result) = columnnames.style
    rows = nrow(result)
    ymax = max(c(1, result))
    ymin = min(c(-1, result))
    op <- par(oma = c(2, 0, 4, 0), mar = c(0, 4, 0, 4))
    layout(matrix(c(1:columns.style, columns.style + 1, columns.style +
        2), nc = 1, byrow = TRUE))
    for (i in 1:columns.style) {
        if (even(i))
            yaxis.right = TRUE
        else yaxis.right = FALSE
        chart.TimeSeries(result[, i, drop = F], type = "h", lend = "butt",
            xaxis = FALSE, main = "", ylab = colnames(result)[i],
            ylim = c(ymin, ymax), yaxis.right = yaxis.right,
            ...)
    }
    positives = result
    for (column in 1:ncol(result)) {
        for (row in 1:nrow(result)) {
            positives[row, column] = max(0, result[row, column])
        }
    }
    negatives = result
    for (column in 1:ncol(result)) {
        for (row in 1:nrow(result)) {
            negatives[row, column] = min(0, result[row, column])
        }
    }
    sumpositives = zoo(apply(positives, 1, sum), order.by = index(positives))
    sumnegatives = zoo(apply(negatives, 1, sum), order.by = index(negatives))
    net = apply(result, 1, sum)
    if (even(columns.style + 1))
        yaxis.right = TRUE
    else yaxis.right = FALSE
    chart.TimeSeries(cbind(sumpositives, sumnegatives), type = "h",
        lend = "butt", xaxis = FALSE, main = "", ylab = "Total",
        yaxis.right = yaxis.right, ...)
    lines(1:rows, net)
    if (even(columns.style + 2))
        yaxis.right = TRUE
    else yaxis.right = FALSE
    chart.TimeSeries(fit, type = "l", xaxis = TRUE, main = "",
        ylab = "AdjR^2", ylim = c(0, 1), yaxis.right = yaxis.right,
        ...)
    mtext(main, side = 3, outer = TRUE, font = 2, cex = 1.2,
        line = 1)
    par(op)
}
#
Phil,

I think the error message is clear - the data series you're using as the
"fund" data, Rfund.z, isn't being recognized as a format that is
convertible to a time series object (for conversion into an xts object). 
Look at ?as.xts and consider constructing xts objects for both timeseries.
 Or you might use Return.read from PerformanceAnalytics to load the series
in from a csv file.

pcc
#
I got the same error and data is definitely xts.  I will try to debug today.  Looks like my function works fine on a cumulative basis or if I use for loop but does not work with rollapply.

Kent
On Sep 7, 2011, at 6:13 AM, "Peter Carl" <peter at braverock.com> wrote:

            
#
On Wed, 2011-09-07 at 06:28 -0500, Kent Russell wrote:
<...>
This doesn't look like xts. An xts object of even one column will
display with your dates as the index, and observations as rows.

Your second, two column, series does look like an appropriately
formatted xts object or matrix.

Regards,

  - Brian
#
The error, "The data cannot be converted into a time series," is thrown by
checkData, a function that makes sure the data is xtsible.  It won't throw
the error if it is a timeseries that can be converted to xts.  If you are
seeing a different error, please follow the posting guidelines and provide
a reproducible example.

pcc
#
Try str() or better yet dput() the data or subset of it to let us actually see the problem as opposed to guessing. 

as.xts would be more illustrative in thi case as well, since that is the end goal. 

Jeff

Jeffrey Ryan    |    Founder    |    jeffrey.ryan at lemnica.com

www.lemnica.com
On Sep 7, 2011, at 4:08 PM, tonyp <petrovaa at gmail.com> wrote: