σμ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›الوحدة 2 · NumPy وpandas لبيانات السوق›الموضوع 2.4·~40 دمبتدئ

البث (Broadcasting)

الموضع في المسارالوحدة 2 من 11 · الموضوع 4 من 20
2.4 البث (Broadcasting)
—درجة المختبر— / 100إجمالي XP—التتابع—

مصفوفات مختلفة الشكل تعمل معًا

حتى الآن جمعنا مصفوفات بالشكل نفسه. البث (broadcasting) هو مجموعة القواعد التي تتيح لـNumPy الجمع بين مصفوفات مختلفة الشكل دون نسخ البيانات. وأبسط حالة هي العدد المفرد: a + 10 تضيف 10 إلى كل عنصر كأن 10 مُدّت لتأخذ شكل a. ويعمل المد نفسه بين المصفوفات: يمكن إضافة متجه من ثلاثة أرقام إلى كل صف في مصفوفة من ثلاثة أعمدة، قيمة لكل عمود. وبهذا تطرح متوسط كل عمود وتحجّم كل أصل بتقلبه وتبني جدول كل الفروق الثنائية دون حلقة واحدة.

import numpy as np

a = np.array([[1.0, 2.0, 3.0],
              [4.0, 5.0, 6.0]])       # shape (2, 3)

print(a + 10)                          # a scalar is stretched to every element
# [[11. 12. 13.]
#  [14. 15. 16.]]

per_column = np.array([1, 10, 100])    # shape (3,): one value per column
print(a * per_column)
# [[  1.  20. 300.]
#  [  4.  50. 600.]]

print(a - a.mean(axis=0))              # subtract each column's mean
# [[-1.5 -1.5 -1.5]
#  [ 1.5  1.5  1.5]]

القاعدة: قارن الأشكال من اليمين

تُحاذي NumPy الشكلين من اليمين. وفي كل موضع يجب أن يكون الحجمان متساويين أو أن يكون أحدهما 1 (فيُمدّ) أو ألا يملك أحد المصفوفتين بُعدًا هناك (يُعامل كـ1). الشكلان (2, 3) و(3,) ينجحان: 3 تقابل 3، ويُمدّ البُعد الناقص على الصفين. أما (2, 3) و(2,) فيفشلان لأن 3 تقابل 2: ترفع NumPy الخطأ ValueError: operands could not be broadcast together. ويأخذ شكل النتيجة الحجم الأكبر في كل موضع.

import numpy as np

a = np.ones((2, 3))
print((a + np.ones(3)).shape)        # (2, 3)   3 meets 3

try:
    a + np.ones(2)                   # 3 meets 2: no match
except ValueError as error:
    print(error)                     # operands could not be broadcast together with shapes (2,3) (2,)

# Size 1 stretches: (3, 1) with (1, 4) gives (3, 4)
print((np.ones((3, 1)) + np.ones((1, 4))).shape)   # (3, 4)

متجهات الأعمدة وجداول الأزواج

تتحاذى المصفوفة أحادية البُعد ذات الشكل (n,) دائمًا مع المحور الأخير، فتعمل كصف. ولتطبيق قيمة لكل صف تحتاج عمودًا شكله (n, 1): اكتب x[:, np.newaxis] أو x.reshape(-1, 1). والجمع بين عمود وصف يبني جدولًا كاملًا: x[:, None] - x[None, :] هي المصفوفة n×n لكل الفروق x[i] - x[j]، وcorr * vols[:, None] * vols[None, :] تحوّل مصفوفة ارتباط إلى مصفوفة تغاير. واحذر الخطأ المعاكس: جمع الشكلين (3,) و(3, 1) يعطي بصمت جدولًا 3×3 لا متجهًا من ثلاثة أرقام.

import numpy as np

x = np.array([1.0, 2.0, 4.0])
print(x[:, np.newaxis].shape, x.reshape(-1, 1).shape, x[None, :].shape)   # (3, 1) (3, 1) (1, 3)

# All pairwise differences x[i] - x[j]
print(x[:, None] - x[None, :])
# [[ 0. -1. -3.]
#  [ 1.  0. -2.]
#  [ 3.  2.  0.]]

# One factor per row needs a column
a = np.array([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]])
print(a * np.array([1.0, 2.0])[:, None])
# [[ 1.  2.  3.]
#  [ 8. 10. 12.]]

# Correlation matrix to covariance matrix
corr = np.array([[1.0, 0.5], [0.5, 1.0]])
vols = np.array([0.2, 0.3])
print(corr * vols[:, None] * vols[None, :])
# [[0.04 0.03]
#  [0.03 0.09]]

print((np.ones(3) + np.ones((3, 1))).shape)   # (3, 3)  a silent table, not a vector
import numpy as np

# Standardise every column at once: (x - mean) / std, column by column
a = np.array([[1.0, 10.0],
              [2.0, 20.0],
              [3.0, 30.0]])
z = (a - a.mean(axis=0)) / a.std(axis=0)   # (3, 2) - (2,) -> (3, 2), then divided by (2,)
print(z.round(3).tolist())                 # [[-1.225, -1.225], [0.0, 0.0], [1.225, 1.225]]
print(z.mean(axis=0).round(9).tolist())    # [0.0, 0.0]

# keepdims keeps the reduced axis, so the result can be broadcast back by row too
row_share = a / a.sum(axis=1, keepdims=True)
print(row_share.sum(axis=1).tolist())      # [1.0, 1.0, 1.0]
اطبع الأشكال قبل الجمعلا يشتكي البث أبدًا حين تتلاءم الأشكال مصادفةً حتى لو لم تكن النتيجة ما قصدته. قبل الجمع بين المصفوفات دوّن الأشكال والشكل المتوقع؛ وبعدها افحص result.shape. فنتيجة (n, n) حيث توقعت (n,) أو جدول بمليارات المدخلات من متجهين طويلين هي العلامة الكلاسيكية لـ[:, None] ناقص أو زائد. وتُبنى النتيجة في الذاكرة: فمتجهان من 100000 قيمة يصنعان جدولًا من 10 مليارات مدخلة.
  • تُحاذى الأشكال من اليمين: يجب أن تتساوى الأحجام أو تكون 1 (أو ناقصة)؛ وتأخذ النتيجة الأكبر.
  • (n,) يعمل كصف؛ واصنع عمودًا بـx[:, None] أو x.reshape(-1, 1).
  • عمود مع صف = جدول: x[:, None] - x[None, :]؛ افحص result.shape وعدم التطابق يفشل بـValueError.

التالي: سلاسل pandas (Series)، مصفوفات أحادية البُعد تحمل وسمًا مع كل قيمة.

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

  • اجعل كل عمود متمركزًا حول الصفر باستخدام demean_columns25 نقطة
  • أعطِ كل صف معاملَه الخاص باستخدام scale_rows25 نقطة
  • ابنِ جدول كل الفروق باستخدام pairwise_differences25 نقطة
  • حوّل الارتباطات إلى تغايرات باستخدام covariance_from_correlation25 نقطة
المستكشف · lab-37-1
▾ lab-37-1
…
bash · داخل المتصفح
learner@quantcraft:~/lab-37-1$
لم يتم تحميل Python بعدPythonLn 1, Col 1Spaces: 4UTF-8

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

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

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

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

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

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