«

»

Jan 07

Portfolio-Optimierung mit der Monte-Carlo-Simulation

rouletteFür die Portfolio-Optimierung müssen die Ergebnisse für verschiedene Gewichtungen der Einzelwerte vorgenommen werden. In einem früheren Artikel zum Thema wurde festgestellt, dass bei einem Portfolio aus 5 verschiedenen Wertpapieren mit einer Veränderung der Gewichtung in 10%-Stufen bereits mehr als 1000 Variationen vorgegeben werden müssen.

Mit einer Monte-Carlo-Simulation lässt sich das Problem einfacher lösen. Die entsprechende Umsetzung soll Thema dieses Artikels sein.
Zwar wird die Vorgehensweise nochmals komplett vorgestellt, aber nicht so detailliert wie in der Artikelserie zu den Portfolios, bzw. der Matrix-Algebra.

Sollten einige Punkte unklar sein, so werfen Sie bitte einen Blick in die entsprechenden Artikel, die Sie unter dem Menüpunkt “Wissen” (Artikel 9 bis 15) finden können. Selbstverständlich können Sie Ihre Fragen auch über die Kommentarfunktion stellen.

Soweit Unterschiede zu den Artikeln vorhanden sein sollten, werden diese explizit angesprochen.

 Schritt 1: Kursdaten einlesen

Zu Beginn werden die Kursdaten der ausgewählten Aktien benötigt. In dem Beispiel wurden mit Adidas, Allianz, BASF, Bayer und Beiersdorf die fünf alphabetisch ersten Aktien verwendet. Dazu wurden die jeweiligen Tagesschlusskurse vom 21.12.2016 bis 21.12.2017 heruntergeladen und in die Tabelle “Daten” eingefügt (siehe Artikel Korrelation mit OpenOffice Calc berechnen).

KursdatenSchritt 2: Tägliche Renditen berechnen

Aus den Kursdaten werden die täglichen Renditen berechnet.

ReturnsBitte beachten Sie, dass im Gegensatz zum ursprünglichen Artikel nicht mit der Formel “=(Wert1-Wert2)/Wert2″ für die Berechnung von diskreten Renditen, sondern mit der Formel “=LN(Wert1/Wert2)” für die Berechnung stetiger Renditen gearbeitet wird.

Return_berechnenFür Interessierte gibt es <hier> ein schönes Erklärungsvideo zu dem Thema. Die Unterschiede im Ergebnis sind nicht groß, wie im nächsten Bild zu erkennen ist, können sich aber aufaddieren.

Return_berechnen_VglZu erkennen ist auch, dass die in unserer Berechnung verwendete Formel “=LN(Wert1/Wert2)” gleichzusetzen ist mit der Formel “=LN(Wert1) – LN(Wert2)”, die im Video verwendet wird.
Zum Abschluss werden alle Zellen H4 bis L257 markiert und der Name “Returns” für den Zellbereich vergeben.

Return_Name

 Schritt 3: Rendite der Aktien berechnen

Für jede der einzelnen Aktien wird nun der Mittelwert der täglichen Renditen gebildet.

Av_ReturnsDanach werden die fünf Zellen markiert und der Name “Rendite” für den Zellbereich vergeben.

Rendite_NameSchritt 4: Berechnung der täglichen Renditen bezogen auf den Mittelwert

Die folgende Vorgehensweise ist in diesem Artikel detaillierter erklärt. Nach Einfügen der Spaltenüberschriften werden die Zellen N4 bis R257 markiert. Anschließend wird die Formel “=Returns-Rendite” eingetragen. Da es sich um eine Matrix-Berechnung handelt, muss die Formel mit “<Strg>+<Shift>+<ENTER>” abgeschlossen werden, wodurch die Formel in einer geschweiften Klammer dargestellt wird.

Nun wird dem Zellbereich N4 bis R257 noch der Name “A” zugewiesen.

Schritt 5: Tabelle “Berechnung” anlegen und Renditewerte übernehmen

