Léonard Noth
ENFRDE
← Projekte

SAFE

Finanznachrichten, drei Fragen auf einmal gelesen

Finanznachrichten, Satz für Satz gelesen: über welches Unternehmen gesprochen wird, wann das Ereignis stattfindet, und wie es sich anfühlt. Drei getrennte Fragen.

Rolle
Masterarbeit, alleiniger Autor
Umfang
Forschungsdesign · Datensatzerzeugung · Modelltraining · Backend-Dienste · Oberfläche
Gebaut mit
Python, PyTorch, BERT, scikit-learn, spaCy, SUTime, Flask, Vue 3, Docker, GPT-4
Team
Allein
Zeitraum
Masterarbeit, 2024 verteidigt, Note 6/6
Ergebnis
Note 6 von 6. Drei getrennte Fragen pro Satzfragment, aggregiert je Unternehmen und Zeitfenster, mit benannten Emotionspaaren statt einem erzwungenen Einzelsieger.

Das Problem

Finanz-Sentiment von der Stange sagt Ihnen, eine Schlagzeile sei negativ. Selten sagt es, negativ für wen, oder ob das Beschriebene bereits eingetreten ist. Ein einziger Artikel kann zu einem Unternehmen optimistisch und zu einem anderen düster sein und ein Ereignis vom letzten Jahr mit einer Prognose fürs nächste Quartal mischen. Das auf einen einzigen Wert zu reduzieren, wirft den grössten Teil des Signals weg.

Meine Rolle

Masterarbeit, alleiniger Autor, betreut von Dr. Sandy Ingram. Alles, von den Werkzeugen zur Datensatzerzeugung über die sechs Dienste bis zur Oberfläche.

Lesen als
Das Wesentliche in zwei Minuten

Wirkung

99,6% Validierungsgenauigkeit
Zeitlicher Klassifikator
98,8% Validierungsgenauigkeit
Sentiment-Klassifikator
96% auf 50 handannotierten Beispielen
Satzsegmentierung
6’501 annotierte Beispiele
Erzeugtes Korpus
6 / 6
Note

Der Systementwurf

  1. Den Datensatz erzeugen

    Für satzweise, finanzspezifische Zeitlichkeit gab es keinen öffentlichen Datensatz, also ist das erste Ergebnis ein Werkzeug, das einen baut.

    • Eine TOML-Datei beschreibt die Klassen, die Domäne und eine Handvoll handgeschriebener Startsätze
    • GPT-4 erzeugt und augmentiert von dort aus: 2’501 Zeitzeilen über fünf Klassen, 4’000 Sentiment-Zeilen über acht
  2. Belegen, dass die Klassen trennbar sind

    Vor jedem Training wird jedes Beispiel von drei unabhängigen Encodern eingebettet, und die Klassen werden auf statistische Trennung geprüft.

    • Genau dieser Schritt entdeckte die Überlappung von Angst und Trauer unter einem Encoder
    • Eine Schwäche, die man besser vor dem Training kennt als danach
  3. Segmentieren und Unternehmen zuordnen

    Ein Artikel wird in Sätze und dann in teilsatzgrosse Fragmente zerlegt, und jedes Fragment wird den Unternehmen zugeordnet, die es tatsächlich nennt.

    • 96% Übereinstimmung mit der Handsegmentierung auf einem Benchmark aus 50 Sätzen
  4. Zwei Fragen gleichzeitig

    Jedes Fragment geht parallel an zwei Dienste: wann findet das statt, und wie fühlt es sich an.

    • Zeitlichkeit: ein regelbasierter Tagger übernimmt explizite Daten, ein feinabgestimmtes BERT springt nur ein, wenn keine Datumsangabe vorkommt
    • Emotion: die acht Grundemotionen aus Plutchiks Rad statt positiv/negativ
  5. Aggregieren und das Paar benennen

    Die Ergebnisse werden je Unternehmen und Zeitfenster gezählt, und wenn die beiden führenden Emotionen dicht beieinanderliegen, nennt das System das Paar, das sie bilden.

    • Erwartung plus Freude ergibt Optimismus, und die Kompositionsregel stammt aus der Theorie, nicht von mir
    • Die acht Grundemotionen setzen sich zu den benannten Dyaden zusammen, statt direkt vorhergesagt zu werden
