首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何计算资产的多重收益

如何计算资产的多重收益
EN

Stack Overflow用户
提问于 2019-10-31 16:23:14
回答 1查看 566关注 0票数 1

我试图设置一个R码来计算每一列的返回。我的问题是,代码应该在每个资产(列)中考虑不同时间段的多个投资。

我已经设法提取了每一项投资(行)作为xts对象的每一天的相关价格。NAs表示给定的股票在指定日期未被拥有。因此,我有一个,如下所示(作为xts对象)。此外,请注意周末不包括在索引栏中:

代码语言:javascript
复制
 Stock 1 Stock 2 Stock 3 Stock 4 Stock 4
2019-10-18 100 NA NA 750 NA
2019-10-21 105 NA NA 1000 6
2019-10-22 110 NA NA NA 7
2019-10-23 NA NA NA 750 8
2019-10-24 10 NA NA 500 8
2019-10-25 7.5 NA NA NA 8
2019-10-28 5 NA NA 500 8 
2019-10-29 NA NA 200 250 9

为了解释该表,一个例子如下:股票1在2019-10-18年至2019-10-22年出售期间拥有。2019年至10-23年,第一批股票未被拥有,而在2019年至10-24年又被购买,2019年至10-28年再次出售,2019年至10-29年为NA。股票1栏中的数字反映了给定天数的股票价格。

搜索获得的输出是一个向量,它总结了每一项独立投资--而不是基于投资规模:

代码语言:javascript
复制
 Stock 1 Stock 2 Stock 3 Stock 4 Stock 5
Cumulative Return -40% NA 0% -50% 50%

请注意,每项投资都使用每个投资期间的第一行和最后一行来计算累积回报。作为一个例子-40%被计算为:110/100-1 + 5/10-1__。

如果在一个资产(列)中进行多个投资,那么它总是不重叠的,如上面的例子所示。

提前感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-01 12:53:34

您想要计算的数字类似于所谓的时间加权回报(不幸的是);尽管对于这样的回报,单笔交易的回报是通过乘法而不是通过求和来链接在一起的。事实上,如果这是可以接受的,这是相当容易计算。从数据开始:

代码语言:javascript
复制
library("PMwR")
library("zoo")

data <- structure(
    c(100, 105, 110, NA, 10, 7.5, 5, NA, NA, NA,
      NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
      NA, NA, 200, 750, 1000, NA, 750, 500, NA, 500,
      250, NA, 6, 7, 8, 8, 8, 8, 9),
    .Dim = c(8L, 5L),
    .Dimnames = list(NULL, c("Stock1", "Stock2", "Stock3",
                             "Stock4", "Stock5")),
    index = structure(c(18187, 18190, 18191, 18192, 18193, 
                        18194, 18197, 18198), class = "Date"),
    class = "zoo")

data
##            Stock1 Stock2 Stock3 Stock4 Stock5
## 2019-10-18  100.0     NA     NA    750     NA
## 2019-10-21  105.0     NA     NA   1000      6
## 2019-10-22  110.0     NA     NA     NA      7
## 2019-10-23     NA     NA     NA    750      8
## 2019-10-24   10.0     NA     NA    500      8
## 2019-10-25    7.5     NA     NA     NA      8
## 2019-10-28    5.0     NA     NA    500      8
## 2019-10-29     NA     NA    200    250      9

请注意,我在这里使用zoo,但是您始终可以调用as.xts (因为xts继承了zoo)。在PMwR中,我使用函数returns。对于时间加权回报(即单笔交易回报的乘积),只需将所有NA-收益转换为零。

代码语言:javascript
复制
R <- returns(data, pad = 0)
R <- na.fill(R, 0)
apply(R, 2, function(x) prod(1+x)-1)
##     Stock1     Stock2     Stock3     Stock4     Stock5 
## -0.4500000  0.0000000  0.0000000 -0.5555556  0.5000000 

如果您真的想要计算收益的总和,那么还有更多的工作要做:

代码语言:javascript
复制
sum_returns <- function(x) {
    x <- c(NA, as.vector(x), NA)
    start <- which(is.finite(x[-1]) & is.na    (x[-length(x)]))
    end   <- which(is.na    (x[-1]) & is.finite(x[-length(x)]))
    sum(x[end]/x[start+1]-1)
}
apply(data, 2, sum_returns)
## Stock1 Stock2 Stock3 Stock4 Stock5 
##   -0.4    0.0    0.0   -0.5    0.5 

如果您需要区分零回报和从不投资,请添加以下内容

代码语言:javascript
复制
never.invested <- apply(data, 2, function(x) all(is.na(x)))
## Stock1 Stock2 Stock3 Stock4 Stock5 
##  FALSE   TRUE  FALSE  FALSE  FALSE 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58647536

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档