Verborgene Signale · Begleitseite ← Alle Aktivitäten DE·EN
Kapitel 14 · Die Psychohistorik · Aktivität 14.2

Asimovs Psychohistorik

Sagt die Laune der Menge die Börse voraus? Du legst die Stimmungskurve gegen den Dow Jones — und lernst am ehrlichen Ergebnis, warum Asimov seiner Psychohistorik einen „Maulesel“ zur Seite stellte.

Dauer Doppelstunde Schwierigkeit hoch Gruppe allein oder zu zweit Voraussetzung Aktivität 14.1 S

Kurz gesagt

Was: Du nimmst die tägliche Stimmung aus 14.1 und legst sie neben die tägliche Rendite des Dow Jones. Dann prüfst du zweierlei: Hängt die Stimmung von gestern mit dem Kurs von heute zusammen? Und kann ein Modell allein aus der Stimmung erraten, ob die Börse steigt oder fällt?

Der Kern-Gedanke: Das ist der Prüfstein der Psychohistorik. Schon 2010 haben wir aus der Twitter-Stimmung Börsenbewegungen vorherzusagen versucht. Hier machst du es nach — und begegnest der ehrlichsten Lehre des Kapitels: Die Menge ist ein bisschen vorhersagbar, aber nie ganz. Genau da wartet der Maulesel.

Du brauchst: denselben Kaggle-Datensatz wie in 14.1 (jetzt auch DJIA_table.csv) und Python mit pandas, vaderSentiment, scipy und scikit-learn.

Worum es geht

Asimov war zu klug, um seine Psychohistorik allmächtig zu machen. In den Romanen taucht eine Figur auf, die er den Maulesel nennt: ein einzelner, unvorhergesehener Mensch, der Seldons ganze Berechnung über den Haufen wirft. Die Menge folgt Mustern — bis ein Ausreisser kommt, den kein Muster kannte.

Genau diese Spannung misst du jetzt. Die Vermutung: Wenn die Stimmung der Menge kippt, müsste sich das in den Märkten zeigen — Angst drückt Kurse, Zuversicht hebt sie. Du prüfst das nicht am Bauchgefühl, sondern an acht Jahren Daten. Und du wirst sehen: Ein Fünkchen Zusammenhang ist da — aber wer daraus sicheres Geld machen will, trifft den Maulesel.

Bevor du startest — die Daten

Aus demselben Kaggle-Datensatz (aaron7sun/stocknews) brauchst du jetzt zusätzlich DJIA_table.csv — die täglichen Kurse des Dow-Jones-Index (Spalten Date, Open, High, Low, Close …). RedditNews.csv liefert wie in 14.1 die Schlagzeilen.

Ein bisschen Hintergrund

Warum „gestern gegen heute“? Eine Vorhersage ist nur dann eine, wenn die Ursache vor der Wirkung liegt. Darum stellen wir die Stimmung von gestern der Rendite von heute gegenüber. Fänden wir dort einen Zusammenhang, hiesse das: Die Stimmung läuft dem Kurs voraus — man könnte sie zum Vorhersagen nutzen. Vergleicht man dagegen denselben Tag mit sich selbst, misst man nur, dass schlechte Nachrichten und fallende Kurse zusammen auftreten — das ist keine Vorhersage.

Was ein ehrliches Ergebnis ist. Erwarte keine Wunder. Käme ein Modell auf 90 Prozent, wäre das ein Alarmzeichen für einen Fehler (meist ein Datenleck). Ein paar Punkte über der Zufallslinie sind das realistische, ehrliche Ergebnis — und schon das ist bemerkenswert, wenn man bedenkt, dass es allein aus dem Ton von Schlagzeilen kommt.

Stimmung und Börse verbinden

Erst die Stimmung wie in 14.1, dann die Rendite der Börse, dann beides über das Datum zusammenführen. Der vollständige Code liegt auf GitHub.

import pandas as pd
from vaderSentiment.vaderSentiment import SentimentIntensityAnalyzer

# 1) taegliche Stimmung (wie in 14.1)
nachrichten = pd.read_csv("RedditNews.csv")
vader = SentimentIntensityAnalyzer()
nachrichten["stimmung"] = nachrichten["News"].astype(str).apply(
    lambda t: vader.polarity_scores(t)["compound"])
stimmung = nachrichten.groupby("Date")["stimmung"].mean().rename("mood")
stimmung.index = pd.to_datetime(stimmung.index)

# 2) die Boerse: taegliche Rendite des Dow Jones
boerse = pd.read_csv("DJIA_table.csv", parse_dates=["Date"]).sort_values("Date")
boerse["rendite"] = boerse["Close"].pct_change()

# 3) beides ueber das Datum verbinden; Stimmung um einen Tag versetzen
tab = boerse.merge(stimmung.reset_index(), on="Date")
tab["mood_gestern"] = tab["mood"].shift(1)        # die Stimmung von GESTERN
tab = tab.dropna(subset=["mood_gestern", "rendite"])
print(len(tab), "gemeinsame Boersentage")

