σμ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.5·~40 Min.Einsteiger

pandas-Series

Position in der SkillModul 2 von 11 · Thema 5 von 20
2.5 pandas-Series
—Lab-Punkte— / 100XP gesamt—Serie—

Ein Array mit Labels

Eine pandas-Series ist ein eindimensionales Array, in dem jeder Wert ein Label trägt, das im Index der Series steht. Statt sich zu merken, dass Position 1 Microsoft ist, fragen Sie prices["MSFT"] ab. Eine Series hat einen name, einen dtype wie ein NumPy-Array und unterstützt dieselbe Arithmetik auf ganzen Arrays, prices * 2, prices.mean() und prices > 180 funktionieren also. Importiert wird pandas üblicherweise als import pandas as pd; es baut auf NumPy auf, das Sie in den vorigen Themen kennengelernt haben.

import pandas as pd

prices = pd.Series([184.25, 410.2, 171.0], index=["AAPL", "MSFT", "GOOG"], name="price")
print(prices)
# AAPL    184.25
# MSFT    410.20
# GOOG    171.00
# Name: price, dtype: float64

print(prices["AAPL"], prices.iloc[1])    # 184.25 410.2   by label, by position
print(prices.index.tolist())             # ['AAPL', 'MSFT', 'GOOG']
print(prices[prices > 180])              # keeps AAPL and MSFT, labels intact
print(prices.mean(), prices.idxmax())    # 255.15 MSFT

# A dict also builds a Series: keys become the index
print(pd.Series({"AAPL": 1, "MSFT": 2}))

Ausrichtung: Operationen gleichen Labels ab, nicht Positionen

Beim Kombinieren zweier Series richtet pandas sie zuerst nach Labels aus. Labels, die nur in einer vorkommen, ergeben im Ergebnis NaN (not a number, die Markierung für fehlende Werte), und der Index des Ergebnisses ist die Vereinigung beider Indizes. Genau das braucht man für Positionen auf verschiedenen Konten. Mit a.add(b, fill_value=0) wird ein fehlendes Label wie null behandelt, statt NaN zu erzeugen. Auch das Lesen per Label unterscheidet sich von NumPy: s["MSFT"] ist per Label, s.iloc[1] per Position, und ein nicht vorhandenes Label löst KeyError aus.

import pandas as pd

a = pd.Series([100, 200], index=["AAPL", "MSFT"])
b = pd.Series([50, 10], index=["MSFT", "GOOG"])

print(a + b)
# AAPL      NaN
# GOOG      NaN
# MSFT    250.0

print(a.add(b, fill_value=0))
# AAPL    100.0
# GOOG     10.0
# MSFT    250.0

# Selecting by a list of labels, and asking for one that is missing
prices = pd.Series([184.25, 410.2], index=["AAPL", "MSFT"])
print(prices.reindex(["MSFT", "TSLA"]).tolist())   # [410.2, nan]

Sortieren, Ranking und Umbasieren

s.sort_values(ascending=False) sortiert nach Wert und nimmt die Labels mit, s.sort_index() sortiert nach Label, und s.abs() bildet Beträge. Sortieren plus Slicing findet die größten Bewegungen: r.abs().sort_values(ascending=False).index[:3] liefert die drei Labels mit der größten absoluten Rendite. Um Werte auf unterschiedlichen Preisniveaus zu vergleichen, basieren Sie jeden auf 100 am Anfang: s / s.iloc[0] * 100, was Index und Namen behält. Fehlende Werte (NaN) überspringen sum, mean und Co.; s.isna() markiert sie.

import pandas as pd

r = pd.Series([0.01, -0.03, 0.02], index=["x", "y", "z"])
print(r.abs().sort_values(ascending=False))
# y    0.03
# z    0.02
# x    0.01
# dtype: float64

prices = pd.Series([184.25, 410.2, 171.0], index=["AAPL", "MSFT", "GOOG"], name="price")
print(prices / prices.iloc[0] * 100)           # rebased to 100 at the first value
# AAPL    100.000000
# MSFT    222.632293
# GOOG     92.808684
# Name: price, dtype: float64

gappy = pd.Series([1.0, None, 3.0])
print(gappy.sum(), gappy.mean(), gappy.isna().tolist())   # 4.0 2.0 [False, True, False]
import pandas as pd

# A stray space and a lower-case letter make "the same" symbol two labels
raw = pd.Series([1, 2], index=["AAPL", "aapl "])
print(raw.index.is_unique)                     # True: they look different

raw.index = raw.index.str.strip().str.upper()  # clean the labels
print(raw.index.is_unique)                     # False: now both are "AAPL"
print(raw["AAPL"].tolist())                    # [1, 2]   a duplicate label returns a Series

merged = raw.groupby(level=0).sum()            # combine duplicates (groupby comes soon)
print(merged.to_dict())                        # {'AAPL': 3}
Labels sind auch Daten: Duplikate und TippfehlerDie Ausrichtung ist nur so gut wie die Labels. "AAPL" und "aapl " sind verschiedene Labels, ein Tippfehler erzeugt also stillschweigend NaN-Zeilen; bereinigen Sie Labels (strip, upper) vor dem Kombinieren. Ein Index kann Duplikate enthalten, dann liefert s["AAPL"] eine Series statt eines Werts; prüfen Sie s.index.is_unique bei Daten mit einem Wert pro Label. Operationen liefern neue Series und lassen das Original unberührt, das Verhalten, das die Lab-Tests prüfen.
  • pd.Series(values, index=labels, name=...); per Label s["A"] oder Position s.iloc[0] lesen.
  • Operationen richten sich nach Labels aus (Vereinigungsindex, NaN bei Fehlen); a.add(b, fill_value=0) behandelt eine Lücke als 0.
  • sort_values, abs, idxmax, s / s.iloc[0] * 100; Ergebnisse sind neue Series, das Original bleibt unverändert.

Als Nächstes: pandas-DataFrames, Tabellen aus Series, die sich einen Index teilen.

Lab: Was bewertet wird

  • Mit price_series Preise nach Symbol beschriften25 Pkt.
  • Mit total_exposure zwei Konten nach Label addieren25 Pkt.
  • Mit top_movers die größten Bewegungen finden25 Pkt.
  • Mit rebase_to_100 jeden Preis auf Basis 100 setzen25 Pkt.
Explorer · lab-38-1
▾ lab-38-1
…
bash · im Browser
learner@quantcraft:~/lab-38-1$
Python noch nicht geladenPythonLn 1, Col 1Spaces: 4UTF-8

Dieses Thema zurücksetzen?

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