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

إعادة التقطيع

الموضع في المسارالوحدة 2 من 11 · الموضوع 13 من 20
2.13 إعادة التقطيع
—درجة المختبر— / 100إجمالي XP—التتابع—

تغيير التردد

نادرًا ما تأتي البيانات بالتردد الذي تحتاجه. تصل التكّات بالميلي ثانية، ويريد النموذج أشرطة يومية، ويريد التقرير أشهرًا. تعيد إعادة التقطيع تجميع سلسلة زمنية في فترات جديدة. الانتقال من الدقيق إلى الخشن (أيام إلى أشهر) تقليل للعينات: تحوي كل فترة جديدة عدة ملاحظات قديمة فيجب أن تحدد كيف تجمعها. والانتقال من الخشن إلى الدقيق (أسابيع إلى أيام) زيادة للعينات: توجد فترات جديدة بلا بيانات فيجب أن تحدد ما يوضع فيها.

import pandas as pd

daily = pd.Series(
    [100.0, 101, 103, 102, 104, 105, 103, 106],
    index=pd.bdate_range("2026-02-25", periods=8),    # Wed 25 Feb ... Fri 6 Mar
    name="close",
)

print(daily.resample("ME").last())     # the last price of each month ("ME" = month end)
# 2026-02-28    103.0
# 2026-03-31    106.0
# Freq: ME, Name: close, dtype: float64

print(daily.resample("W-FRI").last())  # the last price of each week, weeks ending on Friday
# 2026-02-27    103.0
# 2026-03-06    106.0
# Freq: W-FRI, Name: close, dtype: float64

اختيار دالة التجميع

لا يفعل series.resample("ME") وحده شيئًا: إنه يصف الفترات فقط. والدالة التجميعية التي تليه تحدد القيمة ويجب أن تناسب معنى البيانات. السعر لقطة، فيُمثَّل الشهر بقيمته الأخيرة last (أو الأولى first). والحجم كمية متداولة، فالشهر هو sum. والمدى يستخدم max وmin. وتتبع التسميات القاعدة: يسمّي "ME" الشهر بآخر يوم تقويمي فيه ولو كان سبتًا، ويسمّي "W-FRI" الأسبوع بيوم جمعته.

volume = pd.Series([10, 20, 30, 40, 50, 60, 70, 80], index=daily.index)

print(volume.resample("ME").sum().to_dict())
# {Timestamp('2026-02-28 00:00:00'): 60, Timestamp('2026-03-31 00:00:00'): 300}

# Several summaries at once
print(daily.resample("ME").agg(["first", "last", "max"]))
#             first   last    max
# 2026-02-28  100.0  103.0  103.0
# 2026-03-31  102.0  106.0  106.0

أشرطة من التكّات، وزيادة العينات

تستخدم الرسوم والنماذج أشرطة OHLC: الافتتاح (أول سعر) والأعلى والأدنى والإغلاق (آخر سعر) لكل فترة. يبنيها resample("D").ohlc() من أسعار خلال اليوم باستدعاء واحد. وتظهر الأيام التقويمية بلا أي صفقة، مثل عطلات نهاية الأسبوع، صفوفًا من NaN، فاختم بـ dropna() إن أردت أيام التداول فقط. وتسير زيادة العينات في الاتجاه المعاكس: يكرّر resample("D").ffill() آخر قيمة معروفة في الأيام بلا بيانات، وهذا ما يعنيه سعر يُنشر أسبوعيًا. لا تستخدم bfill مع الأسعار أبدًا: فهو ينسخ قيمة مستقبلية إلى الوراء ويسرّب معلومات الغد إلى اليوم.

times = ["2026-03-05 09:30", "2026-03-05 11:00", "2026-03-05 15:59",
         "2026-03-09 09:30", "2026-03-09 12:00", "2026-03-09 15:59"]
ticks = pd.Series([100.0, 101.5, 99.8, 100.7, 102.0, 101.0], index=pd.to_datetime(times))

bars = ticks.resample("D").ohlc()
print(bars)
#              open   high    low  close
# 2026-03-05  100.0  101.5   99.8   99.8
# 2026-03-06    NaN    NaN    NaN    NaN
# 2026-03-07    NaN    NaN    NaN    NaN
# 2026-03-08    NaN    NaN    NaN    NaN
# 2026-03-09  100.7  102.0  100.7  101.0

print(bars.dropna().index.strftime("%d %b").tolist())   # ['05 Mar', '09 Mar']   only the days that traded
# Upsampling: observations on the 2nd, 6th and 10th, spread over every day with ffill
weekly = pd.Series([100.0, 103.0, 101.0], index=pd.to_datetime(["2026-03-02", "2026-03-06", "2026-03-10"]))

print(weekly.resample("D").ffill().tolist())
# [100.0, 100.0, 100.0, 100.0, 103.0, 103.0, 103.0, 103.0, 101.0]

print(int(weekly.resample("D").mean().isna().sum()))   # 6   without a fill rule the new days are empty
قد تسرّب إعادة التقطيع المستقبللا يُعرف الشريط الشهري إلا في نهاية الشهر. فإن ربطت إغلاق نهاية الشهر بأول يوم فيه بدت الاستراتيجية وكأنها تعرف المستقبل. أبقِ التسمية في نهاية الفترة كما يفعل "ME"، واستخدم ffill (لا bfill) عند زيادة العينات، وأزِح الإشارة الشهرية إلى الأمام قبل استخدامها مع البيانات اليومية.
  • series.resample(rule) تصف الفترات ("D" و"W-FRI" و"ME" و"h")؛ وتحسب الدالة التجميعية بعدها القيم.
  • الأسعار: last أو ohlc()؛ الأحجام: sum؛ وتظهر الفترات الفارغة NaN ويزيلها dropna().
  • تحتاج زيادة العينات إلى قاعدة تعبئة: ffill() تكرر آخر قيمة معروفة؛ ولا bfill() مع الأسعار فهي تسرّب المستقبل.

التالي: النوافذ المتحركة، إحصاءات مثل المتوسطات المتحركة تُحسب على نافذة منزلقة من الفترات الأخيرة.

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

  • خذ آخر سعر في كل شهر باستخدام month_end_close25 نقطة
  • اجمع حجم التداول لكل أسبوع باستخدام weekly_volume25 نقطة
  • ابنِ أشرطة يومية من أسعار خلال اليوم باستخدام daily_ohlc25 نقطة
  • وزّع ملاحظات غير منتظمة على كل يوم باستخدام fill_to_daily25 نقطة
المستكشف · lab-46-1
▾ lab-46-1
…
bash · داخل المتصفح
learner@quantcraft:~/lab-46-1$
لم يتم تحميل Python بعدPythonLn 1, Col 1Spaces: 4UTF-8

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

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

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

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

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

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