Plattformdienste
  • Sechs Docker-Dienste

    Segmentierung, Entitätszuordnung, Zeitlichkeit, Sentiment, der Entscheider und das Datensatz-CLI. Getrennt, weil ihre Abhängigkeiten sich tatsächlich widersprechen

  • SUTime auf einer JVM

    Regelbasierte Datumsnormalisierung; braucht Java, was einer der Gründe für den eigenen Container ist

  • Feinabgestimmtes BERT ×2

    Ein Modell für Zeitlichkeit, eines für Emotion, jeweils auf dem erzeugten Korpus trainiert

  • spaCy

    Satzaufteilung, Wortart-Tagging und das eigene Entitätsmodell, das Fragmente an Ticker bindet

  • Der Entscheider

    Der einzige Einstiegspunkt, mit dem die Oberfläche spricht; er aggregiert und bildet die Dyaden

  • Vue-SPA

    Einen Artikel einreichen, die Analyse je Unternehmen und Zeitfenster lesen

Zentrale Entscheidungen

Acht Emotionen vorhersagen, siebenundzwanzig zusammensetzen

statt · Positiv / negativ / neutral, oder alle zusammengesetzten Emotionen direkt vorhersagen

Ternäres Sentiment kann Angst nicht von Wut unterscheiden, und für einen Markt bedeuten die beiden Verschiedenes. Jede zusammengesetzte Emotion direkt vorherzusagen heisst viel mehr Klassen und schlechtere Werte für jede einzelne. Auf den acht Grundemotionen zu trainieren und die Paare danach zu bilden, hält die Klassenzahl klein und macht die Kompositionsregel vertretbar: sie stammt von Plutchik, nicht von mir.

Regeln und ein Modell, jedes für das, was es kann

statt · Ein Modell für alle Zeitausdrücke

Ein fixer Satz Gewichte kann keine Kalenderarithmetik gegen ein bewegliches Heute rechnen: 2023 ist 2024 jung und 2030 alt. Explizite Daten gehen deshalb an einen regelbasierten Tagger, und das Modell bearbeitet nur die impliziten Formulierungen. Die beiden Hälften überschneiden sich bauartbedingt nicht: die erzeugten Trainingsdaten hatten die ausdrückliche Anweisung, nie ein konkretes Datum zu nennen.

Klassengrenzen als Konfiguration

statt · Das Modell entscheiden lassen, was „aktuell“ heisst

Die Gegenwart einer Daytraderin misst sich in Stunden, die einer Pensionskasse in Quartalen. Liegen diese Schwellen in den Gewichten, heisst beide zu bedienen: neu annotieren und neu trainieren. In einer Konfigurationsdatei ist es eine Zeile. Das ist die Entscheidung, die ich am entschiedensten verteidigen würde.

Das Datensatz-Werkzeug bauen, nicht nur den Datensatz

statt · Ein einmaliges Generierungsskript

Jedes vorhandene Korpus hatte die falsche Granularität, die falsche Domäne oder war nicht öffentlich. Den Generator generisch zu bauen, gesteuert über eine TOML-Spezifikation, hiess, dass dasselbe Werkzeug beide Datensätze erzeugt hat und den nächsten erzeugen kann. Die Validierung ist darin eingebaut und nicht angehängt.

In der Praxis

Die Analyseansicht: je Unternehmen, je Zeitfenster, mit Emotions-Dyaden
Die Analyseansicht: je Unternehmen, je Zeitfenster, mit Emotions-Dyaden
Einreichen eines Artikels zur Analyse
Einreichen eines Artikels zur Analyse
Das Poster zur Arbeit
Das Poster zur Arbeit

