I am on a roll, I thought I would pull out my pride and joy the Shiller PE model and see what it has to say.
Now we are talking you can see significant outperformance. Here we are looking at more than 114 years worth of data. I guess that would include all cycles 😉
Before I get too carried away I was a bit concerned with the date structuring over the last year. I have used data from Quandl’s (MULTPL) dataset and I seem to be getting signals more than 1 per month. According to the model it is currently invested and long.
I am going to post the code below, but I am warning that I plan to do a little bit of work in the near future to double check if I am manipulating the dates correctly. Enjoy if this is your thing.
library(quantmod) library(PerformanceAnalytics) library(gridExtra) # I am pulling the data from Quandl and the MULTPL dataset. multpl<- read.csv('https://www.quandl.com/api/v1/datasets/MULTPL/SHILLER_PE_RATIO_MONTH.csv?trim_start=1881-01-01&trim_end=2015-12-17&auth_token=kvYEqCqKCTyL4anWz5Zv', colClasses=c('Date'='Date')) snp<- read.csv('https://www.quandl.com/api/v1/datasets/MULTPL/SP500_REAL_PRICE_MONTH.csv?trim_start=1871-01-01&trim_end=2015-12-17&auth_token=kvYEqCqKCTyL4anWz5Zv', colClasses=c('Date'='Date')) date<- snp$Date values<- snp[,2] snp.obj<- as.xts(values, order.by = as.Date(date, "%d/%m/%Y")) snprets<- ROC(snp.obj, type = "discrete", n = 1) date<- multpl$Date values<- multpl[,2] PE.obj<- as.xts(values, order.by = as.Date(date, "%d/%m/%Y")) Shiller<- merge(snp.obj,PE.obj, snprets) Shiller.sub = Shiller['1900-01-01::'] colnames(Shiller.sub) = c('S&P500','Shiller PE','S&P500 returns') mean<- rollapply(PE.obj,48,mean) sdsig<- rollapply(PE.obj,48,sd) + mean over<- Lag(ifelse(PE.obj> sdsig,1,0)) pe_ret <- snprets * over PEtimer<- cbind(pe_ret,snprets) colnames(PEtimer) = c('PE-Timer','Buy&Hold') maxDrawdown(PEtimer) grid.newpage(recording = FALSE) grid.table(tail(over)) tail(over) grid.newpage(recording = FALSE) grid.table(table.AnnualizedReturns(PEtimer, Rf=0)) table.AnnualizedReturns(PEtimer, Rf= 0) charts.PerformanceSummary(PEtimer, Rf = 0, main="Shiller PE Timer",geometric=FALSE)