Last active
January 21, 2019 02:05
-
-
Save jpicerno1/af88861bcbbb80687cfb to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# R code re: CapitalSpecator.com post on random rebalancing dates: | |
# "Skewed By Randomness" | |
# www.capitalspectator.com/skewed-by-randomness-testing-arbitrary-rebalancing-dates/#more-6039 | |
# 08 Sep 2015 | |
# By James Picerno | |
# http://www.capitalspectator.com/ | |
# (c) 2015 by Beta Publishing LLC | |
# load packages | |
library(quantmod) | |
library(tseries) | |
library(PerformanceAnalytics) | |
# download prices | |
symbols <-c("SPY","IJS","EFA","EEM","IEF","LQD","VWEHX","RPIBX","PREMX","QRACX","VGSIX") | |
getSymbols(symbols, src='yahoo', from='2003-12-31') | |
for(symbol in symbols) { | |
x <- get(symbol) | |
indexFormat(x) <- '%Y-%m-%d' | |
colnames(x) <- gsub("x",symbol,colnames(x)) | |
x <- x[,6] | |
assign(symbol,x) | |
} | |
# merge price histories into one dataset | |
port.global.prices <- do.call(merge, lapply(symbols, get)) | |
colnames(port.global.prices) <-c(symbols) | |
# generate daily return series for funds | |
port.global.returns <-na.omit(ROC(port.global.prices,1,"discrete")) | |
colnames(port.global.returns) <-c("spy","ijs","efa","eem","ief","lqd","vwehx","rpibx","premx","qraax","vgsix") | |
# calculate weighted total returns for portfolios | |
# asset weights | |
w.global = c(0.25,0.05,0.20,0.05,0.10,0.10,0.05,0.05,0.05,0.05,0.05) # global aa | |
# buy and hold portfolio/no rebalancing | |
port.global.bh <-Return.portfolio(port.global.returns, | |
weights=w.global,wealth.index=TRUE,verbose=TRUE) | |
# year-end rebalanced portfolios | |
port.global.dec31rebal <-Return.portfolio(port.global.returns, | |
rebalance_on="years", | |
weights=w.global,wealth.index=TRUE,verbose=TRUE) | |
# randomly rebalanced portfolios | |
# function to generate data for 13 randomly selected rebalancing dates for 1.1.2003-9.4.2015 | |
rand.sample <-function(x) { # x=port.global.returns | |
dates <-index(x) | |
dates.sample.1 <-sample(dates,11) | |
dates.sample.2 <-dates.sample.1[ order(dates.sample.1 )] | |
dates.sample.2 | |
initial.w <- xts(matrix(c(w.global), nrow=1, ncol=11,byrow=TRUE),index(first(port.global.prices))) | |
w.global.sample.a <- xts(matrix(c(w.global),nrow=11, ncol=11,byrow=TRUE),dates.sample.2) | |
w.global.sample <-rbind(initial.w,w.global.sample.a) | |
a <-Return.portfolio(x, | |
rebalance_on="daily", | |
weights=w.global.sample,wealth.index=TRUE,verbose=FALSE) | |
b <-as.numeric(a) | |
b | |
} | |
# generate multiple return series of random rebalancing dates | |
rand.sample.data <-replicate(1000,rand.sample(port.global.returns)) # note: this will take several minutes for 1000 portfolios | |
rand.sample.data.1 <-xts(rand.sample.data,index(port.global.returns)) # add dates | |
# merge portfolio returns into one dataset for charting, analytics: | |
# buy & hold, year-end rebalancing, and random rebalancing dates | |
port.all <-merge(port.global.bh$wealthindex, | |
port.global.dec31rebal$wealthindex, | |
rand.sample.data.1) | |
### END |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment