如何计算资产的倍数returns
How to calculate multiple returns of assets
我试图设置一个 R 代码来计算每列的 returns。我的问题是代码应该考虑每个资产(列)中不同时间段的多项投资。
我已经设法提取每项投资(行)作为 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
要解释 table,示例如下:股票 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%
注意每项投资利用每个投资期的第一行和最后一行来计算累计 return。 例如 -40% 计算为:110/100-1 + 5/10-1
.
如果对一项资产(列)进行多项投资,它将始终具有非重叠期,如上例所示。
提前致谢!
您要计算的数字类似于(不幸的)所谓的时间加权 returns;尽管对于这样的 returns,单笔交易 returns 通过乘法链接在一起,而不是通过求和。事实上,如果这是可以接受的,计算起来就很容易了。从数据开始:
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
here, but you can always call as.xts
(as xts
inherits from zoo
). From PMwR
我使用函数 returns
。对于时间加权returns(即单笔交易returns的产品),只需将所有NA-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
如果你真的想计算 return 的总和,需要做的工作稍微多一些:
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
如果您需要区分零 return 和从未投资,请添加类似
的内容
never.invested <- apply(data, 2, function(x) all(is.na(x)))
## Stock1 Stock2 Stock3 Stock4 Stock5
## FALSE TRUE FALSE FALSE FALSE
我试图设置一个 R 代码来计算每列的 returns。我的问题是代码应该考虑每个资产(列)中不同时间段的多项投资。
我已经设法提取每项投资(行)作为 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
要解释 table,示例如下:股票 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%
注意每项投资利用每个投资期的第一行和最后一行来计算累计 return。 例如 -40% 计算为:110/100-1 + 5/10-1
.
如果对一项资产(列)进行多项投资,它将始终具有非重叠期,如上例所示。
提前致谢!
您要计算的数字类似于(不幸的)所谓的时间加权 returns;尽管对于这样的 returns,单笔交易 returns 通过乘法链接在一起,而不是通过求和。事实上,如果这是可以接受的,计算起来就很容易了。从数据开始:
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
here, but you can always call as.xts
(as xts
inherits from zoo
). From PMwR
我使用函数 returns
。对于时间加权returns(即单笔交易returns的产品),只需将所有NA-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
如果你真的想计算 return 的总和,需要做的工作稍微多一些:
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
如果您需要区分零 return 和从未投资,请添加类似
的内容never.invested <- apply(data, 2, function(x) all(is.na(x)))
## Stock1 Stock2 Stock3 Stock4 Stock5
## FALSE TRUE FALSE FALSE FALSE