New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changed volatility calculation using log returns #681
Conversation
Hi @es86de, vielen Dank für die Contribution! Sorry das ich mich erst jetzt melde. Die Feiertage und ein Infekt... Und ehrlich gesagt kenn ich mich mit der Volatilität nicht so gut aus als dass ich die Änderung mal eben beurteilen könnte. Und darum tue ich mich damit etwas schwer. Aber die Vergleichbarkeit zu dem was auf comdirect veröffentlicht wird ist natürlich ein gutes Argument.
So ein Excel gibt es auch gar nicht. Ich habe den Test Case damals so gemacht: Auf dem Rendite / Volatilität Diagramm habe ich oben rechts die Datenreihe exportiert (sagen wir Gesamtportfolio). Dann habe ich dieses CSV dann in Excel geladen und mit der Formel STABWN die Standardabweichung gerechnet und den Wert in den Java Klasse kopiert. Das habe ich gerade noch mal für die Datenreihe "Gesamtportfolio" gemacht und hier angehängt: |
Hallo @buchen, vielen Dank für das Excelsheet!
Ich habe die Berechnung für den Test "testVolatilityOfSharesHeldIsIdenticalToExcel()" hinzugefügt und auch gleich die Berechnung für die Tests in "RiskTest.java" (und "PerformanceIndexTest.java") als extra Tabellenblatt eingefügt. Hier die Datei: VolatilityTests.xlsx. Beim Abgleichen von Excel mit PP bin ich zunächst nicht auf die gleichen Ergebnisse gekommen. Es hat eine Weile gedauert, bis ich das Problem identifizieren konnte. Ich hatte mich beim Berechnen der logarithmischen Renditen an den Werten in der "RiskTest.java" orientiert. Dort wurde die Volatilitätsfunktion mit Werten in Prozent aufgerufen (z.B. 0.5 oder 1.0). Innerhalb von PP werden die Renditen jedoch nicht auf 1/100 normiert übergeben (d.h. 0.005 und 0.01). Das fällt bei einer linearen Berechnung, wie sie bisher implementiert war, nicht auf. Rechnet man aber mit logarithmischen Renditen, so kommt es zu unterschiedlichen Ergebnissen, wenn die Normierung nicht stimmt. Ich habe daher die "Risk.java" nochmal angepasst, so dass mit dem Funktionsaufruf in PP die richtigen Ergebnisse liefert. Anschließend habe ich die Tests entsprechend angepasst und damit vereinheitlicht. Jetzt fehlen noch die verbleibenden drei Tests in "VolatilityTestCase.java":
Ich habe versucht den "testVolatilityIfSecurityIsSoldDuringReportingPeriod()" per Excel nachzuvollziehen. Dafür habe ich einfach, wie du es beschrieben hast, die Daten von BASF über den im Test angegebenen Zeitraum exportiert und wieder die Volatilitätsberechnung hinzugefügt, siehe hier: VolatilityTests_fail.xlsx. Leider stimmen die Ergebnisse von Excel (0.231311206428) und PP (0.20057381077807976) bisher nicht überein. Ich vermute, die Daten müssen noch nachbearbeitet werden. Hier fehlt mir leider das Wissen, was sich hinter dem Test ("SoldDuringReportingPeriod") eigentlich verbirgt. Hast du eine Idee, was der Grund für den Unterschied sein könnte? Danke und viele Grüße |
Ich glaube das liegt daran wo Du die Werte exportiert hast. Bei der Volatiltitäsberechnung werden einige Wert ausgelassen. Der erste Tag (ist ja kein Delta) und die Wochenende (kein Handel) und ein paar Feiertage. Siehe auch hier: Ich habe den Export jetzt noch mal aus dem Rendite / Volatilität Diagramm gemacht (also genau nur mit den Daten die zur Berechnung herangezogen werden) und in das Excel auf ein zweites Blatt eingefügt. Dann passt der Wert genau zu dem Test Case: |
Wunderbar, mit deiner extrahierten Tabelle stimmen Excel und PP überein: VolatilityTests.xlsx (runterscrollen). Damit fehlen nur noch:
Die Extraktion hatte ich genau so gemacht, wie du es beschreibst. Aber wahrscheinlich habe ich mit der "dax.xml" die falsche Portfoliedatei geöffnet. Welche muss ich denn verwenden? |
Das Excelsheet im letzten Beitrag hatte einen Copy&Paste-Fehler. Hier die Korrektur: VolatilityTests.xlsx. |
Die liegt hier: name.abuchen.portfolio.tests/src/scenarios/volatility.xml In meiner Entwicklungsumgebung starte ich PP immer mit der Option |
Danke für den Hinweis! Alles klar. Jetzt wird alles auf einmal ganz einfach ;-). Da hätte ich auch selber drauf kommen können... Ich habe jetzt alle Tests mit Excel nachvollzogen und auf die neue Volatilitätsberechnung mit logarithmischen Renditen angepasst. Hier die finale Exceldatei mit allen Berechnungen zur Kontrolle: VolatilityTests.xlsx. |
Issue: #681 Signed-off-by: Eric Schäfer <es86de@users.noreply.github.com> [squashed commits; added Excel as reference] Signed-off-by: Andreas Buchen <andreas.buchen@gmail.com>
Hi @es86de, bin jetzt dazu gekommen die Change zu mergen. 😄 Ich habe das Excel neben die Tests gelegt. Das war ja das grösste Hindernis. 😒 Ich habe die Commit per Squash zu einem Commit zusammengeführt. Vielen Dank für die Contribution! Es gibt schon einen älteren PR zu der Sharpe Ratio der im Prinzip liegen geblieben ist, weil ich mir nicht sicher war wie man tägliche Volatilität und die zeitraumbezogene Rendite korrekt anpasst. Wieder was gelernt. In den "News & Noteworthy" werde ich auf diesen Artikel verlinken: http://www.deifin.de/thema002.htm Oder hast Du noch andere Links die den Benutzer helfen könnten? |
Hallo @buchen, ich freue mich über den Merge und deinen Dank. Es hat auch viel Spaß gemacht, mit diesem Beitrag bei github einzusteigen. Der eigentliche Dank gebührt aber dir für dieses großartige Tool! Der Artikel bei deifin.de ist sicher sehr gut geeignet um nachzuvollziehen, was bei der Berechnung in PP passiert. Ich habe noch zwei weitere Quellen bei meinen Recherchen gefunden, die vielleicht auch ganz hilfreich sind:
|
Btw, Issue #631 könnte m.E. damit auch geschlossen werden. |
Ich habe die Volatilitätsberechnung entsprechend meines Kommentars in Issue #631 angepasst. Die Berechnung basiert nun auf logarithmierten Renditen. Dies führt zu genaueren Ergebnissen und passt besser ins Konzept, da bei dieser Berechnungsmethode die TTWROR der erwarteten Rendite (Erwartungswert) entspricht.
Die mit den hier vorgeschlagenen Änderungen berechneten Volatilitäten habe ich für den ARERO ETF und die TESLA Aktie mit den auf comdirect angegebenen Volatilitäten für verschiedene Zeiträume verglichen und die Werte stimmen sehr gut überein.
Neben der Berechnung in "Risk.java" wurden auch die dazugehörigen Tests in "RiskTest.java" und "PerformanceIndexTest.java" angepasst. Die Tests in "VolatilityTestCase.java" müssen noch auf die neue Berechnung adaptiert werden. Dies konnte ich leider nicht selbst durchführen, da ich das dort referenzierte Excelsheet nicht habe. Das kann ich aber gerne nachholen, wenn mir jemand die Datei zur Verfügung stellen kann.