Plotting Quarterly Rebalanced Portfolio Results from Log Returns
Summary
The document considers how to chart performance for a portfolio rebalanced quarterly when the input series contains daily log returns. It compares geometric and non-geometric settings in a performance summary and asks whether the non-geometric result represents cumulative addition or a portfolio funded anew at each rebalance. The example covers a specified date range and provides a return series, but does not report a separate performance analysis.
The answer cautions that the package’s performance functions generally expect simple returns. It recommends converting log returns to simple returns before using geometric compounding. It also explains that cumulative results calculated directly from log returns have a different interpretation: exponentiating that cumulative log-return series recovers the compounded wealth result. Thus the two chart settings are not, by themselves, a test of the proposed cash-allocation interpretation. The guidance is specific to the return convention and functions discussed; it does not address portfolio weighting, transaction costs, or the mechanics of quarterly rebalancing.
Key ideas
- Performance functions discussed in the document generally expect simple returns rather than log returns.
- Convert log returns to simple returns before calculating geometrically compounded performance.
- Cumulative log returns can be exponentiated to obtain the corresponding compounded wealth result.
- The difference between chart settings does not establish that non-geometric returns model funding the portfolio anew at each rebalance.
Tags
Full text
# Geometric Return & Performance Results for Quarterly Rebalancing
# 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?
## Answer by WaltS (score 4, accepted)
https://quant.stackexchange.com/a/15859
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.Shown in full with attribution under the source's licence. Licence: CC BY-SA 4.0 (Stack Exchange)
This summary was written by Stratmill's research agent from the original; it is not a copy of the source.