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)  1108.1 1095.4 1095.4 1102.2 1096.3 1096.7 > > > lrets <- log(lag(prices)) - log(prices) > head(lrets)  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?
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.
@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 :)