如何使用 tidyquant(性能分析)计算不同时期资产组合中的投资组合统计数据
How to use tidyquant (performance analytics) to calculate portfolio statistics in a portfolio with varying assets by period
我知道有很好的资源可以使用 tidyquant for R 中的性能分析来计算股票和投资组合 returns。例如,假设我们要确定年度投资组合 returns(2011 年到 2015 年)对于包含“XOM”(0.5)、“MA”(0.3) 和“GOOG”(0.2) 的投资组合,其中 () 表示投资组合中的资产权重。代码只是:
Ra_symbols <- c("XOM", "MA", "GOOG")
wts_map <- tibble(
symbols = c("XOM", "MA", "GOOG"),
weights = c(0.5, 0.3, 0.2)
)
Ra_2010to2020 <- Ra_symbols %>%
tq_get(get = "stock.prices",
from = "2010-12-31",
to = "2015-12-31") %>%
group_by(symbol) %>%
tq_transmute(select = adjusted,
mutate_fun = periodReturn,
period = "yearly",
col_rename = "Ra")
Ra_weightedportfolioreturn <- Ra_2010to2020 %>%
tq_portfolio(assets_col = symbol,
returns_col = Ra,
weights = wts_map,
col_rename = "Ra_using_wts_map")
但是如果投资组合每年包含不同权重的不同资产,我找不到任何资源来帮助编写代码。例如,假设我们有两个数据框:一个带有每年的符号,另一个带有相应的投资组合权重。下面是在 csv 文件中读取的代码,其中包含符号和权重,以及用于说明数据帧的图像。
symbols2011to2015 <- read_csv("Symboltest_2011to2015.csv")
weights2011to2015 <- read_csv("wtstest_2011to2015.csv")
我认为它会涉及一些 tidyverse 函数,例如“应用”或“映射”,但我不确定。此外,tidyquant 是否可以像我一样使用数据框中的符号(和权重),或者我是否需要将它们转换为类似于 c("XOM"、"MA"、"GOOG") 的结果的字符值?最终,我想将这个概念扩展到月度周期,但是一旦我弄清楚多年,过程应该是相似的。
如有任何帮助,我们将不胜感激!
(这是对评论的跟进。)
the PMwR
manual 中有文档。
returns
的输入不必是 zoo
系列:只要价格按列排列,矩阵或数据框也可以。但是,使用 zoo
非常方便。举个例子:
library("zoo")
library("tidyquant")
P <- tq_get(c("XOM", "MA", "GOOG"),
get = "stock.prices",
from = "2010-12-31",
to = "2015-12-31")
P <- do.call(merge, by(P, P$symbol, function(x) zoo(x$adjusted, x$date)))
## GOOG MA XOM
## 2010-12-31 295.8760 21.09419 50.33540
## 2011-01-03 301.0466 20.78734 51.31982
## 2011-01-04 299.9358 21.05560 51.56077
## 2011-01-05 303.3978 21.67588 51.42308
## 2011-01-06 305.6045 21.76818 51.75351
## 2011-01-07 307.0690 21.76536 52.03575
现在假设您有一个 W
权重
的矩阵
W <- rbind(c(1/3, 1/3, 1/3),
c(0.6, 0.2, 0.2),
c(1/3, 1/3, 1/3),
c(0.6, 0.2, 0.2),
c(1/3, 1/3, 1/3))
重新平衡的日期:
when <- as.Date(c("2010-12-31", "2011-12-30", "2012-12-31",
"2013-12-31", "2014-12-31"))
when
中的每个元素对应于 W
中的一行。
现在我们可以计算投资组合 returns.
library("PMwR")
R <- returns(P, rebalance.when = when, weights = W)
## 2011-01-03 2011-01-04 2011-01-05 2011-01-06 ....
## 0.007495421 0.004549025 0.012637607 0.005984054 ....
## ## If 'P' had not been a zoo matrix:
## returns(coredata(P), t = index(P), rebalance.when = when, weights = W)
## ## would work as well
returns
期望输入一个价格序列。我们可以很容易地创建这样一个系列,基于 R
.
tmp <- cumprod(1 + returns(P, rebalance.when = when, weights = W, pad = 0))
这个系列我们可以转化为持有期returns.
returns(tmp, period = "month")
## Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec YTD
## 2011 5.7 3.5 -0.4 2.7 -0.9 -0.1 4.5 -1.7 -3.5 10.4 4.8 3.4 31.4
## 2012 -7.3 8.4 2.2 -1.7 -6.3 3.0 5.7 4.2 8.4 -5.4 2.3 0.5 13.2
## 2013 5.5 2.1 1.4 1.7 3.8 0.6 3.6 -3.8 4.7 9.7 4.6 7.9 49.7
## 2014 -0.4 3.3 -5.7 -2.6 4.3 1.0 -0.6 0.6 -0.9 1.0 -2.1 -1.6 -4.0
## 2015 -2.8 5.5 -3.3 1.8 -0.1 -1.0 6.8 -3.4 -1.8 13.0 1.3 0.7 16.6
returns(tmp, period = "year")
## 2011 2012 2013 2014 2015
## 31.4 13.2 49.7 -4.0 16.6
我知道有很好的资源可以使用 tidyquant for R 中的性能分析来计算股票和投资组合 returns。例如,假设我们要确定年度投资组合 returns(2011 年到 2015 年)对于包含“XOM”(0.5)、“MA”(0.3) 和“GOOG”(0.2) 的投资组合,其中 () 表示投资组合中的资产权重。代码只是:
Ra_symbols <- c("XOM", "MA", "GOOG")
wts_map <- tibble(
symbols = c("XOM", "MA", "GOOG"),
weights = c(0.5, 0.3, 0.2)
)
Ra_2010to2020 <- Ra_symbols %>%
tq_get(get = "stock.prices",
from = "2010-12-31",
to = "2015-12-31") %>%
group_by(symbol) %>%
tq_transmute(select = adjusted,
mutate_fun = periodReturn,
period = "yearly",
col_rename = "Ra")
Ra_weightedportfolioreturn <- Ra_2010to2020 %>%
tq_portfolio(assets_col = symbol,
returns_col = Ra,
weights = wts_map,
col_rename = "Ra_using_wts_map")
但是如果投资组合每年包含不同权重的不同资产,我找不到任何资源来帮助编写代码。例如,假设我们有两个数据框:一个带有每年的符号,另一个带有相应的投资组合权重。下面是在 csv 文件中读取的代码,其中包含符号和权重,以及用于说明数据帧的图像。
symbols2011to2015 <- read_csv("Symboltest_2011to2015.csv")
weights2011to2015 <- read_csv("wtstest_2011to2015.csv")
我认为它会涉及一些 tidyverse 函数,例如“应用”或“映射”,但我不确定。此外,tidyquant 是否可以像我一样使用数据框中的符号(和权重),或者我是否需要将它们转换为类似于 c("XOM"、"MA"、"GOOG") 的结果的字符值?最终,我想将这个概念扩展到月度周期,但是一旦我弄清楚多年,过程应该是相似的。
如有任何帮助,我们将不胜感激!
(这是对评论的跟进。)
the PMwR
manual 中有文档。
returns
的输入不必是 zoo
系列:只要价格按列排列,矩阵或数据框也可以。但是,使用 zoo
非常方便。举个例子:
library("zoo")
library("tidyquant")
P <- tq_get(c("XOM", "MA", "GOOG"),
get = "stock.prices",
from = "2010-12-31",
to = "2015-12-31")
P <- do.call(merge, by(P, P$symbol, function(x) zoo(x$adjusted, x$date)))
## GOOG MA XOM
## 2010-12-31 295.8760 21.09419 50.33540
## 2011-01-03 301.0466 20.78734 51.31982
## 2011-01-04 299.9358 21.05560 51.56077
## 2011-01-05 303.3978 21.67588 51.42308
## 2011-01-06 305.6045 21.76818 51.75351
## 2011-01-07 307.0690 21.76536 52.03575
现在假设您有一个 W
权重
W <- rbind(c(1/3, 1/3, 1/3),
c(0.6, 0.2, 0.2),
c(1/3, 1/3, 1/3),
c(0.6, 0.2, 0.2),
c(1/3, 1/3, 1/3))
重新平衡的日期:
when <- as.Date(c("2010-12-31", "2011-12-30", "2012-12-31",
"2013-12-31", "2014-12-31"))
when
中的每个元素对应于 W
中的一行。
现在我们可以计算投资组合 returns.
library("PMwR")
R <- returns(P, rebalance.when = when, weights = W)
## 2011-01-03 2011-01-04 2011-01-05 2011-01-06 ....
## 0.007495421 0.004549025 0.012637607 0.005984054 ....
## ## If 'P' had not been a zoo matrix:
## returns(coredata(P), t = index(P), rebalance.when = when, weights = W)
## ## would work as well
returns
期望输入一个价格序列。我们可以很容易地创建这样一个系列,基于 R
.
tmp <- cumprod(1 + returns(P, rebalance.when = when, weights = W, pad = 0))
这个系列我们可以转化为持有期returns.
returns(tmp, period = "month")
## Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec YTD
## 2011 5.7 3.5 -0.4 2.7 -0.9 -0.1 4.5 -1.7 -3.5 10.4 4.8 3.4 31.4
## 2012 -7.3 8.4 2.2 -1.7 -6.3 3.0 5.7 4.2 8.4 -5.4 2.3 0.5 13.2
## 2013 5.5 2.1 1.4 1.7 3.8 0.6 3.6 -3.8 4.7 9.7 4.6 7.9 49.7
## 2014 -0.4 3.3 -5.7 -2.6 4.3 1.0 -0.6 0.6 -0.9 1.0 -2.1 -1.6 -4.0
## 2015 -2.8 5.5 -3.3 1.8 -0.1 -1.0 6.8 -3.4 -1.8 13.0 1.3 0.7 16.6
returns(tmp, period = "year")
## 2011 2012 2013 2014 2015
## 31.4 13.2 49.7 -4.0 16.6