Skip to content
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

Closed
wants to merge 4 commits into from
Closed

Changed volatility calculation using log returns #681

wants to merge 4 commits into from

Conversation

@es86de
Copy link
Contributor

@es86de es86de commented Dec 29, 2016

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.

@es86de es86de changed the title Changed volatility calculation using log returns. Changed volatility calculation using log returns Dec 29, 2016
@buchen
Copy link
Owner

@buchen buchen commented Jan 2, 2017

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.

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.

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:
VolatilityTestCase.xlsx
Wie müsste man die Formel anpassen?

@es86de
Copy link
Contributor Author

@es86de es86de commented Jan 3, 2017

Hallo @buchen,

vielen Dank für das Excelsheet!

Wie müsste man die Formel anpassen?

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":

  • testVolatilityIfSecurityIsSoldDuringReportingPeriod()
  • testVolatilityIfSecurityIsSoldAndLaterBoughtDuringReportingPeriod()
  • testVolatilityIfBenchmarkHasNoQuotes()

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
Eric

@buchen
Copy link
Owner

@buchen buchen commented Jan 4, 2017

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

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:

https://github.com/buchen/portfolio/blob/master/name.abuchen.portfolio/src/name/abuchen/portfolio/snapshot/PerformanceIndex.java#L201-L216

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:

VolatilityTests_fail.xlsx

@es86de
Copy link
Contributor Author

@es86de es86de commented Jan 4, 2017

Wunderbar, mit deiner extrahierten Tabelle stimmen Excel und PP überein: VolatilityTests.xlsx (runterscrollen).

Damit fehlen nur noch:

  • testVolatilityIfSecurityIsSoldAndLaterBoughtDuringReportingPeriod()
  • testVolatilityIfBenchmarkHasNoQuotes()

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?

@es86de
Copy link
Contributor Author

@es86de es86de commented Jan 4, 2017

Das Excelsheet im letzten Beitrag hatte einen Copy&Paste-Fehler. Hier die Korrektur: VolatilityTests.xlsx.

@buchen
Copy link
Owner

@buchen buchen commented Jan 5, 2017

Aber wahrscheinlich habe ich mit der "dax.xml" die falsche Portfoliedatei geöffnet. Welche muss ich denn verwenden?

Die liegt hier: name.abuchen.portfolio.tests/src/scenarios/volatility.xml

In meiner Entwicklungsumgebung starte ich PP immer mit der Option -Dname.abuchen.portfolio.auto-updates=no. Dann werden beim Öffnen der Datei keine Kurse aktualisiert. Aktualsierte Kurse könnten ja die Berechnung auch ändern.

@es86de
Copy link
Contributor Author

@es86de es86de commented Jan 5, 2017

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.

buchen added a commit that referenced this issue Jan 7, 2017
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>
buchen added a commit that referenced this issue Jan 7, 2017
@buchen
Copy link
Owner

@buchen buchen commented Jan 7, 2017

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?

@buchen buchen closed this Jan 7, 2017
@es86de
Copy link
Contributor Author

@es86de es86de commented Jan 7, 2017

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:

  1. Hier findet sich eine eher kompakte Beschreibung der Volatilität:
    https://www.ideas-magazin.de/2016/ausgabe-172/wissen/volatilitaet-definition-erklaerung/
  2. Und hier wird das ganze Thema etwas mathematischer beschrieben:
    https://www.wiso.uni-hamburg.de/fileadmin/bwl/statistikundoekonometrie/Kindermann/QUIAM_SoSe_2009/quiam_sitzung02_sose09n.pdf

@es86de
Copy link
Contributor Author

@es86de es86de commented Jan 7, 2017

Btw, Issue #631 könnte m.E. damit auch geschlossen werden.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Linked issues

Successfully merging this pull request may close these issues.

None yet

2 participants