2017-09-10 3 views
-1

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") 
+0

Ich denke, dass Ihr Code unvollständig ist: Woher kommt 'daily_stock_returns'? Bitte schließen Sie die 'library' Zeilen ein. – lebelinoz

+0

Entschuldigung, ich habe es aktualisiert, um diese einzuschließen. Funktioniert die rebalance_on() - Funktion in der return.portfolio-Funktion das Problem? – DavimusPrime

Antwort

1

Wenn Sie den Dollar-Wert der Portfolio-Komponenten und das Gesamtportfolio sehen möchten Sie Folgendes ausführen können. Angenommen, was Sie wollen, ist in einem Portfolio auf "DayStart (2017-01-01)" mit Zuteilung "Alloc (.15, .20, .25, .225, .175)" und dann OHNE Rebalancing lassen Sie es natürlich laufen bis "DayEnd (2017-05-01)":

initiale Zuweisung (z1000 USD) für GOOG, AMZN, BA, FB, AAPL: 150, 200, 250, 225, 175

nehmen Ihr Portfolio gibt „Portfolio“ (Ich nahm 'discrete' gibt nicht 'log'):

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

Sie können den Portfoliowert jetzt in Dollar plotten oder in Rückgaben konvertieren.

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 
+0

Hallo @hovllmeier - Was ist der Unterschied zwischen diskreten Returns und Log Returns? Und warum würdest du eins über dem anderen benutzen? Prost! – DavimusPrime

+0

Die "log" versus "diskrete" Frage ist eine ganz eigene Frage, die es wert wäre, auf quant.stackexchange untersucht zu werden. Wenn Sie die gegebene Antwort als nützlich empfunden haben, akzeptieren Sie sie und vielleicht stimmen Sie ab. – lebelinoz

Verwandte Themen