BEARBEITEN AKTUALISIERT Ich habe einen tollen Beitrag von den Autoren von performanceAnalytics gefunden. Dieser Beitrag fasst im Grunde die Ins-Outs der kumulativen Portfolio-Renditen zusammen, und wie der Autor zeigt, ist es ziemlich schwierig (er hat es auch falsch verstanden)! Hier ist es als Referenz: https://tradeblotter.wordpress.com/2014/09/25/aggregate-portfolio-contributions-through-time/Berechnung der Portfolioebene zurück
SO habe ich in ein kleines Stück von einem Stumpf, wo meine zwei Zahlen sollten zusammen, aber sie sind nicht laufen. Hier ist ein Beispiel mit Datenrahmen Aktienoptionen und ihre Gewichtung eines Portfolios für Kontext:
stock.choices stock_weights
1 GOOG 0.150
2 AMZN 0.200
3 BA 0.250
4 FB 0.225
5 AAPL 0.175
Dann werde ich die Return.portfolio Funktion mit wealth.index verwenden = TRUE die Rückkehr meines Portfolios zu zeigen.
Portfolio <- merge.xts(GOOG,AMZN,BA,FB,AAPL)
dollar_growth <- Return.portfolio(Portfolio, weights = stock_weights, wealth.index = TRUE)
Ich benutze dygraph, um das Dollarwachstum zu visualisieren.
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")
In diesem Beispiel werde ich den 1. Mai als Ausgangspunkt der Investition verwenden. Auf dieses Portfolio bekomme ich 11,5% Rendite vom 1. Mai - berechnet, indem ich den aktuellen Wert (1,37 $) nehme und diesen bis zum 1. Mai (1.23057 $) dividiere, was zu einem Anstieg von 11,33% führt.
Wenn ich jedoch eine andere Methode verwende, bekomme ich eine andere Antwort, die seltsam ist, weil ich gedacht hätte, dass diese zweite Methode die genaue Methode zur Berechnung der Rendite eines Portfolios ist.
Zuerst erstelle ich einen Datenrahmen, der die Bestandswerte am 1. Mai und ihre aktuellen Werte hat. Dann multipliziere ich beide mit ihrer jeweiligen Gewichtung im Portfolio. Hier ist die Ausgabe:
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
Nun, wenn ich beide May1C summieren und CurrentC ich:
> sum(df$May1C)
[1] 432.084
> sum(df$CurrentC)
[1] 458.074
Was ich denke, würde der aktuelle Wert des Portfolios wäre, wie es die Aktienauswahl * ist ihre jeweiligen Gewichte. Dies ergibt nur einen Anstieg von 6,015%.
Meine Frage ist: Wie gibt die Return.Portfolio-Funktion eine 11,3% Erhöhung, wo die zweite Methode eine 6,015% zurückgibt?
Bearbeite als Antwort auf die Kommentare Ich habe festgestellt, dass bei der Verwendung von return.portfolio die verbose = TRUE-Funktion die Lagergewichte im Laufe der Zeit ändert. Dieser Ausgang zeigt die Gewichte, die sich mit EOP und BOP über die Zeit ändern.
als Referenz, hier ist der vollständige Code der dygraph Ausgabe auszuführen:
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")
Ich denke, dass Ihr Code unvollständig ist: Woher kommt 'daily_stock_returns'? Bitte schließen Sie die 'library' Zeilen ein. – lebelinoz
Entschuldigung, ich habe es aktualisiert, um diese einzuschließen. Funktioniert die rebalance_on() - Funktion in der return.portfolio-Funktion das Problem? – DavimusPrime