Nun wird eine neue Tabelle mit dem Namen “Berechnung” angelegt. Danach tragen wir nochmals die im Tabellenblatt “Daten” errechnete Rendite ein, indem die fünf Zellen markiert werden, die Formel “=MTRANS(Rendite)” eingetragen und mit “<Strg>+<Shift>+<ENTER>” abgeschlossen wird. Zuletzt wird der Name “mue” für die fünf Zellen vergeben.

Berechnung_RenditeDer zusätzliche Eintrag der Rendite in dieses Tabellenblatt ist nicht notwendig, sondern wurde nur in Anlehnung an die früheren Artikel vorgenommen.

 Schritt 6: Berechnung der Varianz-Kovarianz Matrix

Zur späteren Berechnung der Varianz und in Folge der Standardabweichung wird die Varianz-Kovarianz Matrix benötigt, die wie folgt definiert ist:

 S=\dfrac{A^{T}*A}{M-1}

“A” ist die Matrix mit den monatlichen Renditen bezogen auf den Mittelwert, die in Schritt 4 erstellt wurde. M -1 ist die Anzahl der beobachteten periodischen Renditen. Da 254 periodische Datenreihen vorliegen, beträgt der Wert für M-1 253. Dieser Zelle wird nun der Name “Anzahl” zugewiesen, der in der Formel anstelle von M-1 verwendet wird.

anzUm die Varianz-Kovarianz Matrix zu erstellen, werden horizontal und vertikal die Namen der Aktien eingetragen. Die 5×5 Felder dazwischen werden mit der Formel “=MMULT(MTRANS(A);A)/Anzahl” gefüllt und mit “<Strg>+<Shift>+<ENTER>” abgeschlossen. Als Name für die Matrix wird “_S” vergeben, da “S” von Excel nicht akzeptiert wird.  Var_KovarSchritt 7: Zufallszahlen für die Gewichtung erzeugen

In der  Monte-Carlo-Simulation werden Zufallszahlen in großer Anzahl eingesetzt. Für dieses Beispiel betreffen die Zufallszahlen die Gewichtung der einzelnen Aktien innerhalb des Portfolios. Das wirft ein Problem auf, schließlich können keine beliebigen Zufallszahlen verwendet werden, da die Summe immer “1” (also 100%) ergeben muss.
Dafür gibt es zwei einfache Lösungen, die nun genauer untersucht werden sollen.
Bei der ersten Möglichkeit wird die Summe aller einzelnen Zufallszahlen gebildet, danach werden die einzelnen Zufallszahlen durch diese Summe geteilt und mit der gewünschten Endsumme multipliziert.
Z.B. fünf Zufallszahlen aus dem Bereich 0 bis 100 sollen zusammen 100 ergeben. Die einzelnen Zufallszahlen lauten 20, 30, 40, 50, 60. Die Summe aller Zufallszahlen ist also 200.
1.Zufallszahl: 20 / 200 * 100 = 10
2.Zufallszahl: 30 / 200 * 100 = 15
3.Zufallszahl: 40 / 200 * 100 = 20
4.Zufallszahl: 50 / 200 * 100 = 25
5.Zufallszahl: 60 / 200 * 100 = 30
Die Summe aller fünf angepassten Zufallszahlen ergibt wie gewünscht 100. Werfen wir einen Blick auf die Verteilung der einzelnen Zufallszahlen:
Zufall1

< Diagramm Verteilung Variante 1>

Die meisten Zufallszahlen finden sich im Bereich zwischen 20 und 30. Das wäre kein Problem, doch über 80 finden sich so gut wie keine Werte mehr. Ein vernünftiges Ergebnis ist mit dieser Methode nicht zu erwarten.

