Vier Preise in einem Bild
Ein Liniendiagramm der Schlusskurse wirft den Großteil eines Tages weg. Eine Kerze (Candlestick) behält vier Preise auf einmal: Eröffnung, Hoch, Tief und Schluss. Der dicke Körper reicht von der Eröffnung zum Schluss und wird nach der Richtung eingefärbt (grün, wenn der Schluss mindestens so hoch wie die Eröffnung ist, sonst rot). Der dünne Docht reicht vom Tief zum Hoch. Auf einen Blick sieht man, wohin der Tag lief, wie weit er schwankte und ob Käufer oder Verkäufer gewannen.
import numpy as np
import pandas as pd
df = pd.DataFrame(
{
"open": [100.0, 103.0, 102.0, 104.0],
"high": [104.0, 105.0, 106.0, 104.5],
"low": [ 99.0, 101.0, 101.5, 101.0],
"close": [103.0, 102.0, 105.5, 104.0],
},
index=pd.bdate_range("2026-03-02", periods=4),
)
# Green when the day closed at or above its open, red otherwise: one np.where on whole columns
colors = np.where(df["close"] >= df["open"], "green", "red")
print(colors.tolist()) # ['green', 'red', 'green', 'green']Den Körper berechnen
Ein Körper ist ein Rechteck. Er beginnt beim niedrigeren Wert von Eröffnung und Schluss (df[["open", "close"]].min(axis=1) nimmt das zeilenweise Minimum), und seine Höhe ist die absolute Differenz abs(close - open). Ein Tag, der zum selben Preis eröffnet und schließt, hat einen Körper der Höhe 0: ein Doji, eine Kerze der Unentschlossenheit. Den Körper mit der Spanne high - low zu vergleichen zeigt, wie entschieden der Tag war, und auf ganzen Spalten findet man alle Dojis eines Jahres in einer Zeile.
body = pd.DataFrame({
"bottom": df[["open", "close"]].min(axis=1), # the lower of open and close, row by row
"height": (df["close"] - df["open"]).abs(),
})
print(body)
# bottom height
# 2026-03-02 100.0 3.0
# 2026-03-03 102.0 1.0
# 2026-03-04 102.0 3.5
# 2026-03-05 104.0 0.0
# Body as a share of the day's range: the last day is a doji
share = body["height"] / (df["high"] - df["low"])
print(share.round(2).tolist()) # [0.6, 0.25, 0.78, 0.0]
print((share <= 0.1).tolist()) # [False, False, False, True]Zeichnen: Dochte und Balken
matplotlib hat keinen Candlestick-Aufruf, aber zwei einfache genügen. ax.vlines(x, ymin, ymax) zeichnet für jedes x auf einmal eine senkrechte Linie: das sind die Dochte, vom Tief zum Hoch. ax.bar(x, height, bottom=..., width=0.6, color=...) zeichnet für jedes x einen Balken ab bottom: das sind die Körper, und color akzeptiert eine Liste mit einer Farbe je Balken. Setzen Sie die Kerzen auf die Positionen 0, 1, 2, ... (np.arange(len(df))) statt auf Daten, damit Wochenenden keine Lücken lassen. Ganze Spalten zu übergeben erspart jede Schleife über die Tage.
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
x = np.arange(len(df))
ax.vlines(x, df["low"], df["high"], color="black", linewidth=1) # the wicks
ax.bar(x, body["height"], bottom=body["bottom"], width=0.6, color=colors) # the bodies
print(len(ax.collections), len(ax.patches)) # 1 4 one set of wicks, four bodies
print([p.get_y() for p in ax.patches]) # [100.0, 102.0, 102.0, 104.0] body bottoms
print(ax.collections[0].get_segments()[0].tolist()) # [[0.0, 99.0], [0.0, 104.0]] the first wick, low to high# Candles whose body is at most 10% of the day's range are dojis
doji = share <= 0.1
print(df.index[doji].strftime("%d %b").tolist()) # ['05 Mar']ax.patches enthält die Balken und ax.collections die Dochte, mit Positionen, Größen und Farben, die man prüfen kann. Die Axes statt der Pixel zu testen ist die Art, eine Zeichenfunktion automatisch zu verifizieren, und so debuggt man auch ein Diagramm, das falsch aussieht.- Eine Kerze zeigt Eröffnung, Hoch, Tief und Schluss: einen Körper von Eröffnung zu Schluss, einen Docht von Tief zu Hoch.
- Die Unterkante des Körpers ist
min(open, close)zeilenweise (min(axis=1)), die Höheabs(close - open); ein Körper von 0 ist ein Doji. - Zeichnen Sie alle Dochte mit einem
ax.vlines-Aufruf und alle Körper mit einemax.bar-Aufruf (Farbliste); keine Schleife über die Tage.
Als Nächstes: Histogramme und Verteilungen, die zählen, wie oft Renditen in jeden Bereich fallen.
Lab: Was bewertet wird
- Mit
candle_colorsjede Kerze nach ihrer Richtung einfärben25 Pkt. - Mit
candle_bodyden Körper jeder Kerze messen25 Pkt. - Mit
doji_daysdie unentschlossenen Tage finden25 Pkt. - Mit
draw_candlesdie Kerzen auf eine Axes zeichnen25 Pkt.