σμ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.12·~40 Min.Mittelstufe

DatetimeIndex und zeitbasierte Indizierung

Position in der SkillModul 2 von 11 · Thema 12 von 20
2.12 DatetimeIndex und zeitbasierte Indizierung
—Lab-Punkte— / 100XP gesamt—Serie—

Datumswerte sind keine Strings

Eine Preisreihe ist eine Zeitreihe: Wichtig ist, wann jeder Preis entstand. Aus einer Datei gelesene Daten sind einfache Strings, und ein String weiß nicht, dass der März nach dem Februar kommt oder ein Montag auf einen Sonntag folgt. Wandeln Sie sie mit pd.to_datetime um und verwenden Sie das Ergebnis als Index: Ein DatetimeIndex enthält echte Zeitstempel, die pandas sortieren, schneiden, vergleichen und zerlegen kann. Sortieren Sie ihn immer (sort_index()), damit die älteste Beobachtung zuerst kommt.

import pandas as pd

raw_dates = ["2026-03-04", "2026-03-02", "2026-03-03"]      # strings, in a messy order
closes = [102.0, 100.0, 101.0]

series = pd.Series(closes, index=pd.to_datetime(raw_dates), name="close").sort_index()
print(series)
# 2026-03-02    100.0
# 2026-03-03    101.0
# 2026-03-04    102.0
# Name: close, dtype: float64

print(isinstance(series.index, pd.DatetimeIndex))   # True

Einen Kalender erzeugen

Oft braucht man Daten, die niemand geliefert hat: ein Raster zum Vergleichen oder die Tage eines Backtests. pd.date_range(start, periods=n, freq="D") erzeugt n aufeinanderfolgende Kalendertage, und pd.bdate_range überspringt Wochenenden und liefert Geschäftstage. (Feiertage kennt es nicht.) Das Argument freq legt die Schrittweite fest: "D" ist ein Tag, "B" ein Geschäftstag, "h" eine Stunde.

# Four calendar days, then six business days (the weekend is skipped)
print(pd.date_range("2026-03-01", periods=4, freq="D").strftime("%a %d %b").tolist())
# ['Sun 01 Mar', 'Mon 02 Mar', 'Tue 03 Mar', 'Wed 04 Mar']

days = pd.bdate_range("2026-02-26", periods=6)
print(days.strftime("%a %d %b").tolist())
# ['Thu 26 Feb', 'Fri 27 Feb', 'Mon 02 Mar', 'Tue 03 Mar', 'Wed 04 Mar', 'Thu 05 Mar']

Nach Datum auswählen

Bei einem sortierten DatetimeIndex versteht .loc als Strings geschriebene Daten. Ein Teilstring wie "2026-03" wählt den ganzen Monat, "2026" das ganze Jahr und "2026-03-04" einen einzelnen Tag. Ein Slice .loc["2026-03-04":"2026-03-06"] wählt einen Bereich, und anders als bei Positions-Slices sind beide Enden eingeschlossen. Die Enden müssen in den Daten nicht vorkommen: Wochenendtage passen einfach auf nichts, was man will, wenn man „alles ab dem Ersten des Monats“ verlangt.

prices = pd.Series(
    [float(i) for i in range(20)],
    index=pd.bdate_range("2026-02-23", periods=20),   # Mon 23 Feb ... Fri 20 Mar
)

print(len(prices.loc["2026-03"]))      # 15   the business days of March in the data
print(prices.loc["2026-03-04"])        # 7.0  a single day

print(prices.loc["2026-03-04":"2026-03-06"])
# 2026-03-04    7.0
# 2026-03-05    8.0
# 2026-03-06    9.0
# Freq: B, dtype: float64

print(prices.loc["2026-03-01":"2026-03-03"].tolist())   # [5.0, 6.0]   Sunday the 1st matches nothing

Bestandteile eines Datums

Ein DatetimeIndex stellt die Bestandteile jedes Datums als Attribute bereit: year, month, day, dayofweek (Montag ist 0, Sonntag 6). Jedes ist ein Array mit einem Eintrag pro Zeile und taugt daher als Maske oder Gruppenschlüssel. So fragt man ohne Schleife „Wie viele Beobachtungen fallen auf jeden Wochentag?“ oder „Was passiert montags?“. Denken Sie daran, den Index vorher zu sortieren: Das Schneiden eines unsortierten DatetimeIndex kann überraschende Ergebnisse oder einen Fehler liefern.

# The parts of the dates, one entry per row
print(prices.index.dayofweek[:7].tolist())   # [0, 1, 2, 3, 4, 0, 1]   Monday is 0
print(prices.index.month[:7].tolist())       # [2, 2, 2, 2, 2, 3, 3]

# How many observations fall on each weekday?
print(prices.groupby(prices.index.dayofweek).size().to_dict())   # {0: 4, 1: 4, 2: 4, 3: 4, 4: 4}

# What do the Mondays look like?
print(prices[prices.index.dayofweek == 0].tolist())   # [0.0, 5.0, 10.0, 15.0]
Achtung am Ende des BereichsEin Datumsstring ohne Uhrzeit bedeutet Mitternacht. Bei Tagesdaten schließt .loc["2026-03-04":"2026-03-06"] den 6. ein, bei Intraday-Daten endet es aber um 00:00 Uhr des 6. und verliert den ganzen Tag. Prüfen Sie den letzten Zeitstempel des Ergebnisses, wenn Ihre Daten feiner als ein Tag sind.
  • pd.to_datetime(strings) erzeugt einen DatetimeIndex; sort_index() stellt das Älteste nach vorn; date_range und bdate_range bauen Kalender.
  • .loc["2026-03"] wählt einen Monat, .loc["2026-03-04":"2026-03-06"] einen Bereich mit beiden Enden.
  • index.year, index.month, index.dayofweek liefern die Bestandteile jedes Datums zum Filtern oder Gruppieren ohne Schleifen.

Als Nächstes: Resampling, das Tagespreise in Wochen-, Monats- oder feinere Balken verwandelt.

Lab: Was bewertet wird

  • Mit parse_prices eine Preisreihe mit Datum aufbauen25 Pkt.
  • Mit prices_in_month einen Monat auswählen25 Pkt.
  • Mit prices_between einen Datumsbereich auswählen25 Pkt.
  • Mit count_by_weekday die Beobachtungen pro Wochentag zählen25 Pkt.
Explorer · lab-45-1
▾ lab-45-1
…
bash · im Browser
learner@quantcraft:~/lab-45-1$
Python noch nicht geladenPythonLn 1, Col 1Spaces: 4UTF-8

Dieses Thema zurücksetzen?

Alles in lab-45-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