### Calculating log returns using R

• Homunculus Reticulli

9 years ago

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
 1108.1 1095.4 1095.4 1102.2 1096.3 1096.7
>
>
> lrets <- log(lag(prices)) - log(prices)
 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))  @Patrick Burns, vonjd, aajajim thanks to all of you for answering. I learned new information.

• 9 years ago

You are simply doing \$log(S_t) - log(S_t) = 0\$ for all \$t\$. Instead, try

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

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. 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. hadnt noticed the "diff" function yet. A handy one, indeed. @PatrickBurns: +1 for your input. I preferred your more succinct syntax. Would have accepted that as an answer. i have been using diff(log(prices)) for a while, but was starting to doubt as it seems almost noone use it. thanks :) There was a slight (obvious?) error in my reply with taking the negative logreturn instead. Now corrected. Thanks to user6569 that notified me.

• {{ error }}