Sagt die Stimmung die Börse voraus?

Zwei Prüfungen: ein einfacher Zusammenhang und ein kleines Vorhersage-Modell — beide ehrlich gegen die Zufallslinie gemessen.

import numpy as np
from scipy.stats import pearsonr
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import cross_val_score

# a) Zusammenhang: Stimmung(gestern) vs. Rendite(heute)
r, p = pearsonr(tab["mood_gestern"], tab["rendite"])
print(f"Korrelation Stimmung(gestern) -> Rendite(heute):  r = {r:.3f},  p = {p:.2f}")

# b) Vorhersage: 'rauf oder runter' allein aus der Stimmung von gestern
X = tab[["mood_gestern"]].values
y = (tab["rendite"] > 0).astype(int)               # 1 = Boerse steigt
treffer = cross_val_score(RandomForestClassifier(200, random_state=0), X, y, cv=5).mean()
zufall  = max(np.bincount(y)) / len(y)
print(f"Treffer 'rauf/runter':  {treffer:.2f}   (Zufallslinie: {zufall:.2f})")

Was du sehen solltest

Die Korrelation ist winzig und meist kaum signifikant; das Modell landet nahe der Zufallslinie, vielleicht ein paar Punkte darüber. Das ist kein Misserfolg — es ist die ehrliche Antwort: Aus dem blossen Ton der Nachrichten lässt sich der Markt bestenfalls ein Stück weit ahnen, nicht sicher vorhersagen. Wer hier eine Geldmaschine erwartet hat, hat gerade den Maulesel getroffen.

Arbeitsblatt

Die Grenzen der Vorhersage

  1. Wie gross ist deine Korrelation, wie hoch dein Treffer gegen die Zufallslinie? Würdest du damit dein Erspartes anlegen?
  2. Warum vergleichen wir die Stimmung von gestern mit der Rendite von heute — und nicht beide vom selben Tag? Was wäre der Denkfehler beim selben Tag?
  3. Angenommen, ein Modell käme auf 95 Prozent. Warum wärst du misstrauisch statt begeistert?
  4. Was ist in dieser Aufgabe der „Maulesel“? Nenne ein reales Ereignis, das keine Stimmungskurve hätte vorhersehen können.
  5. Stell dir vor, die Vorhersage würde deutlich besser. Wer könnte damit Gutes tun — und wer Schaden anrichten? Nenne je ein Beispiel.
Lösung anzeigen

1. Individuell — typisch eine sehr kleine Korrelation und ein Treffer nahe der Zufallslinie. Ehrliche Antwort: Nein, für eine Geldanlage ist das viel zu unsicher; die Streuung ist riesig gegen den winzigen Vorteil.

2. Eine Vorhersage verlangt, dass die Ursache vor der Wirkung liegt. Beim selben Tag misst du nur, dass schlechte Nachrichten und fallende Kurse gleichzeitig auftreten — das ist rückwärts gedacht und taugt nicht zum Vorhersagen; man wüsste das Ergebnis ja schon.

3. Weil 95 Prozent bei so einem verrauschten Problem fast sicher auf einen Fehler hindeuten — meist ein „Datenleck“, bei dem versehentlich Information über die Zukunft in die Merkmale gerät. Zu gute Ergebnisse sind ein Warnsignal, kein Triumph.

4. Der Maulesel ist das Unvorhersehbare: ein Attentat, ein überraschender Zentralbank- Entscheid, eine Naturkatastrophe, ein einzelner Tweet einer mächtigen Person. Kein Stimmungsmittel über Millionen kann einen solchen Einzelschlag vorwegnehmen.

5. Gutes: Frühwarnung vor Panik, Krisenhilfe, das Erkennen kollektiver Not. Schaden: Manipulation von Wahlen oder Märkten, Überwachung, das gezielte Schüren von Stimmungen. Dieselbe Macht, zwei Richtungen — deshalb gehört Mündigkeit dazu.

Wenn's klemmt

ProblemWahrscheinliche Ursache & Lösung
merge ergibt 0 ZeilenDatumsformate passen nicht. Beide Seiten mit pd.to_datetime auf echtes Datum bringen, bevor du zusammenführst.
Sehr hohe Treffer (> 0,9)Fast sicher ein Datenleck — z. B. die heutige Rendite (oder Close) steckt versehentlich in X. Nur mood_gestern als Merkmal verwenden.
Treffer schwankt stark je LaufWenig Signal, viel Rauschen. cross_val_score über mehrere Faltungen mitteln und die Zufallslinie danebenstellen.
Korrelation nanFehlende Werte durch das Versetzen. Mit dropna die erste Zeile (ohne „gestern“) entfernen.
Andere SpaltennamenManche Versionen nennen die Kursspalte anders. Mit boerse.columns prüfen und Close anpassen.

Zum Nachdenken

Erweiterung

← 14.1 Die Stimmung des Schwarms Alle Aktivitäten →