[R-SIG-Finance] PerformanceAnalytics - Style Analysis- plotting R squared over time

Peter Carl peter at braverock.com
Tue Sep 6 23:01:14 CEST 2011


Take a look at the code itself - it implements what you are asking for. 
In particular, pay attention to the rollapply functions.

> page.RollingStyle
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)
}

-- 
Peter Carl
http://www.braverock.com/~peter

> Hi Carl,
>
>  Many thanks for your quick reply. Just a follow up on  this. While I have
> installed PA pages I wasn't too successful in finding  further information
> in respect of implementing the function.page RollingStyle which would
> allow
> me to plot the R-squared over time for my returns based analysis
> (Sharpe-model).Would you mind pointing me to some further information?
>
>   Also, is there a straightforward way to chart or calculate each factor
> weight
>  so  that the values can be read easily (while chart.RollingStyle. gives a
> good graphical impression of the styles, I'd also be interested in
> obtaining  an idea of the exact weightings at some point in time, e.g.
> showing  min/max over time and potentially also some kind of summary
> statistics like avg or sd of the style attributes)
>
>  Some help on this would be awesome - thks.
>
>  Phil
>>         -------- Original-Nachricht --------
>> Datum: Tue, 6 Sep 2011 09:38:37 -0500
>> Von: "Peter Carl" <peter at braverock.com>
>> An: "Philipp Haumueller" <phaumueller at gmx.net>
>> CC: r-sig-finance at r-project.org
>> Betreff: Re: [R-SIG-Finance] PerformanceAnalytics - Style Analysis-
>> plotting R squared over time
>>
>>         Phil,
>>
>> The function page.RollingStyle in PApages (also on RForge) shows
>> something
>> of a brute-force way to do it.  I'm sure there's a better way, but that
>> should work for you.
>>
>> pcc
>> --
>> Peter Carl
>> http://www.braverock.com/~peter
>>
>> > Dear all,
>> >
>> > I am running some analysis based on an asset factor model (Sharpe
>> model
>> -
>> > Style Analyses) in the Package PerformanceAnalytics/R-Forge.While
>> > calculating weights etc. works fine I would also like to
>> calculate/plot
>> > rolling R-squared values of the Sharpe model over time? Are there any
>> > suggestions how to run this?
>> >
>> > Your help is greatly appreciated - thx,
>> >
>> > Phil
>> > --
>> >
>> >
>> >
>> > 	[[alternative HTML version deleted]]
>> >
>> > _______________________________________________
>> > R-SIG-Finance at r-project.org mailing list
>> > https://stat.ethz.ch/mailman/listinfo/r-sig-finance
>> > -- Subscriber-posting only. If you want to post, subscribe first.
>> > -- Also note that this is not the r-help list where general R
>> questions
>> > should go.
>> >
>>
>>
>>
>
> --
> Empfehlen Sie GMX DSL Ihren Freunden und Bekannten und wir
> belohnen Sie mit bis zu 50,- Euro! https://freundschaftswerbung.gmx.de
>



More information about the R-SIG-Finance mailing list