
Datenanalyse mit Pandas, NumPy und Matplotlib
Finanzdaten bereinigen, transformieren und visualisieren wie ein Quant
NumPy: Der Motor unter der Motorhaube
Jede ernsthafte finanzielle Berechnung in Python läuft letztlich über NumPy. Während Python-Listen flexibel sind, sind sie langsam — jedes Element ist ein vollständiges Python-Objekt mit Typprüfungs-Overhead. NumPy-Arrays speichern rohe Zahlen in zusammenhängenden Speicherblöcken, was Operationen ermöglicht, die 100-mal schneller laufen als reine Python-Loops.
Hier ist der Unterschied in der Praxis:
import numpy as np
# Create an array of 1 million random daily returns
returns = np.random.normal(0.0005, 0.02, 1_000_000)
# Vectorized operations — no loops needed
cumulative = np.cumprod(1 + returns) # Growth of $1
sharpe = returns.mean() / returns.std() * np.sqrt(252)
max_drawdown = np.min(cumulative / np.maximum.accumulate(cumulative) - 1)
print(f"Sharpe Ratio: {sharpe:.3f}")
print(f"Max Drawdown: {max_drawdown:.2%}")
Zentrale NumPy-Konzepte für Finance:
- Vektorisierte Operationen — Wende Mathematik auf ganze Arrays gleichzeitig an, statt Element für Element zu loopen.
- Broadcasting — Richtet automatisch Arrays unterschiedlicher Formen für Arithmetik aus (z. B. das Subtrahieren eines skalaren Mittelwerts von jedem Element).
- Lineare Algebra —
np.linalgstellt Matrixmultiplikation, Eigenwertzerlegung und Solver bereit, die in der Portfolio-Optimierung genutzt werden. - Zufallsstichproben — Monte-Carlo-Simulationen, Bootstrap-Sampling und stochastische Modellierung verlassen sich alle auf
np.random.
Performance-Tipp: Bevorzuge immer vektorisierte NumPy-Operationen gegenüber Python-For-Loops. Eine Portfolio-Optimierung über 500 Assets, die mit Loops 30 Sekunden dauert, kann mit vektorisiertem NumPy in unter 50 Millisekunden fertig sein — eine 600-fache Beschleunigung.
Pandas: DataFrames für Finanzdaten
Wenn NumPy der Motor ist, ist pandas das Dashboard. Es umhüllt NumPy-Arrays in beschriftete, indizierte Strukturen, die die Manipulation von Finanzdaten intuitiv und ausdrucksstark machen.
Die zwei Kernstrukturen sind:
- Series — Eine einzelne Datenspalte mit einem Index (denk an: eine Zeitreihe von Schlusskursen).
- DataFrame — Eine Tabelle von Spalten, jede eine Series, die einen gemeinsamen Index teilen (denk an: OHLCV-Candlestick-Daten).
Daten zu laden und zu inspizieren ist unkompliziert:
import pandas as pd
# Read from CSV
df = pd.read_csv("btc_daily.csv", parse_dates=["date"], index_col="date")
# Or from JSON (common in API responses)
df = pd.read_json("https://api.example.com/candles?symbol=ETH")
# Quick inspection
print(df.shape) # (365, 5)
print(df.dtypes) # Column types
print(df.describe()) # Statistical summary
print(df.tail()) # Last 5 rows
Was pandas für Finance unentbehrlich macht, ist sein DatetimeIndex. Sobald dein Index vom Typ Datetime ist, schaltest du mächtige Zeitreihenoperationen frei:
# Slice by date range
q1_data = df["2025-01":"2025-03"]
# Resample daily data to weekly OHLC
weekly = df["close"].resample("W").ohlc()
# Forward-fill missing data (weekends, holidays)
df = df.asfreq("D").ffill()
Diese Operationen handhaben die unordentlichen Realitäten von Finanzdaten — Lücken, Zeitzonenunterschiede, unregelmäßige Zeitstempel —, damit du dich auf die Analyse konzentrieren kannst statt auf Daten-Verrohrung.
Rollende Berechnungen: Gleitende Durchschnitte und Volatilität
Finanzanalyse ist von Natur aus gefenstert. Dich interessiert selten ein einzelner Datenpunkt isoliert — Kontext kommt daher, wie er sich zur jüngsten Historie verhält. Pandas' .rolling()-Methode ist hier dein primäres Werkzeug.
import pandas as pd
import numpy as np
# Assume df has a "close" column with DatetimeIndex
df["sma_20"] = df["close"].rolling(20).mean()
df["sma_50"] = df["close"].rolling(50).mean()
df["ema_12"] = df["close"].ewm(span=12).mean()
# Daily returns and rolling volatility
df["returns"] = df["close"].pct_change()
df["vol_30d"] = df["returns"].rolling(30).std() * np.sqrt(365)
# Bollinger Bands
df["bb_upper"] = df["sma_20"] + 2 * df["close"].rolling(20).std()
df["bb_lower"] = df["sma_20"] - 2 * df["close"].rolling(20).std()
# Rolling correlation between two assets
df["corr_btc_eth"] = df["btc_returns"].rolling(60).corr(df["eth_returns"])
Zentrale rollende Berechnungen, die jeder Trader kennen sollte:
- Simple Moving Average (SMA) — Gleichgewichteter Durchschnitt über N Perioden. Nachlaufend, aber stabil.
- Exponential Moving Average (EMA) — Gewichtet jüngere Daten stärker über
.ewm(). Reagiert stärker auf Preisänderungen. - Rollierende Volatilität — Standardabweichung der Renditen über ein Fenster, annualisiert. Essenziell für Positionsgrößen und Risikobudgets.
- Rollierende Korrelation — Misst, wie sich zwei Assets im Laufe der Zeit gemeinsam bewegen. Entscheidend für Portfolio-Diversifikation.
Auf Plattformen wie GaiaEx kannst du historische Candle-Daten über die Trading-API abrufen, in ein pandas-DataFrame laden und diese Indikatoren in Sekunden berechnen — während deine Assets sicher in deiner MPC-Wallet bleiben.
GroupBy und Aggregation für Portfolio-Analyse
Wenn du mehrere Assets verwaltest, wird .groupby() essenziell. Es lässt dich Daten nach Kategorie aufteilen, Berechnungen anwenden und Ergebnisse kombinieren — das Split-Apply-Combine-Muster.
# DataFrame with multiple assets
trades = pd.DataFrame({
"symbol": ["BTC", "ETH", "BTC", "SOL", "ETH", "BTC"],
"side": ["buy", "buy", "sell", "buy", "sell", "buy"],
"pnl": [120.5, -45.2, 89.0, 210.3, 55.8, -30.1],
"volume": [5000, 3200, 4800, 1500, 2900, 5100],
})
# Performance by asset
summary = trades.groupby("symbol").agg(
total_pnl=("pnl", "sum"),
avg_pnl=("pnl", "mean"),
trade_count=("pnl", "count"),
total_volume=("volume", "sum"),
win_rate=("pnl", lambda x: (x > 0).mean()),
)
print(summary.sort_values("total_pnl", ascending=False))
Fortgeschrittene Aggregationsmuster für Portfolio-Arbeit:
- Mehrstufiges GroupBy — Gruppiere nach Symbol und Seite, um Long- vs. Short-Performance pro Asset zu sehen.
- Benutzerdefinierte Aggregationsfunktionen — Berechne Sharpe Ratios, Sortino Ratios oder maximalen Drawdown pro Asset-Gruppe.
- Pivot-Tabellen — Forme Daten um, um monatliche Renditen pro Asset in einem heatmap-freundlichen Format mit
pd.pivot_table()zu sehen. - Resampling mit GroupBy — Kombiniere zeitbasiertes Resampling mit kategorialer Gruppierung für Multi-Asset-Zeitreihenanalyse.
Matplotlib: Preisverlauf und Signale visualisieren
Daten ohne Visualisierung sind nur Zahlen. Matplotlib verwandelt deine Analyse in Charts, die Muster offenbaren, die in Rohdaten unsichtbar sind.
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
fig, axes = plt.subplots(3, 1, figsize=(14, 10),
sharex=True, gridspec_kw={"height_ratios": [3, 1, 1]})
# Price + Moving Averages
axes[0].plot(df.index, df["close"], label="Close", linewidth=1.2)
axes[0].plot(df.index, df["sma_20"], label="SMA 20", linestyle="--")
axes[0].fill_between(df.index, df["bb_upper"], df["bb_lower"],
alpha=0.1, color="blue", label="Bollinger Bands")
axes[0].set_ylabel("Price (USD)")
axes[0].legend(loc="upper left")
# Volume bars
colors = ["green" if c > o else "red"
for c, o in zip(df["close"], df["open"])]
axes[1].bar(df.index, df["volume"], color=colors, alpha=0.7)
axes[1].set_ylabel("Volume")
# Rolling Volatility
axes[2].plot(df.index, df["vol_30d"], color="purple")
axes[2].set_ylabel("30d Volatility")
axes[2].axhline(y=0.8, color="red", linestyle=":", alpha=0.5)
axes[2].xaxis.set_major_formatter(mdates.DateFormatter("%b %Y"))
plt.tight_layout()
plt.savefig("analysis_dashboard.png", dpi=150)
plt.show()
Das erzeugt ein professionelles Drei-Panel-Dashboard: Preisverlauf mit Bollinger-Bändern oben, Volumen in der Mitte und Volatilität unten. Dieses Layout spiegelt, was du auf professionellen Trading-Terminals sehen würdest.
Für statistische Visualisierung baut seaborn auf Matplotlib auf mit High-Level-Funktionen:
import seaborn as sns
# Return distribution
sns.histplot(df["returns"].dropna(), bins=100, kde=True)
# Correlation heatmap across assets
corr_matrix = portfolio_returns.corr()
sns.heatmap(corr_matrix, annot=True, cmap="RdYlGn", center=0)Alles zusammenbringen: Eine vollständige Analyse-Pipeline
Die echte Kraft entsteht, wenn du diese Werkzeuge zu einer wiederholbaren Pipeline verkettest. Hier ist ein Workflow, den professionelle Quants täglich nutzen:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
def analyze_asset(symbol: str, df: pd.DataFrame) -> dict:
"""Full analysis pipeline for a single asset."""
df["returns"] = df["close"].pct_change()
df["log_returns"] = np.log(df["close"] / df["close"].shift(1))
return {
"symbol": symbol,
"total_return": (df["close"].iloc[-1] / df["close"].iloc[0]) - 1,
"annual_vol": df["returns"].std() * np.sqrt(365),
"sharpe": df["returns"].mean() / df["returns"].std() * np.sqrt(365),
"max_drawdown": (df["close"] / df["close"].cummax() - 1).min(),
"skewness": df["returns"].skew(),
"kurtosis": df["returns"].kurtosis(),
}
# Analyze multiple assets
results = [analyze_asset(sym, data) for sym, data in assets.items()]
summary = pd.DataFrame(results).set_index("symbol")
print(summary.round(4))
Diese Pipeline nimmt rohe Preisdaten und produziert ein umfassendes Risiko-Rendite-Profil für jedes Asset. Von hier aus kannst du diese Kennzahlen in einen Portfolio-Optimierer einspeisen, Allokationsempfehlungen erzeugen oder Rebalancing-Signale auslösen.
Der Pandas-NumPy-Matplotlib-Stack ist das Fundament, auf dem alles andere in Python-Finance aufbaut. Beherrsche diese drei Bibliotheken, und du hast die Fähigkeiten, jeden Markt zu analysieren, jeden Indikator zu bauen und jede Strategie zu visualisieren — egal ob du Aktien an der NYSE, Krypto auf GaiaEx oder Derivate an der CME handelst.