Bei der zweiten Möglichkeit wird für den ersten Wert eine Zufallszahl zwischen 0 und 100 erzeugt, für den 2.Wert eine Zufallszahl zwischen 0 und 100 abzuglich des ersten Wertes usw.
Dazu ein Beispiel:
1. Wert Zufallszahl zwischen 0 und 100 => 40 (Beispielwert)
2. Wert Zufallszahl zwischen 0 und 100-40 also zwischen 0 und 60 => 30 (Beispielwert)
3. Wert Zufallszahl zwischen 0 und 100-40-30 also zwischen 0 und 30 => 10 (Beispielwert)
4. Wert Zufallszahl zwischen 0 und 100-40-30-10 also zwischen 0 und 20 => 15 (Beispielwert)
5. Wert 100 – Wert 1 – Wert 2 – Wert 3 – Wert 4 also 100-40-30-10-15 => 5 (Beispielwert)

Die Verteilung sieht dann aus wie folgt:

Zufall_2_Alle

< Diagramm Verteilung Variante 2>

Zwar ist die Häufigkeit umso größer, je kleiner der Wert, doch sind Werte aus allen Bereichen vetreten.
Dies gilt jedoch für alle 5 Werte zusammengenommen. Die einzelnen Werte finden sich in folgenden Bereichen:

Zufall_2_Verteilung Der erste Wert kann 100 werden, doch für die Folgewerte liegen die größten Wert immer tiefer.
Deutlich verbessern lässt sich das Ergebnis, wenn bei der Generierung der Zufallszahlen nach einem Fünftel der ermittelten Zufallsszahlen rotiert wird. D.h. bei 5.000 Zufallszahlen werden die ersten Tausend Zufallszahlen wie oben beschrieben erzeugt. Bei den zweiten Tausend Zufallszahlen wird für Wert 2 eine Zufallszahl zwischen 0 und 100 erzeugt, für die Werte 2 bis 4 Zufallszahlen innerhalb der verbleibenden Wertebereiche. Wert 1 ergibt sich durch die verbleibende Differenz zu 100. Bei den dritten Tausen Zufallszahlen wird die Zufallszahl zwischen 0 und 100 für Wert 3 erzeugt usw.
Die Gesamtanzahl der Werte verteilt sich dabei in etwa wie im Diagramm Verteilung Variante 2, doch die Zahlenbereiche für die einzelnen Werte sehen wie folgt aus:

Zufall_3_VerteilungAlle fünf Werte erzeugen Zufallszahlen zwischen 0 und 100. Mit dieser Variante kann die Monte-Carlo-Simulation umgesetzt werden.
Die Zufallszahlen für jede Aktie werden in den Spalten B bis F berechnet:

Zufall_BFDie Simulation soll mit 10.000 Werten durchgeführt werden. Wie zuvor erwähnt, werden die Zufallszahlen für die ersten 2.000 Wert wie folgt ermittelt:

Zufall_Formeln_1Für die Werte von 2001 bis 4.000 gilt:

Zufall_Formeln_2Für die Werte von 4001 bis 6.000 gilt:

Zufall_Formeln_3Für die Werte von 6001 bis 8.000 gilt:

Zufall_Formeln_4Für die Werte von 8001 bis 10.000 gilt:

Zufall_Formeln_5Die Zufallszahlen liegen zwischen 0 und 100 (Prozent), da die Funktion “Zufallsbereich” die Verwendung ganzer Zahlen erforderlich macht. In Anlehnung an die früheren Artikel, in denen die Zahlen zwischen 0 und 1 lagen, werden die ermittelten Zufallszahlen in den Spalten G bis K durch 100 dividiert.

Zufall_0_1Schritt 8: Tägliche Rendite berechnen

Im Beitrag “Portfolio-Berechnungen mit OpenOffice Calc” wurde die tägliche Rendite des Portfolios wie folgt berechnet:

E(rp) = wT * μ                  

wT steht für die Gewichtung w transponiert
μ    steht für die tägliche Rendite aller Einzelwerte

In diesem Beispiel waren die einzelnen Gewichtungen in einer Spalte untereinander angeordnet. Bei der aktuellen Berechnung sind die Gewichtungen in einer Zeile nebeneinander angeordnet. Somit muss die Gewichtung nicht mehr transponiert werden und die Formel lautet nun:

E(rp) = w * μ 

