σμ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 Academyالمسارات
Ctrl K
AO
+1.2k متعلّم
تسجيل الدخولانضم ↗
المسارات
AO
+1.2k متعلّم
تسجيل الدخول
  • English
  • Français
  • Español
  • العربية
  • Português
  • Deutsch
  • 日本語
  • 中文
مسار Python›الوحدة 1 · أساسيات Python للمحللين الكميين›الموضوع 1.26·~45 دمبتدئ

الأصناف والكائنات

الموضع في المسارالوحدة 1 من 11 · الموضوع 26 من 33
1.26 الأصناف والكائنات
—درجة المختبر— / 100إجمالي XP—التتابع—

البيانات والسلوك معًا

حتى الآن كان المركز يمكن أن يكون صفًا أو قاموسًا مع دوال منفصلة تعمل عليه. تجمع الفئة (class) البيانات والدوال التي تخصها في نوع جديد. يعرّف class Position: المخطط؛ واستدعاؤها Position("AAPL", 100, 180.0) يبني كائنًا (يسمى أيضًا نسخة instance) من ذلك المخطط. يحمل كل كائن بياناته الخاصة، وتعمل على ذلك الكائن الدوال المعرّفة في الفئة وتسمى الدوال الأعضاء (methods).

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__ و self

__init__ هو الدالة البانية (constructor): تشغّلها بايثون تلقائيًا عند إنشاء كائن وتحفظ القيم الابتدائية. تتلقى كل دالة عضو الكائن نفسه معاملًا أول يسمى عُرفًا self؛ ولا تمرّره أنت بل بايثون (apple.describe() تستدعي Position.describe(apple)). وكل ما يُحفظ بـself.name = value هو خاصية (attribute) لذلك الكائن وتبقى بين استدعاءات الدوال. و__init__ تُهيّئ الأمور ولا تُرجع شيئًا.

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

دوال تغيّر الحالة أو تجيب عن أسئلة

بعض الدوال الأعضاء تجيب عن سؤال حول الكائن دون تغييره (market_value(price))؛ وينبغي أن تُرجع نتيجة فقط وتترك الخصائص كما هي. وبعضها يغيّر الكائن (apply_fill) فيحدّث الخصائص وكثيرًا ما يُرجع شيئًا مفيدًا كالربح المحقَّق. ويمكن لدالة أن تستدعي أخرى بـself.other_method(...) مما يبقي القواعد في مكان واحد: فإذا احتاجت unrealized_pnl إلى القيمة السوقية سألت self.market_value(price) بدل تكرار الصيغة.

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

مزالق ومتى تستخدم فئة

نسيان self. هو الزلة الكلاسيكية: فـquantity = 5 داخل دالة تنشئ متغيرًا محليًا زائلًا لا خاصية. استخدم CapWords لأسماء الفئات (Position) والحروف الصغيرة مع الشرطات السفلية للخصائص والدوال؛ والشرطة السفلية في البداية (_cache) تعني أن الشيء داخلي. ولا تستخدم أبدًا قيمة افتراضية قابلة للتعديل مثل def __init__(self, fills=[]): ستتشارك كل الكائنات تلك القائمة الوحيدة؛ استخدم fills=None وأنشئ [] في الداخل. أنشئ فئة حين تسير البيانات وقواعدها معًا؛ والدالة العادية أو القاموس أبسط في الغالب.

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
تأكد أن كل كائن يحتفظ بحالته الخاصةعادة جيدة عند كتابة فئة: أنشئ كائنين وغيّر أحدهما واطبع الآخر. فإن تغيّر الثاني أيضًا فهناك شيء مشترك لا ينبغي أن يكون كذلك. وتفعل اختبارات المختبر ذلك بالضبط، وتتحقق أيضًا من أن دالة يفترض أن تجيب عن سؤال فقط تترك الخصائص دون تغيير.
  • class Name: تعرّف نوعًا؛ وName(args) تبني كائنًا وتشغّل __init__.
  • self.attr = value يخزّن بيانات في الكائن؛ وكل دالة عضو تأخذ self أولًا.
  • دوال الاستعلام تُرجع إجابات؛ ودوال التحديث تغيّر الخصائص؛ وتجنّب القيم الافتراضية القابلة للتعديل.

التالي: الدوال الخاصة مثل __repr__ و__eq__، التي تجعل كائناتك تُطبع بشكل جيد وتُقارن كما تتوقع.

المختبر: ما الذي يُقيَّم

  • ابنِ مركزًا باستخدام __init__25 نقطة
  • قيّم المركز باستخدام market_value25 نقطة
  • قِس الربح غير المحقق باستخدام unrealized_pnl25 نقطة
  • حدّث المركز بعد صفقة باستخدام apply_fill25 نقطة
المستكشف · lab-26-1
▾ lab-26-1
…
bash · داخل المتصفح
learner@quantcraft:~/lab-26-1$
لم يتم تحميل Python بعدPythonLn 1, Col 1Spaces: 4UTF-8

هل تريد إعادة ضبط هذا الموضوع؟

سيعود كل ما في lab-26-1 إلى الملفات الابتدائية وستُمسح الطرفية. ستفقد حلّك الحالي ولا يمكن التراجع عن ذلك.

سيُعاد ضبطه
  • main.py ← الشيفرة الابتدائية
  • سجل الطرفية ومخرجات الاختبارات
  • التغييرات غير المُرسلة
سيُحتفظ به
  • أفضل درجة في المختبر
  • نقاط XP والتتابع
  • تقدّم المحاضرة والملاحظات

سجّل الدخول لتشغيل الكود الخاص بك.

قراءة كل المحاضرات مجانية. أنشئ حسابًا أو سجّل الدخول لتشغيل الكود وتنفيذ الاختبارات وتسليم هذا المختبر.

  • بيئة تطوير داخل المتصفح مع طرفية bash — لا حاجة لتثبيت أي شيء
  • تصحيح فوري ونقاط خبرة ومكانك في المسار
إنشاء حسابتسجيل الدخول
أو
المتابعة عبر GitHub