CORE – Da­­ten­vi­su­a­li­si­e­rung mit Plot­ly und Dash

AI, Web
5. Januar 2023

Erarbeitet im Rahmen der Vorlesung „Data Visualization“, während meines Studiums in AI/ML an der Hochschule Luzern

Dieses Projekt ist entstanden in Kooperation mit:

Motivation

Unser Tool soll eine Hilfestellung für zukünftige Investitionen sein, indem es den Gewinn und die Korrelation zwischen verschiedenen Assets grafisch darstellt. 

Ein konkreter Anwendungsfall wäre folgender:  

Einem Hedge Fond ist es nicht nur wichtig gute Gewinne zu machen. Im besten Fall möchte man auch eine möglichst kontinuierliche Wertsteigerung, ohne grosse Drawdowns erzielen.  Dies kann erreicht werden, indem man sich für sein Portfolio Assets aussucht, die untereinander eine starke negative Korrelation aufweisen. Einfach gesagt: Wenn eines nach oben geht, dann geht das andere nach unten. Da man in beide investiert ist, resultiert daraus eine kontinuierlichere Bilanz (Blau). 

+ = 

Daten

Für unsere Daten brauchen wir zwei Datasets aus mit Aktien des S&P500. Das eine beinhaltet die Preisdaten aller Aktien über eine Zeitspanne, das andere haben wir genutzt, um Zusatzinformationen zum Aktientitel zu erhalten, beispielsweise den ausgeschriebenen Firmennamen und den Sektor in welchem die Firma tätig ist. 

Datenaufbereitung

Die rohen Preisdaten sehen folgendermaßen aus. Zu jedem Datum gibt es für jede Aktie die Preise im OHLC (Open, High, Low, Close, Volume) Format. Dabei ist der Name der Aktie auch nur ein Spaltenwert. Dies war für unsere Anwendung nicht optimal. 

Diese Daten wurden mit Pandas herumjongliert, damit wir die Preise in folgendem Format erhielten: 

Dabei sind die jetzt Spaltennamen die Namen der Aktien und die Spaltenwerte die „close“ Preise der Aktie an diesem Tag. Eine Tabelle mit demselben Format wurde für die täglichen Handelsvolumen erstellt. Damit diese Datenmanipulation nicht jedes Mal gemacht werden muss, wurden diese Tabellen abgespeichert sodass damit weitergearbeitet werden kann. 

Prozess

Ideenfindung / Konzeption

Bereits zu Beginn war für uns beide klar, dass wir etwas mit Finanzdaten machen möchten, da dies ein Gebiet ist, welches uns beide interessiert. Unsere erste Idee ein «relatives Price Chart» zu machen erwies sich als zu wenig anspruchsvoll. Nach Rücksprache mit unserem Dozenten war schnell klar, dass eine Funktion aus dem Data Science Bereich eine Komponente der Applikation werden sollte. So kamen wir auf die Idee verschiede Aktien nach Korrelation und Gewinn miteinander zu vergleichen. 

Die Frage mit welcher Technologie das Ganze umgesetzt werden sollte war für uns recht einfach zu beantworten. Wir kennen uns bereits in Python aus, haben aber vorher noch nie mit Plotly gearbeitet. Deshalb entschieden wir uns für dieses Framework. 

Umsetzung

Am Anfang der Implementation haben wir uns darauf festgelegt, die Datenverarbeitung in einem eigenen Modul, nebst der Darstellung und der App selber zu machen. So entstand eine organische Aufteilung der Zuständigkeitsbereiche. Reto befasste sich mit dem GUI während Tim sich um die benötigten Funktionen im Backend kümmerte.  

Zuerst fokussierten wir uns auf die Hauptgrafik. Einen Scatterplot aller Aktien mit ROI Wert auf der Y- und der Korrelation zur ausgewählten Aktie auf der X-Achse. Dies war für uns das Proof of Concept. Als diese Grafik funktionierte, waren wir motiviert weitere Funktionalitäten einzubauen. Diese kamen in der folgenden Reihenfolge: 

  1. Zeitspannen Selektor: Erlaubt die Auswahl eine Zeitspanne, in welcher die Aktien verglichen werden. 
  1. Hover Infos: Mithilfe eines zweiten Datensatzes kann zu jeder Aktie zusätzliche Infos, beispielsweise der Industriesektor angezeigt werden. Weiter erlaubt uns diese Info auch die Punkte auf dem Graph zu filtern. 
  1. Korrelations Filter: Über einen Slider kann die gewünschte Korrelation gefiltert werden. 
  1. Zusätzliche Charts: Beim hovern über eine Aktie wird der Preisverlauf von dieser und der ausgewählten Aktie in einem separaten Chart angezeigt. In einer weiteren Graphik wird das durchschnittliche Handelsvolumen angezeigt. 
  1. Art der Korrelation: Der User kann festlegen, mithilfe welches Korrelation Typus er die Punkte auf dem Scatterplot darstellen möchte. 

Darstellung  

Scatterplot 

Als Hauptgrafik wurde ein Scatterplot gewählt, da wir diverse Datenpunkte haben und zwei eindeutige Werte, welche diesen Punkten zugewiesen werden. So wird auf der x-Achse die Korrelation und auf der y-Achse der Return on Invest dargestellt, die Punkte sind entsprechend diesen beiden Werten im Graphen verteilt.  Die Sektoren wurden eingefärbt, sodass ein Investor die Übersicht besser behalten kann. Weiter kann durch die daraus resultierende Legende nach Sektoren gefiltert werden. 