Finanz-NLP von der Stange sagt Ihnen, eine Schlagzeile sei „negativ“. Es sagt selten, negativ für wen, oder ob das Beschriebene bereits geschehen ist. SAFE zerlegt einen Artikel in Teilsatz-Segmente, erkennt die genannten Ticker und klassifiziert dann jedes Segment zweimal: auf einer fünfklassigen Zeitachse (ferne Vergangenheit bis ferne Zukunft) und auf den acht Grundemotionen von Plutchiks Rad. Die Ergebnisse werden je Unternehmen und Zeitfenster aggregiert, und wenn zwei Emotionen dicht beieinanderliegen, nennt das System die Dyade, die sie bilden (Erwartung plus Freude ergibt Optimismus), statt einen Sieger zu küren.

Die Zeitlichkeit ist bewusst hybrid: Stanfords SUTime behandelt explizite Daten mit regelbasierter Präzision, und ein feinabgestimmtes BERT übernimmt erst, wenn keine Datumsangabe vorliegt. Die Klassengrenzen sind Konfiguration, keine Trainingsdaten. Was als „Gegenwart“ gilt, lässt sich ändern, ohne das Modell anzufassen.

Für keine der beiden Aufgaben existierte ein Datensatz; ein zweites Ergebnis ist deshalb ein CLI, das mit GPT-4 aus einer TOML-Spezifikation und einer Handvoll handgeschriebener Startsätze annotierte Daten erzeugt und augmentiert. Vor jedem Training wird jeder erzeugte Satz validiert: Jedes Beispiel wird mit drei unabhängigen Encodern eingebettet, und paarweise t-Tests prüfen, ob die Klassen tatsächlich trennbar sind. Genau dieser Durchlauf hat aufgedeckt, dass sich Angst und Trauer unter einem Encoder überlappen: eine Schwäche, die man besser vorher kennt als nachher.

Die ehrliche Einschränkung, in der Arbeit selbst benannt: Die berichteten Genauigkeiten sind Validierungswerte auf GPT-4-generierten Daten, ohne unabhängigen Testsatz. Sie messen die Passung an eine synthetische Verteilung, nicht die Leistung an echten Marktnachrichten. Und die NER-Stufe deckt nur NASDAQ-Titel ab.

Was ich gelernt habe

  • Das Wertvollste, was ich gebaut habe, war kein Modell, sondern das, was mir überhaupt erst einen Datensatz verschafft hat.
  • Zu entscheiden, was ein Modell nicht lernen soll, wiegt so schwer wie zu entscheiden, was es lernen soll. Explizite Daten wurden bewusst vom Netz ferngehalten, denn sie sind Arithmetik gegen einen beweglichen Bezugspunkt, und das können Gewichte nicht halten.
  • Acht Dinge gut vorherzusagen und siebenundzwanzig daraus zusammenzusetzen, schlug den Versuch, siebenundzwanzig Dinge schlecht vorherzusagen.
  • Wenn ich meine eigene Validierung mit frischem Blick lese, ist der Trennbarkeitstest enger, als er wirkt: er vergleicht, wie dicht jede Klasse zusammenliegt, und nicht, wie weit zwei Klassen auseinanderliegen. Er hat trotzdem eine echte Überlappung von Angst und Trauer gefunden, wofür ich ihn brauchte, aber heute würde ich ihn anders bauen.

Was es nicht leistet

  • Die berichteten Genauigkeiten sind Validierungswerte auf Daten, die dasselbe Modell erzeugt hat, das auch den Trainingssatz lieferte. Sie messen die Passung an eine synthetische Verteilung, nicht die Leistung an echten Marktnachrichten.
  • Ein Nachrichtenartikel ist nicht objektiv. Wenn ein Artikel eine Phase negativ zeichnet, ist sie es deshalb nicht. Das System misst die Berichterstattung, nicht die Wahrheit.
  • Die Entitätserkennung deckt NASDAQ-Titel ab, und die Unternehmen hinter einem Ticker wechseln laufend; aktuell zu bleiben hiesse, ständig neu zu annotieren.
  • Es gibt bewusst keine Finanzberatung. Ich bin kein Finanzberater, und der Schritt vom Sentiment zu einer Position wäre genau der Punkt, an dem das anfinge.