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

المتغيرات العشوائية والتوقع

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

رقم لم تُعرف قيمته بعد

المتغير العشوائي كمية تعتمد قيمتها على الصدفة: رمية نرد أو عائد الغد أو سعر سهم عند الاستحقاق. ويأخذ المتغير العشوائي المتقطع قائمة قيم ممكنة لكل منها احتمال. وتشكل القيم والاحتمالات معًا توزيعه. والاحتمالات لا تكون سالبة أبدًا ومجموعها 1. وفي بايثون هما قائمتان بالطول نفسه values وprobs. والنرد العادل هو values = [1, 2, 3, 4, 5, 6] مع probs = [1/6] * 6.

import math

values = [1, 2, 3, 4, 5, 6]
probs = [1 / 6] * 6

# A valid distribution: no negatives, and the probabilities add up to 1
print(all(p >= 0 for p in probs))             # True
print(math.isclose(sum(probs), 1.0))          # True (compare floats with isclose)

# A stock tomorrow: down 5%, up 2% or up 8%
returns = [-0.05, 0.02, 0.08]
chances = [0.2, 0.5, 0.3]
print(math.isclose(sum(chances), 1.0))        # True

التوقّع: المتوسط الموزون بالاحتمالات

القيمة المتوقعة E[X] هي المتوسط الذي تحصل عليه بعد تكرارات كثيرة: اضرب كل قيمة في احتمالها ثم اجمع sum(v * p). للنرد E[X] = 3.5 وهو رقم لا يظهر أبدًا، ولا بأس: فهو متوسط طويل الأمد لا تنبؤ بنتيجة بعينها. والتوقّع خطي: E[a*X + b] = a*E[X] + b. وتوقّع دالة E[g(X)] يطبّق g على كل قيمة أولًا: sum(g(v) * p). انتبه: في العموم E[g(X)] ليس g(E[X]). وعائد الخيار max(S - K, 0) هو الحالة الكلاسيكية.

def expected_value(values, probs):
    return sum(v * p for v, p in zip(values, probs))

die = [1, 2, 3, 4, 5, 6]
fair = [1 / 6] * 6
print(round(expected_value(die, fair), 4))            # 3.5

# E[g(X)]: apply g to each value first. Call payoff with strike 100:
prices = [90, 100, 110, 120]
chances = [0.1, 0.4, 0.3, 0.2]
mean_price = expected_value(prices, chances)
print(mean_price)                                      # 106.0
print(expected_value([max(s - 100, 0) for s in prices], chances))  # 7.0  = E[max(S - K, 0)]
print(max(mean_price - 100, 0))                        # 6.0  = max(E[S] - K, 0), not the same

التباين: ما مدى تشتّتها؟

قد يكون لاستثمارين العائد المتوقع نفسه ومخاطر مختلفة جدًا. يقيس التباين التشتت حول المتوسط: Var(X) = E[(X - mu)^2] ويمكن حسابه أيضًا بـE[X^2] - E[X]^2. والانحراف المعياري جذره التربيعي وبوحدات X نفسها؛ وهو للعوائد التقلّب. وللنرد Var = 35/12 = 2.9167. وكلاهما يُبنى من توقعات دوال في X، فتعطيك دالة expected_of(g, values, probs) مكتوبة جيدًا المتوسط والعزم الثاني وكل ما يليه.

def expected_value(values, probs):
    return sum(v * p for v, p in zip(values, probs))

def expected_of(g, values, probs):
    return expected_value([g(v) for v in values], probs)

def variance(values, probs):
    mean = expected_of(lambda v: v, values, probs)
    return expected_of(lambda v: v * v, values, probs) - mean ** 2

die, fair = [1, 2, 3, 4, 5, 6], [1 / 6] * 6
print(round(variance(die, fair), 4))                   # 2.9167

returns, chances = [-0.05, 0.02, 0.08], [0.2, 0.5, 0.3]
print(round(expected_value(returns, chances), 4))      # 0.024
print(round(variance(returns, chances), 6))            # 0.002044

المحاكاة وقانون الأعداد الكبيرة

يمكنك أيضًا تقدير توقّع بسحب عيّنات. تُرجع rng.choices(values, weights=probs, k=n) عدد n من السحوبات، ويقترب متوسطها من E[X] كلما كبر n: وهذا قانون الأعداد الكبيرة. وهو لبّ التسعير بمونتي كارلو. استخدم random.Random(seed) الخاص بك ليكون التشغيل قابلًا للتكرار ولا يربك كودًا آخر. ومع سحوب قليلة يكون المتوسط مشوّشًا؛ والخطأ يتناقص فقط كمقلوب الجذر التربيعي لـn، فمئة ضعف السحوب تمنح عشرة أضعاف الدقة فقط.

import random

die, fair = [1, 2, 3, 4, 5, 6], [1 / 6] * 6

def sample_mean(values, probs, n, seed):
    rng = random.Random(seed)                    # private, repeatable generator
    draws = rng.choices(values, weights=probs, k=n)
    return sum(draws) / n

for n in (10, 1000, 100000):
    print(n, round(sample_mean(die, fair, n, 1), 4))
# 10 3.1
# 1000 3.598
# 100000 3.5017       (closing in on 3.5)

print(sample_mean(die, fair, 1000, 1) == sample_mean(die, fair, 1000, 1))  # True: same seed, same answer
تحقق من التوزيع قبل استخدامهالتوزيع الذي لا يساوي مجموع احتمالاته 1 أو يحوي عددًا سالبًا أو لا يطابق طول القيم يعطي توقّعًا بلا معنى ودون أي خطأ. تحقق أولًا: أطوال متساوية وبلا سالب وmath.isclose(sum(probs), 1.0). وارفع ValueError في ما عدا ذلك. وتذكّر أيضًا أن التوقّع متوسط طويل الأمد: فاستراتيجية ذات توقّع موجب قد تخسر مالًا في أي يوم بعينه.
  • التوزيع هو values مع probs (بلا سالب ومجموعها 1)؛ وE[X] = sum(v * p).
  • E[g(X)] = sum(g(v) * p) وهو ليس g(E[X])؛ وVar = E[X^2] - E[X]^2.
  • متوسطات العيّنات تتقارب من E[X] (قانون الأعداد الكبيرة)؛ واستخدم random.Random(seed) الخاص بك.

التالي: مصفوفات NumPy وأنواع البيانات dtypes، المصفوفات السريعة المُنمَّطة التي يُبنى عليها بقية المقرر.

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

  • احسب متوسط النتائج موزونًا باحتمالاتها باستخدام expected_value25 نقطة
  • احسب توقّع عائد باستخدام expected_of25 نقطة
  • قِس التشتت باستخدام variance25 نقطة
  • قدّر التوقّع بالمحاكاة باستخدام sample_mean25 نقطة
المستكشف · lab-33-1
▾ lab-33-1
…
bash · داخل المتصفح
learner@quantcraft:~/lab-33-1$
لم يتم تحميل Python بعدPythonLn 1, Col 1Spaces: 4UTF-8

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

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

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

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

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

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