# Geometric Return & Performance Results for Quarterly Rebalancing

I have a Portfolio that is rebalanced every 3-months. The portfolio is made up of assets that have daily log-returns. I am a bit confused when charting the results using R: more specifically charts.PerformanceSummary() by library(PerformanceAnalytics). Take the following Portfolio called EQUALwt which ranges from JAN-2013 to JUN-2014.

EQUALwt <- structure(c(0.0178647409955362, -0.0723746508445446, -0.00458728466704914,
0.238164594011257, -0.211824465096801, 0, -0.0406297323744437,
0, 0.0447620578622464, 0.0158783514305815, -0.0742389273092776,
-0.0275507850334035, 0, 0, 0, 0.00781313587602611, 0, 0.400176058116336,
0, 0, 0.0549071523016913, 0, -0.0102054986300638, 0.18349229377005,
0, 0.503725755135566, 0, 0, 0, 0.173286795139986, -0.134749125183172,
0, -0.144954623813235, 0.106416953856421, 0.117500907311434,
0, 0.00617315314759284, 0.0048310682066007, 0.00561821396301465,
-0.118614494898779, 0.061362327207127, -0.0312907857385016, 0.218867184338475,
-0.18032951438166, 0.0557858878285524, 0, 0, 0, 0, -0.199626924054443,
-0.0679834288709105, 0.173286795139986, 0.0294457589140959, 0,
-0.101366277027041, -0.134749125183172, 0.0982606470274018, -0.00909191104271873,
0.0161346302843927, 0.169349705897952, -0.119893270065472, -0.0950368250309686,
0.0957480630640265, 0.345862352246915, -0.290076464418362, 0.0455803891984886,
-0.29078770245142, 0, -0.101366277027041, 0, -0.00529714841430817,
-0.00392421399289589, 0, 0, 0, 0.00392421399289589, 0, 0, 0.101366277027041,
-0.101366277027041, 0.101366277027041, -0.101366277027041, 0,
0, 0.101366277027041, -0.101366277027041, 0.101366277027041,
-0.101366277027041, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.00459018909397668,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0173932042470827,
0.0195106767517173, -0.0206496308856826, -0.00114416675685292,
0.0144806619331761, 0, 0, 0, 0, -0.0418056903486528, 0.402359478108525,
0, -0.0217528442474074, 0, -0.00220265742053874, 0.0243967543311115,
0.00108460039964958, -0.00217392674188849, -0.0228469378973572,
-0.00240386467486048, -0.0212213330373311, -0.0217528442474074,
-0.0719205181129453), class = c("xts", "zoo"), .indexCLASS = c("POSIXct",
"POSIXt"), .indexTZ = "", tclass = c("POSIXct", "POSIXt"), tzone = "", index =
structure(c(1357084800,
1357171200, 1357257600, 1357516800, 1357603200, 1357689600, 1357776000,
1357862400, 1358121600, 1358208000, 1358294400, 1358380800, 1358467200,
1358726400, 1358812800, 1358899200, 1358985600, 1359072000, 1359331200,
1359417600, 1359504000, 1359590400, 1364774400, 1364860800, 1364947200,
1365033600, 1365120000, 1365379200, 1365465600, 1365552000, 1365638400,
1365724800, 1365984000, 1366070400, 1366156800, 1366243200, 1366329600,
1366588800, 1366675200, 1366761600, 1366848000, 1366934400, 1367193600,
1367280000, 1372636800, 1372723200, 1372809600, 1372896000, 1372982400,
1373241600, 1373328000, 1373414400, 1373500800, 1373587200, 1373846400,
1373932800, 1374019200, 1374105600, 1374192000, 1374451200, 1374537600,
1374624000, 1374710400, 1374796800, 1375056000, 1375142400, 1375228800,
1380585600, 1380672000, 1380758400, 1380844800, 1381104000, 1381190400,
1381276800, 1381363200, 1381449600, 1381708800, 1381795200, 1381881600,
1381968000, 1382054400, 1382313600, 1382400000, 1382486400, 1382572800,
1382659200, 1382918400, 1383004800, 1383091200, 1383177600, 1388534400,
1388620800, 1388707200, 1388966400, 1389052800, 1389139200, 1389225600,
1389312000, 1389571200, 1389657600, 1389744000, 1389830400, 1389916800,
1390176000, 1390262400, 1390348800, 1390435200, 1390521600, 1390780800,
1390867200, 1390953600, 1391040000, 1391126400, 1396310400, 1396396800,
1396483200, 1396569600, 1396828800, 1396915200, 1397001600, 1397088000,
1397174400, 1397433600, 1397520000, 1397606400, 1397692800, 1397779200,
1398038400, 1398124800, 1398211200, 1398297600, 1398384000, 1398643200,
1398729600, 1398816000, 1404172800), tzone = "", tclass = c("POSIXct",
"POSIXt")), .Dim = c(136L, 1L), .Dimnames = list(NULL, "EQUALwtLoHi"))


I am a bit confused for the geometric specification.

# Geometric Return
charts.PerformanceSummary(EQUALwt, geometric=TRUE)

# Non-Geometric Return
charts.PerformanceSummary(EQUALwt, geometric=FALSE)


As you can see they differ quite a bit! I understand that the geometric return takes daily componding into account but how would you explain the non-geometric returns? Is this the cumulative sum i.e. buy-and-hold (which is what I am doing with these assets)?

Would it be safe to say that in order for the non-compounded return to be true, the portfolio would have to start with the same amount of cash at every rebalancing period?

Actually, neither of your two results are quite correct. As explained in the Details for the Return.calculate function, most of the PerformanceAnalytics functions use discrete returns, not log returns.

To get the correct results, you will have to convert your data from log returns to simple returns.
Compare the charts from the following:

charts.PerformanceSummary(exp(EQUALwt)-1, geometric=TRUE, wealth.index=TRUE)
charts.PerformanceSummary(EQUALwt, geometric=FALSE)


The first is correct. Since the second uses log returns, the results for second CummulativeReturn chart are the log of the actual retults; i.e. if you used exp() on the CummulativeReturns of the second function, you would get the first set of results.

• thank you so much for explaining in detail. It is much clearer to me now! Thanks once again – Jason Guevara Dec 15 '14 at 2:42