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

Resampling

Position in der SkillModul 2 von 11 · Thema 13 von 20
2.13 Resampling
—Lab-Punkte— / 100XP gesamt—Serie—

Die Frequenz ändern

Daten kommen selten in der Frequenz, die man braucht. Ticks treffen im Millisekundentakt ein, ein Modell will Tagesbalken, ein Bericht Monate. Resampling gruppiert eine Zeitreihe in neue Perioden um. Von fein zu grob (Tage zu Monaten) heißt Downsampling: Jede neue Periode enthält mehrere alte Beobachtungen, daher muss man sagen, wie sie zusammengefasst werden. Von grob zu fein (Wochen zu Tagen) heißt Upsampling: Es gibt neue Perioden ohne Daten, daher muss man sagen, was dort steht.

import pandas as pd

daily = pd.Series(
    [100.0, 101, 103, 102, 104, 105, 103, 106],
    index=pd.bdate_range("2026-02-25", periods=8),    # Wed 25 Feb ... Fri 6 Mar
    name="close",
)

print(daily.resample("ME").last())     # the last price of each month ("ME" = month end)
# 2026-02-28    103.0
# 2026-03-31    106.0
# Freq: ME, Name: close, dtype: float64

print(daily.resample("W-FRI").last())  # the last price of each week, weeks ending on Friday
# 2026-02-27    103.0
# 2026-03-06    106.0
# Freq: W-FRI, Name: close, dtype: float64

Die Aggregation wählen

series.resample("ME") allein tut nichts: Es beschreibt nur die Perioden. Die folgende Aggregation bestimmt den Wert und muss zur Bedeutung der Daten passen. Ein Preis ist eine Momentaufnahme, ein Monat wird also durch seinen last-Wert (oder first) vertreten. Ein Volumen ist eine gehandelte Menge, ein Monat ist also die sum. Eine Spanne nutzt max und min. Die Labels folgen der Regel: "ME" beschriftet einen Monat mit seinem letzten Kalendertag, auch wenn das ein Samstag ist, und "W-FRI" eine Woche mit ihrem Freitag.

volume = pd.Series([10, 20, 30, 40, 50, 60, 70, 80], index=daily.index)

print(volume.resample("ME").sum().to_dict())
# {Timestamp('2026-02-28 00:00:00'): 60, Timestamp('2026-03-31 00:00:00'): 300}

# Several summaries at once
print(daily.resample("ME").agg(["first", "last", "max"]))
#             first   last    max
# 2026-02-28  100.0  103.0  103.0
# 2026-03-31  102.0  106.0  106.0

Balken aus Ticks und Upsampling

Diagramme und Modelle verwenden OHLC-Balken: Eröffnung (erster Preis), Hoch, Tief und Schluss (letzter Preis) jeder Periode. resample("D").ohlc() baut sie in einem Aufruf aus Intraday-Preisen. Kalendertage ganz ohne Handel, etwa Wochenenden, erscheinen trotzdem als NaN-Zeilen; schließen Sie daher mit dropna() ab, wenn Sie nur Handelstage wollen. Upsampling geht in die andere Richtung: resample("D").ffill() wiederholt an Tagen ohne Daten den letzten bekannten Wert, was ein wöchentlich notierter Preis wirklich bedeutet. Verwenden Sie bei Preisen nie bfill: Es kopiert einen zukünftigen Wert rückwärts und lässt die Information von morgen in das Heute sickern.

times = ["2026-03-05 09:30", "2026-03-05 11:00", "2026-03-05 15:59",
         "2026-03-09 09:30", "2026-03-09 12:00", "2026-03-09 15:59"]
ticks = pd.Series([100.0, 101.5, 99.8, 100.7, 102.0, 101.0], index=pd.to_datetime(times))

bars = ticks.resample("D").ohlc()
print(bars)
#              open   high    low  close
# 2026-03-05  100.0  101.5   99.8   99.8
# 2026-03-06    NaN    NaN    NaN    NaN
# 2026-03-07    NaN    NaN    NaN    NaN
# 2026-03-08    NaN    NaN    NaN    NaN
# 2026-03-09  100.7  102.0  100.7  101.0

print(bars.dropna().index.strftime("%d %b").tolist())   # ['05 Mar', '09 Mar']   only the days that traded
# Upsampling: observations on the 2nd, 6th and 10th, spread over every day with ffill
weekly = pd.Series([100.0, 103.0, 101.0], index=pd.to_datetime(["2026-03-02", "2026-03-06", "2026-03-10"]))

print(weekly.resample("D").ffill().tolist())
# [100.0, 100.0, 100.0, 100.0, 103.0, 103.0, 103.0, 103.0, 101.0]

print(int(weekly.resample("D").mean().isna().sum()))   # 6   without a fill rule the new days are empty
Resampling kann die Zukunft durchsickern lassenEin Monatsbalken ist erst am Monatsende bekannt. Ordnen Sie den Schlusskurs des Monatsendes dem ersten Tag des Monats zu, scheint eine Strategie die Zukunft zu kennen. Behalten Sie das Label am Periodenende, wie es "ME" tut, nutzen Sie beim Upsampling ffill (nie bfill) und verschieben Sie ein Monatssignal nach vorn, bevor Sie es auf Tagesdaten anwenden.
  • series.resample(regel) beschreibt die Perioden ("D", "W-FRI", "ME", "h"); die folgende Aggregation berechnet die Werte.
  • Preise: last oder ohlc(); Volumen: sum; leere Perioden erscheinen als NaN, die dropna() entfernt.
  • Upsampling braucht eine Füllregel: ffill() wiederholt den letzten bekannten Wert; bei Preisen nie bfill(), es lässt die Zukunft durchsickern.

Als Nächstes: gleitende Fenster, Statistiken wie gleitende Durchschnitte über ein verschiebbares Fenster der jüngsten Perioden.

Lab: Was bewertet wird

  • Mit month_end_close den letzten Preis jedes Monats nehmen25 Pkt.
  • Mit weekly_volume das Volumen jeder Woche summieren25 Pkt.
  • Mit daily_ohlc aus Intraday-Preisen Tagesbalken bilden25 Pkt.
  • Mit fill_to_daily unregelmäßige Beobachtungen auf jeden Tag verteilen25 Pkt.
Explorer · lab-46-1
▾ lab-46-1
…
bash · im Browser
learner@quantcraft:~/lab-46-1$
Python noch nicht geladenPythonLn 1, Col 1Spaces: 4UTF-8

Dieses Thema zurücksetzen?

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