ykjk ykjk - 17 days ago 6
R Question

Differentiating and lagging values of one df

I have a df of stock prices and I would like to calculate the return, hence I need to calculate today's value - yesterdays' for every lag.
Moreover I want this to be lagged by 1 day ┬┤since I wan to know how yesterdays return influenced my decision today.
I tried

sapply(importData, function(x) diff(x) / lag(x, k=-1))

But this somehow gives me completely different values than I would expect.

Here is an example value:
Stock 1 has the value 16.49 for today and 16.32 yesterday, hence I would expect a value of 0.17 in the cell before yesterdays' value, since it is lagged by 1. But the formula gives me a -0.031.

I guess I must have understood the code wrong, can someone help me out here?

Edit: here is some testdata

Time |Stock 1

day 1|18.85

day 2|18.32

day3|18.49

so my outcome should be 18.49-18.32 =
0.17
and since this result is lagged by 1 it should be in the cell where the value for
day1
is now.

Answer

Try these. Except for the last one no packages are used.

1) plain vector

x <- c(2, 2.1, 2.2)
c(NA, diff(x) / x[-length(x)])
## [1] NA 0.05000000 0.04761905

Double check:

c(NA, (2.1 - 2)/2, (2.2 - 2.1)/2.1)
## [1] NA  0.05000000 0.04761905

1a) log approximation

diff(log(x))
## [1] 0.04879016 0.04652002

diff(log(x)) is based on the following where the last equals is really approximately equals and is based on the approximation log(x) = x-1 if x is close to 1. For example, log(1.01) = 0.009950331 which is close to 1.01 - 1 = .01.

diff(log(x)) 
= c(log(x[2]) - log(x[1]), log(x[3]) - log(x[2])) 
= c(log(x[2]/x[1]), log(x[3]/x[2])) 
= c(x[2]/x[1] - 1, x[3]/x[2] - 1)    (approximately)

2) ts time series

tt <- ts(c(2, 2.1, 2.2)
diff(tt) / lag(tt, -1)
## Time Series:
## Start = 2 
## End = 3 
## Frequency = 1 
## [1] 0.05000000 0.04761905

3) zoo time series

library(zoo)
z <- zoo(c(2, 2.1, 2.2))
diff(z, arithmetic = FALSE) - 1
##          2          3 
## 0.05000000 0.04761905