Как рассчитать доходность от вектора цен? - PullRequest
7 голосов
/ 22 августа 2011

Я должен рассчитать доходность вектора, который дает исторический ряд цен акции. Вектор имеет форму:

a <- c(10.25, 11.26, 14, 13.56) 

Мне нужно рассчитать ежедневный прирост / убыток (%) - то есть, какой прирост он имеет с 10,25 до 11,26, затем с 11,26 до 14 и т. Д.

Есть ли функция для автоматического расчета?

Ответы [ 7 ]

21 голосов
/ 22 августа 2011

Вы можете найти функции в quantmod, относящиеся к вашей работе:

> require(quantmod)
> Delt(a)
     Delt.1.arithmetic
[1,]                NA
[2,]        0.09853659
[3,]        0.24333925
[4,]       -0.03142857
21 голосов
/ 22 августа 2011

Используя ваши данные выборки, я думаю, вы имеете в виду следующее:

a <- c(10.25, 11.26, 14, 13.56) 
> diff(a)/a[-length(a)]
[1]  0.09853659  0.24333925 -0.03142857

diff возвращает вектор лаговых различий и a[-length(a)] отбрасывает последний элемент a.

2 голосов
/ 02 сентября 2016

Вы также можете использовать точные отношения, которые возвращают равные показателю степени возврата журнала минус один. Таким образом, если Prices содержит ваши цены, ваши данные вернутся в следующем порядке:

Returns = exp(diff(log(Prices))) - 1

Обратите внимание, что это точное отношение, а не приблизительное отношение, указанное в ответе @ PBS.

1 голос
/ 31 июля 2012
ret<-diff(log(a))

Это даст вам геометрические возвраты - возврат следует логнормальному распределению (нижняя граница равна -100%, поскольку цены всегда неотрицательны), поэтому ln(prices) следует нормальному распределению (поэтому вы можете увидеть возвратменьше -1 или -100%).

Для "нормального" диапазона возвратов разница между [P(t+1)-P(t)]/P(t) и LN(P(t+1)/P(t)) должна быть незначительной.Надеюсь, это поможет.

0 голосов
/ 20 августа 2018

Более подробный пример с несколькими временными рядами:

############ Vector  ############

vPrice <- (10.25, 11.26, 14, 13.56) 
n = length(vPrice)

#Log returns

log_ret <- diff(log(vPrice)) # or = log(vPrice[-1]/vPrice[-n]) because "..[-i]" removes the i'th item of the vector
log_ret

#Simple returns

simple_ret <- diff(vPrice)/vPrice[1:(n-1)] # or = diff(vPrice)/vPrice[-n]
simple_ret


############ Multiple Time series ############

head(EuStockMarkets)

mPrice <-  EuStockMarkets
n = dim(mPrice)[1] #Nb rows

log_ret <- diff(log(mPrice))
head(log_ret)

simple_ret <- diff(mPrice)/mPrice[1:(n-1),]
head(simple_ret)


#Total Returns

total_log_ret <- colSums(log_ret,2) #just a sum for log-returns
total_log_ret
total_Simple_ret <- apply(1+simple_ret, 2, prod)-1 # product of simple returns
total_Simple_ret

##################

#From simple to log returns 
all.equal(log(1+total_Simple_ret),total_log_ret) #should be true

#From Log to simple returns 
all.equal( total_Simple_ret,exp(total_log_ret)-1) #should be true
0 голосов
/ 14 января 2018

Другая возможность - функция ROC пакета TTR:

library(TTR)
a <- c(10.25, 11.26, 14, 13.56)
ROC(a, type = "discrete")
## [1]          NA  0.09853659  0.24333925 -0.03142857

type = continuous (что также является значением по умолчанию) возвращает данные журнала:

ROC(a)
## [1]          NA  0.09397892  0.21780071 -0.03193305
0 голосов
/ 18 июля 2017

В дополнение к ответу PBS , несколько сложным способом создания возврата журнала будет ret<-c(NA,log(a[-1])-log(a[-length(a)])).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...