σμ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 1 · Python-Grundlagen für Quants›Thema 1.26·~45 Min.Einsteiger

Klassen und Objekte

Position in der SkillModul 1 von 11 · Thema 26 von 33
1.26 Klassen und Objekte
—Lab-Punkte— / 100XP gesamt—Serie—

Daten und Verhalten zusammen

Bisher konnte eine Position ein Tupel oder ein Dictionary sein, mit getrennten Funktionen darauf. Eine Klasse bündelt die Daten und die zugehörigen Funktionen zu einem neuen Typ. class Position: definiert den Bauplan; ihr Aufruf, Position("AAPL", 100, 180.0), erzeugt aus diesem Plan ein Objekt (auch Instanz genannt). Jedes Objekt hält seine eigenen Daten, und die in der Klasse definierten Funktionen, Methoden genannt, arbeiten auf diesem Objekt.

class Position:
    def __init__(self, symbol, quantity=0):
        self.symbol = symbol          # attributes belong to this object
        self.quantity = quantity

    def describe(self):
        return f"{self.quantity} x {self.symbol}"

apple = Position("AAPL", 100)
tesla = Position("TSLA")

print(apple.describe())   # 100 x AAPL
print(tesla.describe())   # 0 x TSLA
print(apple.quantity, tesla.quantity)  # 100 0

__init__ und self

__init__ ist der Konstruktor: Python führt ihn beim Erzeugen eines Objekts automatisch aus, und er speichert die Startwerte. Jede Methode erhält das Objekt selbst als ersten Parameter, üblicherweise self genannt; Sie übergeben ihn nicht, Python tut es (apple.describe() ruft Position.describe(apple) auf). Alles, was mit self.name = wert gespeichert wird, ist ein Attribut dieses Objekts und bleibt zwischen Methodenaufrufen erhalten. __init__ richtet alles ein und gibt nichts zurück.

class Account:
    def __init__(self, cash):
        self.cash = cash

    def deposit(self, amount):
        self.cash += amount          # changes this object's attribute
        return self.cash

first = Account(1000)
second = Account(50)

first.deposit(500)
print(first.cash, second.cash)       # 1500 50  (separate objects, separate data)

same = first                          # a second name for the same object
same.deposit(1)
print(first.cash)                     # 1501

Methoden, die den Zustand ändern oder Fragen beantworten

Manche Methoden beantworten eine Frage über das Objekt, ohne es zu ändern (market_value(price)); sie sollen nur ein Ergebnis zurückgeben und die Attribute in Ruhe lassen. Andere verändern das Objekt (apply_fill), aktualisieren Attribute und geben oft etwas Nützliches zurück, etwa den realisierten Gewinn. Eine Methode kann mit self.andere_methode(...) eine andere aufrufen, was die Regeln an einer Stelle hält: Braucht unrealized_pnl den Marktwert, fragt sie self.market_value(price), statt die Formel zu wiederholen.

class Position:
    def __init__(self, symbol, quantity=0, avg_price=0.0):
        self.symbol = symbol
        self.quantity = quantity
        self.avg_price = avg_price

    def market_value(self, price):
        return self.quantity * price

    def unrealized_pnl(self, price):
        return self.market_value(price) - self.quantity * self.avg_price

pos = Position("AAPL", 100, 180.0)
print(pos.market_value(185.0))       # 18500.0
print(pos.unrealized_pnl(185.0))     # 500.0

Fallen und wann eine Klasse sinnvoll ist

self. zu vergessen ist der klassische Ausrutscher: quantity = 5 in einer Methode erzeugt eine wegwerfbare lokale Variable, kein Attribut. Verwenden Sie CapWords für Klassennamen (Position) und Kleinbuchstaben mit Unterstrichen für Attribute und Methoden; ein führender Unterstrich (_cache) markiert etwas als intern. Nutzen Sie nie einen veränderlichen Standardwert wie def __init__(self, fills=[]): Alle Objekte würden diese eine Liste teilen; nehmen Sie fills=None und erzeugen Sie [] im Inneren. Legen Sie eine Klasse an, wenn Daten und die Regeln dazu zusammengehören; eine einfache Funktion oder ein Dictionary ist oft einfacher.

class Wrong:
    def __init__(self, quantity):
        quantity = quantity          # forgot self.: nothing is stored

class Shared:
    def __init__(self, fills=[]):    # one list shared by every object
        self.fills = fills

class Right:
    def __init__(self, fills=None):
        self.fills = [] if fills is None else list(fills)

a, b = Shared(), Shared()
a.fills.append(100)
print(b.fills)                        # [100]  (surprise!)

c, d = Right(), Right()
c.fills.append(100)
print(d.fills)                        # []

print(hasattr(Wrong(5), "quantity"))  # False
Prüfen Sie, dass jedes Objekt seinen eigenen Zustand hatEine gute Gewohnheit beim Schreiben einer Klasse: zwei Objekte anlegen, eines ändern und das andere ausgeben. Hat sich auch das zweite geändert, wird etwas geteilt, das nicht geteilt werden sollte. Die Lab-Tests tun genau das und prüfen außerdem, dass eine Methode, die nur eine Frage beantworten soll, die Attribute unverändert lässt.
  • class Name: definiert einen Typ; Name(args) erzeugt ein Objekt und führt __init__ aus.
  • self.attr = wert speichert Daten im Objekt; jede Methode nimmt zuerst self.
  • Abfragemethoden geben Antworten zurück; Änderungsmethoden ändern Attribute; vermeiden Sie veränderliche Standardwerte.

Als Nächstes: spezielle Methoden wie __repr__ und __eq__, mit denen Ihre Objekte schön ausgegeben und erwartungsgemäß verglichen werden.

Lab: Was bewertet wird

  • Mit __init__ eine Position aufbauen25 Pkt.
  • Mit market_value die Position bewerten25 Pkt.
  • Mit unrealized_pnl den Buchgewinn messen25 Pkt.
  • Mit apply_fill die Position nach einem Trade aktualisieren25 Pkt.
Explorer · lab-26-1
▾ lab-26-1
…
bash · im Browser
learner@quantcraft:~/lab-26-1$
Python noch nicht geladenPythonLn 1, Col 1Spaces: 4UTF-8

Dieses Thema zurücksetzen?

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