σμ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.17·~45 دمتوسط

الإجراءات المؤسسية: تجزئة الأسهم والأرباح الموزعة

الموضع في المسارالوحدة 2 من 11 · الموضوع 17 من 20
2.17 الإجراءات المؤسسية: تجزئة الأسهم والأرباح الموزعة
—درجة المختبر— / 100إجمالي XP—التتابع—

تاريخ أسعار يكذب

عندما تقسّم شركة أسهمها 4 مقابل 1 يحصل كل مالك على أربعة أسهم لكل سهم ويهبط السعر إلى الربع. لم يخسر أحد شيئًا، لكن التاريخ الخام يُظهر يومًا بنسبة -75%. والتوزيع النقدي يفعل الشيء نفسه بحجم أصغر: في تاريخ الاستحقاق ينخفض السعر بمقدار التوزيع تقريبًا. واستراتيجية تقرأ الأسعار الخام سترى انهيارات لم تؤذِ أحدًا. والحل تعديل التاريخ: إعادة قياس كل الأيام السابقة للحدث لتصبح السلسلة متصلة وقابلة للمقارنة بأسعار اليوم.

import pandas as pd

index = pd.bdate_range("2026-03-02", periods=6)
raw = pd.Series([480.0, 484.0, 488.0, 123.0, 124.5, 126.0], index=index, name="close")   # 4-for-1 split on 5 March

print(raw.pct_change().round(4).tolist())
# [nan, 0.0083, 0.0083, -0.748, 0.0122, 0.012]    the -74.8% day never happened to anyone

تعديل التقسيم

تتغير فقط الأيام السابقة للتقسيم: اقسم أسعارها على النسبة (4 لتقسيم 4 مقابل 1). تبقى أسعار اليوم كما هي مسعّرة فتنتهي السلسلة المعدلة عند السعر الحالي الحقيقي. ابنِ قناع صح/خطأ بـ index >= split_date (نص التاريخ يصلح مع DatetimeIndex) واستخدم where الذي يُبقي القيمة حيث القناع صحيح ويأخذ البديل في غيره. ويسير الحجم في الاتجاه المعاكس: يُتداول بعد التقسيم أربعة أضعاف الأسهم، فتُضرب الأحجام السابقة في النسبة. ويستخدم التقسيم العكسي نسبة أقل من 1 والصيغ نفسها.

split_date = "2026-03-05"
adjusted = raw.where(raw.index >= split_date, raw / 4)    # the days before the split, divided by 4

print(adjusted.tolist())                      # [120.0, 121.0, 122.0, 123.0, 124.5, 126.0]
print(adjusted.pct_change().round(4).tolist())   # [nan, 0.0083, 0.0083, 0.0082, 0.0122, 0.012]   no more crash
# Volume goes the other way: older days are multiplied
volume = pd.Series([1000, 1100, 900, 4200, 4000, 4300], index=index)
print(volume.where(volume.index >= split_date, volume * 4).tolist())   # [4000, 4400, 3600, 4200, 4000, 4300]

تعديل التوزيعات

التوزيع أصغر من التقسيم، لذا يكون التعديل معاملًا قريبًا من 1: 1 - التوزيع / الإغلاق السابق، والإغلاق السابق هو آخر إغلاق قبل تاريخ الاستحقاق. اضرب كل سعر سابق للتاريخ في هذا المعامل. فيهبط الإغلاق الذي يسبق التاريخ مباشرة بمقدار التوزيع بالضبط، ولا تُظهر حركة يوم الاستحقاق إلا ما فعله السوق حقًّا، وتشمل العوائد المحسوبة من السلسلة المعدلة التوزيع. وهذا الإغلاق المعدّل هو ما ينبغي أن تستخدمه حسابات العوائد. ضع المعامل في دالة صغيرة مستقلة لتختبره وتعيد استخدامه.

def dividend_factor(prev_close, dividend):
    return 1 - dividend / prev_close


prices = pd.Series([100.0, 101.0, 102.0, 100.8, 101.5, 102.5], index=index)   # a 1.50 dividend, ex-date 5 March
ex_date, dividend = "2026-03-05", 1.5

prev_close = prices[prices.index < ex_date].iloc[-1]       # 102.0, the last close before the ex-date
factor = dividend_factor(prev_close, dividend)
print(round(factor, 6))                                    # 0.985294

adjusted = prices.where(prices.index >= ex_date, prices * factor)
print(adjusted.round(4).tolist())                          # [98.5294, 99.5147, 100.5, 100.8, 101.5, 102.5]
print(prices.pct_change().round(4).tolist()[3], adjusted.pct_change().round(4).tolist()[3])   # -0.0118 0.003
معدَّل للعوائد وخام للتداولالأسعار المعدلة لقياس العوائد والمقارنة عبر الزمن، وليست ما تدفعه: يُرسَل الأمر بالسعر الخام المسعَّر في ذلك اليوم، وقد يقل سعر معدَّل قديم عن السعر الحقيقي الذي تداول به السهم. احتفظ بالعمودين (close وadj_close) وحدّد أيهما يستخدمه كل حساب.
  • يقسم التقسيم الأسعار القديمة على النسبة ويضرب الأحجام القديمة بها؛ وتتغير الأيام السابقة للتقسيم فقط.
  • يضرب التوزيع الأسعار السابقة لتاريخ الاستحقاق في 1 - التوزيع / الإغلاق السابق.
  • استخدم where(index >= date, المعدّل) مع قناع لا حلقة؛ احسب العوائد من الأسعار المعدلة وتداول بالخام.

التالي: الرسوم الخطية مع matplotlib، لرسم سلسلة الأسعار النظيفة التي أصبحت بين يديك.

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

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

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

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

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

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

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

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