σμ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.9·~40 دمبتدئ

وسائط الدوال وقيمها الافتراضية

الموضع في المسارالوحدة 1 من 11 · الموضوع 9 من 33
1.9 وسائط الدوال وقيمها الافتراضية
—درجة المختبر— / 100إجمالي XP—التتابع—

بالموضع أو بالاسم

يمكن تمرير الوسائط بالموضع (تُطابق المعاملات بالترتيب) أو بالاسم (quantity=200). تجعل الأسماء الاستدعاء مقروءًا عندما يكون للدالة عدة مدخلات من النوع نفسه، وتتيح تمرير الوسائط بأي ترتيب. يجب أن تأتي الوسائط الموضعية أولًا؛ وبعد أن تستخدم اسمًا يجب أن تكون البقية مسمّاة أيضًا.

def pnl(entry, exit_price, quantity):
    return (exit_price - entry) * quantity

print(pnl(184.0, 185.5, 200))                            # 300.0
print(pnl(quantity=200, entry=184.0, exit_price=185.5))  # 300.0

القيم الافتراضية تجعل المعاملات اختيارية

اكتب name=value في سطر def فيستطيع المستدعي حذف هذه الوسيطة وتُستخدم القيمة الافتراضية. تأتي المعاملات ذات القيم الافتراضية بعد التي بلا قيم. تناسب القيم الافتراضية الإعدادات المتشابهة غالبًا مثل نسبة عمولة أو حد أدنى، ويمكن استبدال أي منها بالاسم.

# Parameters with a default are optional
def fee(notional, rate=0.001, minimum=1.0):
    return max(minimum, notional * rate)

print(fee(36850.0))                # 36.85
print(fee(36850.0, rate=0.0005))   # 18.425
print(fee(100.0, minimum=0.5))     # 0.5

أي عدد من الوسائط: *args

يجمع المعامل المكتوب *prices كل الوسائط الموضعية الإضافية في صف (tuple)، فتعمل average(1, 2, 3) وaverage(1, 2, 3, 4, 5) كلتاهما. والعكس يحدث عند الاستدعاء: average(*quotes) تفكّ قائمة إلى وسائط منفصلة.

# *prices collects the extra arguments into a tuple
def average(*prices):
    return sum(prices) / len(prices)

print(average(184.0, 185.0, 186.0))  # 185.0
quotes = [184.0, 185.0]
print(average(*quotes))              # 184.5

أي خيارات مسمّاة: **options

وبالطريقة نفسها يجمع **options الوسائط المسمّاة الإضافية في قاموس من الأسماء والقيم (سيكون للقواميس موضوعها الخاص قريبًا). وهو يناسب الدوال التي تقبل إضافات اختيارية مثل إعدادات أمر. تعطي sorted(options) الأسماء بترتيب أبجدي فيصبح الناتج متوقعًا.

# **options collects extra named arguments into a dictionary
def describe(symbol, **options):
    text = symbol
    for name in sorted(options):
        text += f" {name}={options[name]}"
    return text

print(describe("AAPL", tif="day", limit=184.5))  # AAPL limit=184.5 tif=day

فخ القيمة الافتراضية القابلة للتعديل

تُنشأ القيمة الافتراضية مرة واحدة عند تعريف الدالة لا عند كل استدعاء. ومع عدد أو نص لا ضرر في ذلك. أما مع قائمة فإن كل استدعاء يستخدم القيمة الافتراضية يتشارك القائمة نفسها ويغيّرها. الحل المعتاد أن تكون القيمة الافتراضية None وتُنشأ قائمة جديدة داخل الدالة.

# A default list is created once and shared by every call
def add_fill(fill, fills=[]):
    fills.append(fill)
    return fills

print(add_fill(100))  # [100]
print(add_fill(200))  # [100, 200]   <- surprise: the same list

# The fix: default to None and build a new list inside
def add_fill_fixed(fill, fills=None):
    if fills is None:
        fills = []
    fills.append(fill)
    return fills

print(add_fill_fixed(100))  # [100]
print(add_fill_fixed(200))  # [200]
أبقِ الاستدعاء والتعريف متناسقينمنح معامل قيمة افتراضية يغيّر معنى الاستدعاء المختصر، لذا اختر قيمًا يسرّك أن تُطبَّق بصمت. وإذا كان لا بد أن يختار المستدعي القيمة، فاتركها بلا قيمة افتراضية: ستبلغ Python حينها عن الوسيطة الناقصة بدل التخمين.
  • استخدم الأسماء في الاستدعاءات ذات المدخلات المتعددة من النوع نفسه.
  • قيم افتراضية للإعدادات المتشابهة غالبًا؛ وليس قائمة أو قاموسًا أبدًا.
  • *args لأي عدد من القيم، و**options للإضافات المسمّاة.

التالي: النطاق والإغلاقات لنرى الأسماء التي تراها الدالة وكيف تتذكر القيم.

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

  • اجعل الكمية والاتجاه اختياريين باستخدام position_pnl25 نقطة
  • اقبل أي عدد من الأسعار باستخدام average25 نقطة
  • اقبل خيارات الأمر المسمّاة باستخدام describe_order25 نقطة
  • تجنّب فخ القائمة المشتركة باستخدام add_fill25 نقطة
المستكشف · lab-9-1
▾ lab-9-1
…
bash · داخل المتصفح
learner@quantcraft:~/lab-9-1$
لم يتم تحميل Python بعدPythonLn 1, Col 1Spaces: 4UTF-8

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

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

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

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

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

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