【问题标题】:Calculating portfolio level returns计算投资组合水平的回报
【发布时间】:2018-02-19 03:37:31
【问题描述】:

EDIT UPDATED 我发现 performanceAnalytics 的作者写的一篇很棒的帖子。这篇文章基本上总结了累积投资组合回报的来龙去脉,正如作者所展示的那样,这非常棘手(他也弄错了)!供参考:https://tradeblotter.wordpress.com/2014/09/25/aggregate-portfolio-contributions-through-time/

所以我遇到了一个难题,我的两个数字应该相加,但事实并非如此。这是一个示例数据框,其中包含股票选择及其在投资组合中的权重的上下文:

      stock.choices stock_weights
1          GOOG         0.150
2          AMZN         0.200
3            BA         0.250
4            FB         0.225
5          AAPL         0.175

然后我将使用Return.portfolio 函数和weather.index = TRUE 来显示我的投资组合的回报。

Portfolio <- merge.xts(GOOG,AMZN,BA,FB,AAPL)
dollar_growth <- Return.portfolio(Portfolio, weights = stock_weights, wealth.index = TRUE)

我使用 dygraph 可视化美元增长。

dygraph(dollar_growth, main = "Portfolio Growth Base.$1") %>% dyAxis("y", label = "$")%>%
  dyAnnotation("2017-05-01", text = May1, tooltip = "Initial Investment", width = 70, height = 18, tickHeight = -75)%>%
  dyAnnotation(LastDay, text = Today, tooltip = "Percentage Increase",width = 70,  attachAtBottom = TRUE) %>%
  dyAxis("y", label = "Dollars USD")

在本例中,我将使用 5 月 1 日作为投资的初始点。在这个投资组合中,我从 5 月 1 日获得了 11.5% 的回报 - 通过将当前价值 (1.37 美元) 除以 5 月 1 日 (1.23057 美元) 计算得出,收益率为 11.33%。

但是,当我使用不同的方法时,我会得到不同的答案,这很奇怪,因为我认为第二种方法是计算投资组合回报的准确方法。

首先,我创建一个数据框,其中包含 5 月 1 日的股票价值及其当前价值。然后我将两者乘以它们在投资组合中的权重。这是输出:

      May1 Current Stock.Weights    May1C  CurrentC
GOOG 912.57  926.50         0.150 136.8855 138.97500
AMZN 948.23  965.90         0.200 189.6460 193.18000
BA   182.39  238.78         0.250  45.5975  59.69500
FB   152.46  170.95         0.225  34.3035  38.46375
AAPL 146.58  158.63         0.175  25.6515  27.76025

May1C = May1 * Stock.Weights | CurrentC = Current * Stock.Weights

现在当我将 May1C 和 CurrentC 相加时,我得到:

> sum(df$May1C)
[1] 432.084
> sum(df$CurrentC)
[1] 458.074

我认为这将是投资组合的当前价值,因为它是股票选择 * 它们各自的权重。这只增加了 6.015%。

我的问题是: return.portfolio 函数如何返回 11.3% 的增长,而第二种方法返回 6.015%?

编辑回复 cmets 我发现当使用 return.portfolio 时,verbose = TRUE 函数会返回随时间变化的股票权重。此输出显示权重随 EOP 和 BOP 随时间变化。

作为参考,这里是运行 dygraph 输出的完整代码:

library(PerformanceAnalytics)
library(quantmod)
library(dygraphs)
library(scales)

daily_stock_returns = function(ticker) {

    symbol <- getSymbols(ticker, src = 'google', auto.assign = FALSE, warnings = FALSE)
    symbol <- xts::last(symbol, "1 year")
    data <- periodReturn(symbol, period = 'daily', type = 'log')
    colnames(data) <- as.character(ticker)
    assign(ticker, data, .GlobalEnv)
}


    daily_stock_returns("GOOG")
    daily_stock_returns("AMZN")
    daily_stock_returns("BA")
    daily_stock_returns("FB")
    daily_stock_returns("AAPL")
    Portfolio <- merge.xts(GOOG,AMZN,BA,FB,AAPL)
    test <- periodReturn(Portfolio, period = 'monthly', type = 'log')
    stock_weights <- c(.15, .20, .25, .225, .175)

    dollar_growth <- Return.portfolio(Portfolio, weights = stock_weights, wealth.index = TRUE)
    May1 <- as.numeric(dollar_growth["2017-05-01"]) 
    format(round(May1, 3), nsmall = 2)
    Today <- as.numeric(xts::last(dollar_growth, "1 day"))
    Today <- ((Today/May1)-1) %>% percent()
    format(round(May1, 3), nsmall = 2)
    LastDay <- xts::last(dollar_growth, "1 day")
    dygraph(dollar_growth, main = "Portfolio Growth Base.$1") 

【问题讨论】:

  • 我认为您的代码不完整:daily_stock_returns 来自哪里?请包括library
  • 抱歉,我已将其更新为包含这些内容。在return.portfolio函数中,rebalance_on()函数解决问题了吗?

标签: r quantmod stock portfolio performanceanalytics


【解决方案1】:

如果您想查看投资组合组件的美元价值和总投资组合,您可以执行以下操作。假设你想要的是在“DayStart (2017-01-01)”上投资一个投资组合,分配“alloc (.15, .20, .25, .225, .175)”,然后不进行再平衡,让它顺其自然直到“DayEnd (2017-05-01)”:

GOOG、AMZN、BA、FB、AAPL 的初始分配(例如 1000 美元):150、200、250、225、175

将您的投资组合回报“投资组合”(我采用“离散”回报而不是“对数”):

startCapital <- c(150, 200, 250, 225, 175)
portDollar <- cumprod(1+Portfolio["::2017-05-01”]) * startCapital
portDollar <- cbind(portDollar,portf=rowSums(portDollar))

您现在可以用美元绘制投资组合价值或将其转换回回报。

both(portDollar)
               GOOG     AMZN       BA       FB     AAPL    portf
2017-01-03 151.4052 248.5942 175.7486 201.4256 225.6790 1002.853
2017-01-04 202.0686 224.7743 152.2168 255.6943 175.3316 1010.086
2017-01-05 254.8609 180.1164 203.0709 233.9321 151.0465 1023.027
               GOOG     AMZN       BA       FB     AAPL    portf
2017-04-27 195.9950 241.4572 262.7753 190.4188 309.3954 1200.042
2017-04-28 173.9812 303.9860 206.1689 258.2377 278.1846 1220.558
2017-05-01 233.6613 280.3763 174.3678 327.5105 220.7346 1236.650

【讨论】:

  • 嗨@hovllmeier - 离散回报和对数回报有什么区别?为什么你会使用其中一个?干杯!
  • logdiscrete 的问题是一个完全独立的问题,可能值得在 quant.stackexchange 上探讨。如果您发现给定的答案有用,请接受并投票。
猜你喜欢
  • 2020-09-27
  • 1970-01-01
  • 1970-01-01
  • 2021-06-02
  • 1970-01-01
  • 1970-01-01
  • 2019-09-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多