Skip to content
Prev 8454 / 15274 Next

PerformanceAnalytics - Style Analysis- plotting R squared over time

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