【发布时间】: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