Vision Transformers auf Charts: Bild-Erkennung im Trading.
Ein Trader sieht in zwei Sekunden, ob ein Chart „bullish aussieht". Kann ein Vision Transformer das auch — und ist daraus ein Edge zu machen? Die ehrliche Antwort liegt zwischen „faszinierend" und „selten Stand-Alone profitabel".
Die Grundidee.
Statt OHLCV-Daten als Zahlenreihen in ein LSTM oder einen Transformer zu schieben, rendert man den Kursverlauf als Bild — typischerweise als Candlestick-Chart mit Volumen-Subplot — und übergibt dieses Bild einem Vision-Model. Der Gedanke: klassische Chart-Patterns (Head-and-Shoulders, Double-Bottom, Flag, Wedge) sind visuelle Konzepte, und ein CNN oder Vision Transformer (ViT, Swin) ist genau auf visuelle Mustererkennung trainiert.
Sezer und Ozbayoglu zeigten 2018 mit ihrem „CNN-TA"-Ansatz, dass man technische Indikatoren als 15×15-Bilder kodieren und ein CNN drauf trainieren kann. Seitdem sind Dutzende Varianten erschienen — von rohen Candlestick-PNGs bis zu Gramian Angular Fields und Recurrence Plots. Mit der ViT-Welle ab 2021 wurde der Ansatz erneut populär.
Warum überhaupt visuell?
Es gibt eine ernsthafte Begründung und eine kosmetische. Die ernsthafte: Vision-Backbones sind auf riesigen Bild-Datasets vortrainiert (ImageNet, JFT-300M). Wenn der visuelle Raum eines Charts hinreichend Ähnlichkeit zu Natural Images hat — Kanten, Texturen, räumliche Hierarchien — könnte Transfer-Learning helfen. Das ist eine Hypothese, keine Garantie.
Die kosmetische Begründung: Charts sehen für Menschen wie Bilder aus, und „wir füttern den Markt einer KI als Bild" klingt in Pitch-Decks gut. Das ist kein Modellierungs-Argument, sondern Marketing.
Eine konkrete Pipeline.
So sieht ein minimaler ViT-Chart-Pipeline-Prototyp aus. Wichtig: das ist eine Forschungs-Skizze, kein Production-Setup.
import matplotlib.pyplot as plt
import mplfinance as mpf
import torch
from transformers import ViTImageProcessor, ViTForImageClassification
def render_window(df_window, out_path, size=(224, 224)):
fig, ax = plt.subplots(figsize=(size[0]/100, size[1]/100), dpi=100)
mpf.plot(df_window, type='candle', volume=False, ax=ax,
style='charles', axisoff=True)
plt.savefig(out_path, bbox_inches='tight', pad_inches=0)
plt.close(fig)
def label_window(df, idx, horizon=5, threshold=0.01):
fwd_ret = df['close'].iloc[idx + horizon] / df['close'].iloc[idx] - 1
if fwd_ret > threshold: return 2 # up
if fwd_ret < -threshold: return 0 # down
return 1 # flat
# pretrained backbone, Head ersetzen
proc = ViTImageProcessor.from_pretrained('google/vit-base-patch16-224')
model = ViTForImageClassification.from_pretrained(
'google/vit-base-patch16-224', num_labels=3, ignore_mismatched_sizes=True)
Daraus entsteht ein Klassifikator: Bild rein, Wahrscheinlichkeit für „up / flat / down" raus. Sobald das läuft, beginnt die eigentliche Arbeit: sauberes Walk-Forward, Cross-Asset-Generalisierung, Sanity-Checks gegen Look-Ahead.
Was die Studien wirklich zeigen.
Wenn ich die Literatur zu Chart-Image-CNN seit 2018 ehrlich zusammenfasse, sehe ich drei Muster:
- In-Sample-Wunder, Out-of-Sample-Mittelmaß. Viele Papers zeigen 60–70 % Accuracy in-sample, die out-of-sample auf 51–53 % schrumpft — gerade so über Zufallsniveau, oft unter Transaktionskosten.
- Vergleich gegen schwache Baselines. Die Konkurrenz ist oft „raw LSTM auf Close-Preisen", nicht ein sauber engineerter Boosted-Tree mit Standard-Features. Gegen Letzteren verlieren die meisten Bild-Modelle.
- Information-Loss. Eine 224×224-Rasterung eines 60-Bar-Charts wirft präzise Zahlenwerte zugunsten von Pixeln weg. Das ist nur dann ein Gewinn, wenn die räumlich-visuelle Struktur Information enthält, die numerische Features verfehlen — und das ist die Ausnahme, nicht die Regel.
Wann es trotzdem Sinn ergeben kann.
Ich verwerfe den Ansatz nicht pauschal. Drei Settings, in denen Chart-Vision einen messbaren Beitrag leisten kann:
- Als Feature-Generator, nicht Stand-Alone. Das Logit eines ViT-Heads wird als zusätzliches Feature in ein Boosted-Tree-Ensemble gegeben. Marginale, aber konsistente Beiträge sind möglich.
- Multi-Modal-Input. Chart-Bild plus News-Embedding plus Macro-Features in einem gemeinsamen Transformer. Die visuelle Modalität ergänzt, ersetzt aber nichts.
- Sehr lange Kontexte. Wenn man 1.000 Bars in einem Bild komprimiert anstatt 1.000 Tokens an einen Transformer zu geben, kann die Bildvariante effizienter sein. Das ist eher ein Compute-Argument als ein Edge-Argument.
Die typischen Fallen.
Wer Chart-Bilder ML-tauglich aufbereitet, läuft in dieselben drei Fallen, in die fast alle reinlaufen:
Renderings als Look-Ahead-Quelle. Wenn die Y-Achse jedes Charts individuell skaliert wird, fließt das Zukunfts-Maximum/-Minimum implizit ins Bild ein — Sie sehen am Y-Range, wie weit der Kurs noch laufen wird. Lösung: feste Skalierung, idealerweise log-Returns als Y-Achse.
Survivor-Bias im Bildkorpus. Trainieren Sie auf den heutigen S&P-500-Konstituenten, lernen Sie eine Welt ohne Pleiten. Das verzerrt die Bullish-Pattern-Verteilung systematisch.
Test-Set-Kontamination durch überlappende Fenster. Wenn Sie aus einem Kursverlauf 200 Bilder mit Stride 1 schneiden, sind benachbarte Bilder hochkorreliert. Saubere Walk-Forward-Splits sind Pflicht.
Compute-Realität.
Ein ViT-Base hat ca. 86 Mio. Parameter. Ein dezent großes Bild-Dataset mit sauberer Augmentation und Walk-Forward-CV ist ein Mehr-Tage-GPU-Job. Im Vergleich dazu trainiert ein Boosted-Tree auf den gleichen Daten in 10 Minuten und produziert in 80 % der Fälle eine vergleichbar gute oder bessere Out-of-Sample-Performance. Das ist die nüchterne Kostenrechnung, die in Blog-Posts gerne fehlt.
Meine Praxis.
Ich bin bei Chart-Vision skeptisch, aber nicht dogmatisch. In Mandantenprojekten habe ich den Ansatz mehrfach getestet — meist als ergänzendes Feature, selten als tragende Säule. Mein Resümee nach mehreren Iterationen: in ca. 1 von 5 Fällen liefert ein ViT-Logit als zusätzliches Feature einen kleinen, aber statistisch stabilen Beitrag zum Gesamt-Sharpe. In den anderen 4 Fällen ist der Beitrag im Rauschen verloren.
Wenn jemand Ihnen ein „ViT-basiertes Trading-System" verkaufen will, dessen Edge zu 100 % aus dem Bildmodell stammen soll, prüfen Sie zwei Dinge: das Out-of-Sample-Setup und die Y-Achsen-Skalierung der Trainings-Charts. Erfahrungsgemäß bricht eines von beiden unter genauer Prüfung zusammen.
Sie überlegen, ob Chart-Vision in Ihr Setup passt — als Feature oder Stand-Alone? Erstgespräch buchen — wir bewerten den Ansatz auf Ihre Daten.