In der Praxis lautet die Formel somit  =MMULT((G13:K13);mue) und muss mit “<Strg>+<Shift>+<ENTER>” abgeschlossen werden.

Rendite_TagSchritt 9: Tägliche Varianz und Standardabweichung berechnen

Im oben erwähnten Beitrag wurde die tägliche Varianz wie folgt berechnet:

Var = wT * S * w

wT steht für die Gewichtung w transponiert
w   steht für die Gewichtung
S   steht für die Varianz-Kovarianz-Matrix wie unter Schritt 6 beschrieben

Da die Gewichtungen hier in einer Zeile angeordnet sind, wurde die Formel entsprechend angepasst:

Var = w * S * wT , wobei beide Formeln zum selben Ergebnis führen.

In der Praxis lautet die Formel somit  =MMULT(MMULT((G13:K13);_S);MTRANS(G13:K13)) und muss mit “<Strg>+<Shift>+<ENTER>” abgeschlossen werden.

Varianz_dDie Standardabweichung (in der Finanzmathematik häufig als Volatilität bezeichnet und als Maß des Risikos verwendet) berechnet sch aus der Wurzel der Varianz:

Standardabweichung_dSchritt 10: Rendite und Standardabweichung auf Jahresbasis hochrechnen

Bisher wurde mit Werten auf täglicher Basis gerechnet. Da die Werte auf Jahresbasis aber wesentlich eingänglicher sind, erfolgt noch die entsprechende Umrechnung.
Dazu sind die täglichen Ergebnisse der Rendite mit der Anzahl der Tage multipliziert werden. Die Anzahl der Tage wurde bereits in Schritt 6 ermittelt (M-1 = 253).

Rendite_JahrBei der Standardabweichung (Volatilität, bzw. Risiko) als Ableger der Varianz müssen die tägliche Ergebnisse mit der Wurzel der Anzahl der Tage multipliziert werden..

Risiko_JahrSchritt 10: Auswertung

Die Auswertung bezieht sich auf das Minimum-Varianz-Portfolio, also ausgelegt auf das minimale Risiko.
Dazu wird zuerst als Hilfswert noch die Zeilennummer mit aufgeführt:

ZeilennummernIn Folge werden folgende Werte ermittelt:

Auswertung_1Zuerst wird das kleinste jährliche Risiko aus allen Daten ermittelt. Mit Hilfe der Bestimmung der Zeile, in der das kleinste Risiko auftritt, kann die zugehörige jährliche Rendite und die zugehörigen Gewichtungen der Einzeltitel dargestellt werden.

Bei der Auswertung müssen wir immer im Auge behalten, dass 10.000 Zufallswerte nicht sehr viel sind, zumal mit dem System keine gleichmäßige Verteilung der Zufallszahlen erfolgt. Mit VisualBasic for Applications (VBA) lassen sich deutlich bessere Lösungen umsetzen.
Dennoch ergeben sich auch für die einfache Umsetzung aussagekräftige Ergebnisse, die sich weiter verbessern lassen, indem mittels der “F9″-Taste neue Zufallszahlen generiert und die einzelnen Ergebnisse festgehalten werden.

Auswertung_2Es ist zu erkennen, dass sich die Resultate für das kleinste Risiko zwischen 10,56 und 10,60% bewegen. Die zugehörigen Renditen liegen im Bereich zwischen 13,73 16,73 und 18,09%. Für Beiersdorf (w5) und Allianz (w2) sind die Gewichtungen mit deutlich über 30% am Höchsten.

Das Risiko-Rendite Diagramm dazu sieht wie folgt aus:

Risiko_Rendite_Diag 

