我必须计算一个向量的回报,该向量给出了股票的历史价格序列。矢量具有以下形式:
a <- c(10.25, 11.26, 14, 13.56)
我需要计算每日收益/损失(%) - 即从10.25到11.26然后从11.26到14等的收益是多少。
是否有自动计算的功能?
答案 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