如何计算资产的多次收益

问题描述 投票:1回答:1

我已经尝试设置R代码来计算每一列的收益。我的问题是,代码应考虑每种资产(列)中不同时间段的多次投资。

我设法将拥有(行)每笔投资的每一天的相关价格作为xts对象。 NA表示在给定日期不拥有给定的股票。因此,我有一个table,如下所示(作为xts对象)。另外,请注意,索引列中不包含周末:

 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不拥有股票1,而在2019-10-24再次买入并在2019-10-28再次卖出,因此在2019-10-29拥有NA。股票1栏中的数字反映了给定日期的股票价格。

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

Stock 1 Stock 2 Stock 3 Stock 4 Stock 5 Cumulative Return -40% NA 0% -50% 50%
请注意,每个投资都使用每个投资期的第一行和最后一行来计算累积收益。 

例如,-40%计算为:110/100-1 + 5/10-1

如果在一个资产(列)上进行多次投资,则它将始终处于非重叠期间,如上例所示。

提前感谢!

r for-loop xts stock portfolio
1个回答
1
投票
您要计算的数字类似于(不幸的)称为时间加权收益;尽管对于这样的回报,单笔交易的回报是通过乘法而不是通过求和链接在一起的。实际上,如果可以接受的话,它很容易计算。从数据开始:

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,但是您始终可以调用zoo(因为as.xts继承自xts)。从zoo开始,我使用功能PMwR。对于时间加权收益(即单笔交易收益的乘积),只需将所有NA收益转换为零即可。

PMwR

如果您真的想对收益进行汇总,则还有更多工作要做:

returns

如果您需要区分零收益和从未投资,请添加类似内容

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

© www.soinside.com 2019 - 2024. All rights reserved.