# Calculating log returns using R

I am trying to calculate the log returns of a dataset in R using the usual log differencing method. However, the calculated data is simply a vector of zeroes. I can't see what I'm doing wrong.

Here is the snippet showing what I'm doing

> prices <- data$cl > head(prices) [1] 1108.1 1095.4 1095.4 1102.2 1096.3 1096.7 > > > lrets <- log(lag(prices)) - log(prices) > head(lrets) [1] 0 0 0 0 0 0 > summary(lrets) Min. 1st Qu. Median Mean 3rd Qu. Max. 0 0 0 0 0 0  What am I doing wrong? - lrets <- diff(log(prices)) – Vishal Belsare Feb 6 '12 at 11:55 @VishalBelsare you should add that as an answer. – Louis Marascio Nov 23 '12 at 15:42 ## 2 Answers You are simply doing$log(S_t) - log(S_t) = 0$for all$t\$. Instead, try

> n <- length(prices);
> lrest <- log(prices[-n]/prices[-1])


Should do the trick.

-
Or the more traditional, fewer characters: diff(log(prices)) which also works when 'prices' is a matrix with times in the rows and assets in the columns. The other lesson is that 'lag' doesn't do what we naively expect it to do. – Patrick Burns Feb 6 '12 at 10:54
To be sure that lag works as you expect, it is much safer to store your time series as zoo or xts objects: if you use vectors (or even ts objects), many operations will discard or ignore the timestamps. – Vincent Zoonekynd Feb 6 '12 at 11:48
hadnt noticed the "diff" function yet. A handy one, indeed. – AdAbsurdum Feb 6 '12 at 12:39
@PatrickBurns: +1 for your input. I preferred your more succinct syntax. Would have accepted that as an answer. – Homunculus Reticulli Feb 6 '12 at 13:06
i have been using diff(log(prices)) for a while, but was starting to doubt as it seems almost noone use it. thanks :) – edouard Jul 26 '12 at 17:35

I think the easiest method for calculating log returns is ROC from the TTR package:

> data(ttrc)
> roc <- ROC(ttrc[,"Close"])


http://cran.r-project.org/web/packages/TTR/

-