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

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

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

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

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

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

提前致谢。

【问题讨论】:

    标签: r performanceanalytics


    【解决方案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 次。看来我是个很会选股的人!唉,没有像对冲基金经理那样的事后诸葛亮:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-11
      • 2021-03-12
      • 2021-09-05
      • 2016-06-20
      • 1970-01-01
      • 2021-11-20
      相关资源
      最近更新 更多