2 Kommentare

  1. Johann

    Hallo Mathias,

    sehr eindrucksvoll Deine Darstellung der Portfoliooptimierung mi der Monte-Carlo Simulation.
    Zunächst sind mir ein paar kleine textliche Druckfehler aufgefallen, die ich nur wegen der besseren Nachvollziehbarkeit kurz aufführen möchte:
    Im Schritt 4 steht bei der Überschrift für (Return-Rendite) monatlche Rendite auf Mittelwert, müsste tägliche Rendite auf Mittelwert heißen.
    ebenfalls dann unter (A) ebenfalls tägliche Rendite

    Im Schritt 10: Auswertung oberhalb des Risiko-Rendite Diagramms wird die Rendite mit 13,73 % angegeben, richtig lt, Tabelle wäre 16,73%

    Ich habe mir diese Portfoliooptimierung für meine Zwecke nachgebaut. Ich investiere weltweit in Fonds und habe dadurch sehr schöne Ergebnisse erzielt. Das für mich beste Ergebnis erzielt ich mit der Mischung aus zwei Länderfonds und drei Branchenfonds. Allerdings stellen sich mir folgende Fragen, die Du mir vielleicht beantworten kannst:
    1. Der zeitliche Horizont für die Auswahl des geringsten Risikos und der bestmöglichen Rendite ist hier auf ein Jahr festgelegt. Ist das ein ein aussagefähiger Zeitraum, wenn man sein Depot nur monatlich oder später anpassen möchte. Ich habe festgestellt, dass sich die Gewichtungen schon von einem Monat zum nächsten erheblich verändern können oder sollte man das Ergebnis erst nach einem Jahr wieder überprüfen und anpassen?
    2. Ich habe die Vorauswahl bei meinen Fonds aufgrund von Erfahrungen der Korrelation und Volatiltität der Fonds getroffen. Gibt es dafür oder ein Programm, dass Fonds auch nach RSI oder VaR Faktoren auswertet? Ansonsten ist es doch sehr mühsam und zeitaufwendig jeden Monat neue mögliche Konstellationen von Fonds durchzuprüfen.

    Ich hoffe ich habe mich verständlich ausgedrückt und freue mich über eine Antwort!

    Sonnige Grüße
    Johann

    1. Mathias Maier

      Hallo Johann,

      vorab vielen Dank für die Hinweise auf die Fehler, die inzwischen korrigiert sind.
      Es ist sehr erfreulich zu sehen, dass es Interessenten gibt, die sich so tief mit der Materie befassen.

      Der Fehler mit den monatlichen Renditen hat sich dadurch ergeben, dass meine Vorlage zum Artikel auf monatlichen Renditen beruhte, womit wir bei Deiner ersten Frage wären:

      Der Zeitraum von einem Jahr und die Verwendung von Tagesschlusskursen wurden nur eingesetzt, um die Vorgehensweise aufzuzeigen.
      Da davon auszugehen ist, dass ein optimiertes Portfolio nur erstellt wird, wenn ein längerer Anlagehorizont vorliegt (warum sollte sich jemand die Mühe machen, wenn er nur für ein Jahr investieren will?), macht sicher ein längerer Überprüfungszeitraum Sinn. Konkrete Angaben hierzu sind dünn gesät. Vorschläge zielen auf einen Zeitraum zwischen 3 und 10 Jahren, was dann auch die Verwendung von Wochen-, bzw. Monatsschlusskursen ermöglicht.
      Eine monatliche Überprüfung halte ich persönlich für überzogen. Vor allem auch mit dem Hintergrund, dass eine Verbesserung der Rendite um 1% unter Umständen geringer ist als die Kosten für die Umschichtung. Von dem persönlichen Aufwand einmal abgesehen.
      Aber auch hier kenne ich keine konkreten Auswertungen, die einen Aktualisierungszeitraum empfehlen können. Persönlich halte ich eine Anpassung einmal jährlich für ausreichend. Sollten größere Verwerfungen an den Börsen auftreten, sollte schon mal auch zwischendurch eine Überprüfung erfolgen.

      Die Antwort auf Frage 2 würde ich gerne auf das Wochenende verschieben, da mir aus dem Stegreif nichts bekannt ist. Sollte ich dazu etwas finden, werde ich mich melden.

      Beste Grüße
      Mathias

Hinterlasse eine Antwort

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *

Sie können diese HTML-Tags verwenden: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>