如何从价格向量计算回报?

时间:2011-08-21 20:43:57

标签: r

我必须计算一个向量的回报,该向量给出了股票的历史价格序列。矢量具有以下形式:

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

我需要计算每日收益/损失(%) - 即从10.25到11.26然后从11.26到14等的收益是多少。

是否有自动计算的功能?

8 个答案:

答案 0 :(得分:20)

使用您的样本数据,我认为您的意思如下:

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的最后一个元素。

答案 1 :(得分:20)

您可能会发现quantmod中与您的工作相关的功能:

> require(quantmod)
> Delt(a)
     Delt.1.arithmetic
[1,]                NA
[2,]        0.09853659
[3,]        0.24333925
[4,]       -0.03142857

答案 2 :(得分:1)

ret<-diff(log(a))

这将为您提供几何回报 - 返回遵循对数正态分布(下限为-100%,因为价格始终为非负),因此ln(prices)遵循正态分布(因此您可能会看到返回较小比-1或-100%)。

对于“正常”回报范围,[P(t+1)-P(t)]/P(t)LN(P(t+1)/P(t))之间的差异应该可以忽略不计。我希望这会有所帮助。

答案 3 :(得分:1)

您还可以使用返回的确切关系等于日志返回的指数减1。因此,如果Prices包含您的价格,以下内容将为您提供退货:

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

请注意,这是完全关系,而不是@PBS在答案中给出的近似关系。

答案 4 :(得分:0)

要补充PBS的答案,生成日志返回的一种稍微复杂的方法是ret<-c(NA,log(a[-1])-log(a[-length(a)]))

答案 5 :(得分:0)

另一种可能性是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(这也是默认值)给出了log-returns:

ROC(a)
## [1]          NA  0.09397892  0.21780071 -0.03193305

答案 6 :(得分:0)

具有多个时间序列的更详细的示例:

############ 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

答案 7 :(得分:0)

您可以这样做:

(PRICE / lag(PRICE)-1) * 100