Line Chart

Um detailliertere Informationen zu der gewählten Aktie und einer weiteren zu erhalten, wurden Grafiken eingebaut, welche on hover aktualisiert werden. Da wir einen Verlauf darstellen und vergleichbar machen wollten, haben wir den Line Chart gewählt. Weiter kann man durch die klare Verbindung der Linien die kleinsten Veränderungen des Preises sehen und einen längerfristigen Trend ausmachen. Zur besseren Unterscheidung der beiden Linien und entsprechend der Aktien wurden zwei verschiedene Farben eingesetzt. 

Bar Chart

Als weitere hover Grafik, hat sich ein Bar Chart angeboten, welcher den Median des täglichen Handelsvolumens zweier Aktien darstellt. Da auch hier wieder ein Vergleich stattfindet, wurden die beiden Werte in denselben Farben eingefärbt wie beim Line Chart. 

Schwierigkeiten

Zu Beginn war es schwierig, eine Darstellung zu finden, welche nicht zu “langweilig” auf den User wirkt. Weiter hatten wir Mühe eine Data Mining Technik zu finden, die man gleichzeitig visualisieren und den Use Case der Visualisierung einfach erklären kann.  

Eine weitere Schwierigkeit war, dass sowohl Dash, als auch Plotly Neuland für uns waren und wir uns erst einarbeiten mussten. So hat die Auslagerung Data Science Funktionen in ein eigenes Modul zu Beginn Probleme bereitet. Weiter haben die Einstellung und Definition von Filtern bis zum Schluss immer wieder aufs Neue Probleme verursacht. 

Auch die Geschwindigkeit bei gewissen Filtern war problematisch, da das Dataframe angepasst und gegebenenfalls überschrieben werden muss. Sofern über das komplette Dataframe Anpassungen gemacht werden müssen oder gefiltert werden muss, so geschieht das 500 mal, gerade beim Filter der Art der Korrelation, wurde uns dies zum Verhängnis. Dies haben wir gelöst indem wir eine effizientere Methode für die Berechnung der Korrelationen implementierten. 

Endprodukt

Das Endprodukt ist eine Dash Applikation, darin sind mehrere Grafiken, Filter und Callbacks definiert. Der Grossteil der Funktionen wurden in einem separaten File festgelegt, das Styling der Komponenten ebenfalls. Weiter wurde Bootstrap importiert, sodass wir das eigene Stylesheet so kurz als möglich halten und trotzdem eine ansprechende Applikation gestalten konnten. 

Reflexion

Bei der Ideenfindung hätten wir sicher etwas mehr Zeit investieren und kreativer werden können, aber schlussendlich, haben wir ein Thema gefunden, welches uns beide interessiert und wir viele und auch gute Daten gefunden haben. So konnten wir uns auf die Grafik konzentrieren und unserem kreativen Gestaltungsprozess freien Lauf lassen. 

Beide Teammitglieder haben selbstständig neue Funktionen, Filter und Grafiken implementiert, diese Änderungen wurden meist im Nachhinein gezeigt, kurz vorgestellt und besprochen. Dabei war das persönliche Interesse bestimmt von Vorteil, denn die Funktionen waren meist sinnvoll gewählt und durch die Eigenmotivation wurde mehr geleistet, als dies bei einem anderen Datensatz der Fall gewesen wäre. 

Die Zusammenarbeit verlief sehr gut, wenn wir auf Probleme gestossen sind, konnten wir die andere Person um Hilfe bitten. Die Verantwortungsbereiche waren klar aufgeteilt. Je nach Bedarf wurden auch andere Arbeiten übernommen bzw. die Rollen getauscht. Durch die geteilten Aufgaben und separierte Dateien, hatten wir auch kaum Probleme mit Git. 

Vision

Wenn wir an diesem Projekt weiterarbeiten würden, kämen als nächstes die folgenden Features hinzu. 

Verschiedene Assets

Aktuell verwenden wir nur Daten von Aktien des S&P500. hauptsächlich aus dem Grund, dass bei diesem Projekt nicht die Datenbeschaffung, sondern die Visualisierung im Vordergrund stand. Das Problem dabei ist jedoch, dass viele Aktien dieses Index bereits eine hohe Korrelation untereinander aufweisen. Deshalb wäre es interessant weitere Assets wie Edelmetalle, Kryptowährungen, Obligationen, usw. in den Datensatz aufzunehmen. 

Korrelation zu ganzem Portfolio

In der Praxis ist man nicht nur in eine Aktie investiert, sondern hat schon ein Portfolio aus unterschiedlichen Assets. Deshalb wäre es gut, wenn man in unserem Tool bei der Auswahl des Assets nicht nur eines, sondern mehrere angeben könnte. So könnte die Korrelation der einzelnen Assets zu einem Ganzen Portfolio und nicht nur zu einem einzelnen Wert berechnet werden. 

Reti

Als Webentwickler und begeisterter AI-Student bin ich immer auf der Suche nach neuen Projekten. Ob Websites gestalten, Apps entwickeln oder Algorithmen optimieren, ich bin stets bereit, mich neuen Herausforderungen zu stellen.