[R-SIG-Finance] Stock Total Returns?

SW kryp33 at yahoo.com
Sat Feb 18 23:20:41 CET 2012


Hello All,


I am relatively new to R and I am still not very comfortable with syntactic and libraries. Is there are any nice way to calculate and plot total returns for stocks which I would define as change in price and paid dividends? I made a code to do that but the loop that constructs prices+dividends looks ugly(see code below). Any suggestions to do it more efficiently? Thanks. Sergey 

##############  CODE  ##################################
library(quantmod)
library(PerformanceAnalytics)

#Time frame
dt.end = "2010-01-01"
dt.start =  "2007-01-01"

tickers = c('SPY',
            'XLY',
            'XLP',
            'XLE',
            'XLF',
            'XLV',
            'XLI',
            'XLB',
            'XLK',
            'XLU')
tickers.desc = c('SNP500',
                 'ConsumerCyclicals',
                 'ConsumerStaples',
                 'Energy',
                 'Financials',
                 'HealthCare',
                 'Industrials',
                 'Materials',
                 'Technology',
                 'Utilities')

############              Get prices        ###############################
setDefaults(getSymbols, warnings=FALSE,auto.assign=FALSE)
fnPx <- function(i) { return(Ad(getSymbols(tickers[i], from=dt.start,to=dt.end))) }
ts = lapply(1:length(tickers), fnPx)
###########################################################################

############              Get Dividends     ################################
fnDiv<- function(i) { return(getDividends(tickers[i], from=dt.start,to=dt.end,auto.assign=FALSE)) }
div = lapply(1:length(tickers), fnDiv)
###########################################################################

###########    Create Prices + Dividends (UGLY !!!!)  #####################
fnTotPx <- function(i) 
  { 
    ret = ts[[i]]
    for(j in 1:length(div[[i]]))
    {
      row  = div[[i]][j,]
      tm   = time(row)
      val  = as.double(row[1,1])
      iFwd = paste(tm,"::",sep='')
      iBk  = paste("::",tm-1,sep='')
      unch = ret[iBk]
      chg  = ret[iFwd]+val
      ret = rbind(unch,chg)
    }
    return(ret)
  }
totPx = lapply(1:length(tickers), fnTotPx)
############################################################################


################          Calc Total Returns     ##########################
fnRet <- function(i) { return(periodReturn(totPx[[i]],period='daily')) }
ts.ret = lapply(1:length(tickers), fnRet)

################          Plot Total Returns     ##########################
ts.ret.df = as.data.frame(ts.ret)
colnames(ts.ret.df)=tickers.desc
chart.CumReturns(ts.ret.df, main="Cumulative Returns",geometric=FALSE,legend.loc="bottomleft")
############################################################################



More information about the R-SIG-Finance mailing list