滚动期回报:1 年、3 年和 5 年业绩的数量

Posted

技术标签:

【中文标题】滚动期回报:1 年、3 年和 5 年业绩的数量【英文标题】:Rolling period returns: number of 1-year, 3-year and 5-year performance 【发布时间】:2020-07-19 14:01:58 【问题描述】:

在过去的几个小时里,我一直在试图弄清楚如何衡量一个股票投资组合相对于基准表现不佳的年数。我的投资组合和基准有 240 个月的回报:

投资组合回报:-1,5%, 3,00%, -0,75%, ...

基准回报率:-2,54%, 2,62% , -1,39%, ...

现在我想计算有多少个 1 年、3 年和 5 年期间的基准表现优于我的投资组合。

有人可以帮我解决这个问题吗?

提前致谢。

【问题讨论】:

【参考方案1】:

下次请制作一个可重现的示例,其中包含您已经拥有的示例数据和代码。否则,如果没有它,就很难确切地知道你想要什么。为此,我不得不下载一些我自己的数据。

library(quantmod)
library(PerformanceAnalytics)

stocks <- c("AAPL", "JNJ", "BA", "MSFT", "C")

for (ticker in stocks) 
  if(ticker == stocks[1])
    portfolio <- getSymbols(ticker, auto.assign = FALSE, from = "2000-01-01", to = "2019-12-31")[,6]
  else
    portfolio <- cbind(portfolio, getSymbols(ticker, auto.assign = FALSE, from = "2000-01-01", to = "2019-12-31")[,6])
  


colnames(portfolio) <- stocks

portfolio_returns <- rowSums(Return.calculate(portfolio, method = "discrete")[-1]) / ncol(portfolio)
portfolio_returns <- xts(portfolio_returns, order.by = index(portfolio)[-1])

getSymbols('SPY', from = "2000-01-01", to = "2019-12-31")

benchmark <- Return.calculate(SPY[,6], method = "discrete")[-1]

这为我们提供了一个由五只股票组成的投资组合,该投资组合的 20 年回报率。接下来我们计算 20 年中有多少个一年、三年和五年。对于三年期,由于 20 年将给出六个 3 年期,余数,我们使用floor 来获取整数

period_one <- nyears(portfolio_returns)
period_three <- floor(nyears(portfolio_returns) / 3)
period_five <- nyears(portfolio_returns) / 5

oneYear <- threeYear <- fiveYear <- 0

最后一行初始化三个变量,这将保存基准优于投资组合的年数。

Return.performance <- function(x, n, nperiods)

  periodYear <- 0

  periods <- seq(from = 1, by = 252*n, length.out = nperiods+1)

  num <- 1

  for (i in periods[-1])
    pre_year <- periods[num]
    if(i==periods[length(periods)]) i <- nrow(x)
    temp <- Return.cumulative(x[pre_year:i])[,1] < Return.cumulative(x[pre_year:i])[,2]
    if(temp==TRUE) periodYear <- periodYear + 1 
    num <- num + 1 
  

  return(periodYear)


代码很简单,因为一年大约有 252 个交易日,我用它来创建和索引以提取循环中的每个一年、三年和五年的时间段。或者,您可以使用“2000/2001”、“2000/2003”、“2000/2005”,因为这些是 xts 对象。但是,您必须转换为数字以递增开始和结束年份,然后再转换为字符。

assets <- cbind(portfolio_returns, benchmark)

Return.performance(assets, 1, period_one)
[1] 4
Return.performance(assets, 3, period_three)
[1] 1
Return.performance(assets, 5, period_five)
[1] 0

我所拥有的投资组合在 4 个五年期内没有表现不佳,在 6 个 3 年期中仅表现不佳一次,在 20 个一年期中仅表现不佳 4 次。看来我是个很会选股的人!唉,没有像对冲基金经理那样的事后诸葛亮:)

【讨论】:

以上是关于滚动期回报:1 年、3 年和 5 年业绩的数量的主要内容,如果未能解决你的问题,请参考以下文章

第1514期2018年 JavaScript 明星项目

为啥熊猫滚动意味着居中窗口

如何在 Pandas DataFrame 上计算滚动累积乘积

阿里云首次年度盈利,国内云厂商何时迎来集体回报期?

Python:计算需要从数据框中分组的值的 5 年滚动 CAGR

WEEX图说 | 过去十年间,哪类资产才是“最大赢家”?