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%?
在回复评论时进行编辑,我发现使用 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")