σμimplied vol · KKmax(S−K,0)udβρᵢⱼfat tailsPnL · drawdownyield · TdSₜ = μSₜ dt + σSₜ dWₜC = S·N(d₁) − K·e⁻ʳᵀ·N(d₂)σₚ² = wᵀΣwd₁ = [ln(S/K) + (r + σ²⁄2)T] ⁄ σ√T∂V/∂t + ½σ²S²·∂²V/∂S² + rS·∂V/∂S − rV = 0Sharpe = (Rₚ − R_f) ⁄ σₚVaR₉₉ = μ − 2.33σρ = Cov(X,Y) ⁄ σₓσᵧE[Rₚ] = Σ wᵢ·E[Rᵢ]φ(x) = e^(−x²/2) ⁄ √2πE[Rᵢ] = R_f + βᵢ(E[Rₘ] − R_f)dXₜ = θ(μ − Xₜ)dt + σ dWₜσ²ₜ = ω + α·ε²ₜ₋₁ + β·σ²ₜ₋₁C − P = S − K·e⁻ʳᵀΔ = ∂V/∂S Γ = ∂²V/∂S²p = (e^(rΔt) − d) ⁄ (u − d)rₜ = ln(Pₜ ⁄ Pₜ₋₁)E[Xₜ₊₁ | ℱₜ] = Xₜf* = (bp − q) ⁄ bz = (x − μ) ⁄ σP(N=k) = λᵏe^(−λ) ⁄ k!Θ = −∂V/∂Tν = S·φ(d₁)·√Tmin wᵀΣw s.t. wᵀμ = μ*∫Σ∂∞λ
σμimplied vol · KKmax(S−K,0)udβρᵢⱼfat tailsPnL · drawdownyield · TdSₜ = μSₜ dt + σSₜ dWₜC = S·N(d₁) − K·e⁻ʳᵀ·N(d₂)σₚ² = wᵀΣwd₁ = [ln(S/K) + (r + σ²⁄2)T] ⁄ σ√T∂V/∂t + ½σ²S²·∂²V/∂S² + rS·∂V/∂S − rV = 0Sharpe = (Rₚ − R_f) ⁄ σₚVaR₉₉ = μ − 2.33σρ = Cov(X,Y) ⁄ σₓσᵧE[Rₚ] = Σ wᵢ·E[Rᵢ]φ(x) = e^(−x²/2) ⁄ √2πE[Rᵢ] = R_f + βᵢ(E[Rₘ] − R_f)dXₜ = θ(μ − Xₜ)dt + σ dWₜσ²ₜ = ω + α·ε²ₜ₋₁ + β·σ²ₜ₋₁C − P = S − K·e⁻ʳᵀΔ = ∂V/∂S Γ = ∂²V/∂S²p = (e^(rΔt) − d) ⁄ (u − d)rₜ = ln(Pₜ ⁄ Pₜ₋₁)E[Xₜ₊₁ | ℱₜ] = Xₜf* = (bp − q) ⁄ bz = (x − μ) ⁄ σP(N=k) = λᵏe^(−λ) ⁄ k!Θ = −∂V/∂Tν = S·φ(d₁)·√Tmin wᵀΣw s.t. wᵀμ = μ*∫Σ∂∞λ
uantCraft AcademySkills
Ctrl K
AO
+1,2 Tsd. Lernende
AnmeldenBeitreten ↗
Skills
AO
+1,2 Tsd. Lernende
Anmelden
  • English
  • Français
  • Español
  • العربية
  • Português
  • Deutsch
  • 日本語
  • 中文
Python-Skill›Modul 2 · NumPy & pandas für Marktdaten›Thema 2.19·~40 Min.Mittelstufe

Kerzendiagramme

Position in der SkillModul 2 von 11 · Thema 19 von 20
2.19 Kerzendiagramme
—Lab-Punkte— / 100XP gesamt—Serie—

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']
Bilder lassen sich zurücklesenEin Diagramm sind auch Daten: 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öhe abs(close - open); ein Körper von 0 ist ein Doji.
  • Zeichnen Sie alle Dochte mit einem ax.vlines-Aufruf und alle Körper mit einem ax.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_colors jede Kerze nach ihrer Richtung einfärben25 Pkt.
  • Mit candle_body den Körper jeder Kerze messen25 Pkt.
  • Mit doji_days die unentschlossenen Tage finden25 Pkt.
  • Mit draw_candles die Kerzen auf eine Axes zeichnen25 Pkt.
Explorer · lab-52-1
▾ lab-52-1
…
bash · im Browser
learner@quantcraft:~/lab-52-1$
Python noch nicht geladenPythonLn 1, Col 1Spaces: 4UTF-8

Dieses Thema zurücksetzen?

Alles in lab-52-1 wird auf die Startdateien zurückgesetzt und das Terminal geleert. Ihre aktuelle Lösung geht verloren – das lässt sich nicht rückgängig machen.

Wird zurückgesetzt
  • main.py → Startcode
  • Terminal-Verlauf und Testausgabe
  • Nicht eingereichte Änderungen
Bleibt erhalten
  • Beste Lab-Punktzahl
  • Ihre XP und Ihre Serie
  • Vorlesungsfortschritt und Notizen

Melde dich an, um deinen Code auszuführen.

Alle Lektionen kannst du kostenlos lesen. Erstelle ein Konto oder melde dich an, um Code auszuführen, Tests zu starten und dieses Lab abzugeben.

  • IDE im Browser mit Bash-Terminal — nichts zu installieren
  • Sofortige Bewertung, XP und dein Platz auf der Skill
Konto erstellenAnmelden
ODER
Weiter mit GitHub