1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
library(shiny) if (!require(quantmod)) { stop("This app requires the quantmod package. To install it, run 'install.packages(\"quantmod\")'.\n") } # Download data # library(quantmod) symetf = c('XLY','XLP','XLE','XLF','XLV','XLI','XLB','XLK','XLU','SPY') end<- format(Sys.Date(),"%Y-%m-%d") start<-format(Sys.Date() - (3*365),"%Y-%m-%d") # 3 years of data dat0 = (getSymbols(symetf[1], src="google", from=start, to=end, ascii = TRUE, auto.assign = F, warnings = FALSE,symbol.lookup = F)) n = NROW(dat0) ; l = length(symetf) dat = array(dim = c(n,NCOL(dat0),l)) ; ret = matrix(nrow = n, ncol = l) for (i in 1:l){ dat0 = getSymbols(symetf[i], src="google", from=start, to=end, auto.assign = F,warnings = FALSE,symbol.lookup = F) dat[1:n,4,i] <- as.numeric(dat0[,4]) ret[2:n,i] = dat[2:n,4,i]/dat[1:(n-1),4,i] - 1 } time <- index(dat0) tickm <- seq.Date(time[length(time)], time[1], by="-1 month") ticky <- as.Date(tapply(time,format(time,format="%y"),min)) shinyServer(function(input, output) { RollCorr = function(h){ rolcor = NULL for (i in 2:(n-h)){ rolcor[i+h] = mean(cor(ret[i:(i+h),])[lower.tri(cor(ret[i:(i+h),]))]) # just the rolling average correlation } par(mfrow = c(1,1), bg = gray(1/1.05), bty ="n", fg = 1 ,font.lab = 6, font.axis = 6, font.main = 6, col.axis = 1, col.lab = 1,cex.axis=1.3, pch = 21, tck = -0.02, cex.lab=1.5, cex.main = 2, mar = c(5, 4, 4, 3) + 0.4) plot(rolcor~time, las=1, ylab = "",ty="l",lwd=2,col=1,xlab="", main = "Rolling Correlation", pch=19 ,xaxt="n", las=1,cex.lab=1.3) labb <- substr(ticky,1,4) axis(1, at=ticky, labels=(labb),tck = -0.04, lwd=0.2, font=2, cex.axis=1.3, hadj=0,xlab="") axis(1, at=tickm, labels=rep("",length(tickm)),tck = -0.02) grid(col="darkgrey") tempcol <- "green" par(new=TRUE) plot(dat[1:n,4,10]~index(dat0),main="",bty="n",ty="l",pch=19,xlab="",ylab="", axes=F, col=tempcol, lwd=1) axis(4,at=pretty(dat[1:n,4,10]),col=tempcol, col.ticks=tempcol,col.axis=tempcol, las=1,cex.axis=1.3) } output$Corrplot <- reactivePlot(function() { RollCorr(h = input$numweeks*5) # 5 bussiness days in a week }) }) # Define UI for dataset viewer application shinyUI(fluidPage( titlePanel(title=HTML("Live rolling Correlation - Most Recent 3 Years")), sidebarPanel( numericInput("numweeks", "Number of weeks for moving window calculation:", value = 4, min = 1, max = 150, step = 1), tags$div(class="header", checked=NA, tags$p(" Using the 10 ETF's: 'XLY','XLP','XLE','XLF','XLV','XLI','XLB','XLK','XLU','SPY', the black line corresponds to the average of the pairwise correlation calculated based on daily returns (close to close). In green, the SPY ETF which tracks the S&P 500. "), tags$p("You can change the number of weeks you wish to use as a rolling window in the box above. A lower number will give a more 'choppy' line, but more up-to-date, a high number will result in a smooth line, but calculation is then based on data further in the past."), tags$p("The function to generate to plot is available under the code section") ) ), mainPanel( h3(textOutput("Live Rolling Correlation Plot")), plotOutput("Corrplot", width = "100%", height = "700px") ) )) |