σμ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›الوحدة 3 · الاحتمالات ومحاكاة مونت كارلو›الموضوع 3.4·~45 دمتوسط

اختبارات الفرضيات: اختبار t

الموضع في المسارالوحدة 3 من 11 · الموضوع 4 من 12
3.4 اختبارات الفرضيات: اختبار t
—درجة المختبر— / 100إجمالي XP—التتابع—

هل متوسط العائد حقيقي؟

يُظهر اختبار رجعي متوسط عائد +0.14% يوميًا. هل الاستراتيجية جيدة أم حالفها الحظ؟ العوائد مشوَّشة، فلكل عيّنة متوسط، وحتى استراتيجية رمي العملة يكون متوسطها موجبًا في نصف الحالات. يطرح اختبار الفرضية سؤالًا دقيقًا: لو كان المتوسط الحقيقي mu0 (عادةً 0) فما مدى المفاجأة في متوسط عيّنة يبعد عن mu0 بهذا القدر؟ والجواب قيمة p. وقيمة p الصغيرة تعني أن البيانات ستكون بعيدة الاحتمال تحت فرضية «لا شيء يحدث».

t = (mean - mu0) / (s / sqrt(n)) p = P(|Z| > |t|)

يقيس إحصاء t المتوسط بوحدات ريبته الخاصة. وريبة المتوسط هي الخطأ المعياري s / sqrt(n): يتناقص بنمو العيّنة، ولهذا تجعل البيانات الأكثر المتوسط نفسه أكثر إقناعًا. وإعادة قياس كل العوائد تغيّر المتوسط والخطأ المعياري بالقدر نفسه فلا يتغير t. وكقاعدة تقريبية، لا يُرجَّح أن يكون |t| فوق 2 مجرد حظ.

import math
import numpy as np

returns = np.array([0.004, -0.002, 0.001, 0.003, -0.004, 0.002, 0.006, -0.001, 0.005, 0.002, 0.003, -0.002])

n = len(returns)
mean = returns.mean()
std_error = returns.std(ddof=1) / math.sqrt(n)         # the uncertainty of the mean
t = mean / std_error                                   # testing against mu0 = 0

print(round(mean, 5), round(std_error, 6))             # 0.00142 0.000892   the mean is only 1.6 standard errors from 0
print(round(t, 3))                                     # 1.589

من t إلى قيمة p

تحت فرضية العدم يتصرف t كمتغير طبيعي معياري عندما تكون العيّنة كبيرة، فتكون قيمة p ثنائية الطرف احتمال الوقوع على بعد أكثر من |t| عن 0 في أي اتجاه: erfc(|t| / sqrt(2)). وعند t = 1.59 تساوي 11%: نتيجة بهذه الجودة تحدث مرة من كل تسع بالمصادفة، فلا نستطيع الزعم بوجود ميزة حقيقية. والعتبة المعتادة 5% (|t| = 1.96). وللعيّنات الصغيرة المرجع الصحيح توزيع t لستيودنت ذو الأطراف الأثقل، فقيمة p الطبيعية أصغر قليلًا مما ينبغي؛ ومع أقل من 30 نقطة استخدم جدول t حقيقيًا.

p_value = math.erfc(abs(t) / math.sqrt(2))
print(round(p_value, 4))                      # 0.1121   an outcome this good happens by chance about 1 time in 9

print(round(math.erfc(1.96 / math.sqrt(2)), 4))   # 0.05     |t| = 1.96 is the usual 5% limit

# Testing against another value: is the mean different from 0.2% a day?
t_other = (mean - 0.002) / std_error
print(round(t_other, 3), round(math.erfc(abs(t_other) / math.sqrt(2)), 3))   # -0.654 0.513

فترات الثقة والعيّنات المزدوجة

يقول فاصل الثقة أكثر من اختبار نعم/لا: المتوسط -/+ 1.96 * الخطأ المعياري نطاق يحوي المتوسط الحقيقي نحو 95% من المرات. وإذا احتوى الفاصل 0 فالمتوسط غير معنوي عند 5%. وفاصلنا، من -0.03% إلى +0.32% يوميًا، يعبر الصفر وهو واسع قياسًا إلى المتوسط. ولمقارنة استراتيجيتين قيستا في الأيام نفسها اختبر فروقهما اليومية مقابل 0. فالازدواج يزيل الضجيج المشترك بينهما (أيام السوق الجيدة والسيئة) فيكشف الميزة أوضح بكثير من اختبارين منفصلين.

low, high = mean - 1.96 * std_error, mean + 1.96 * std_error
print(round(low, 5), round(high, 5))           # -0.00033 0.00316   the interval contains 0: not significant at 5%

# Paired: the same six days for two strategies
a = np.array([0.004, -0.002, 0.001, 0.003, -0.004, 0.002])
b = np.array([0.002, -0.003, 0.000, 0.001, -0.002, 0.0])
d = a - b
t_paired = d.mean() / (d.std(ddof=1) / math.sqrt(len(d)))
print(round(d.mean(), 5), round(t_paired, 3))   # 0.001 1.581   a daily edge of 0.1%, but only 6 days
# Same mean and spread, four times the data: t doubles and the p-value collapses
spread = returns.std(ddof=1)
for n in (12, 48):
    t_n = mean / (spread / math.sqrt(n))
    print(n, round(t_n, 3), round(math.erfc(abs(t_n) / math.sqrt(2)), 4))
# 12 1.589 0.1121
# 48 3.178 0.0015
المعنوي ليس مهمًا، وكثير من الاختبارات تغشقد تكون ميزة ضئيلة معنوية جدًا مع بيانات كافية، وقد لا تكون ميزة كبيرة معنوية مع بيانات قليلة. اقرأ دائمًا حجم الأثر إلى جانب قيمة p. وإذا اختبرت 100 استراتيجية فستنجح نحو 5 منها عند 5% بالحظ وحده: كلما جرّبت متغيرات أكثر على البيانات نفسها قلّ معنى أي قيمة p منفردة.
  • t = (mean - mu0) / (s / sqrt(n)): المتوسط بوحدة خطئه المعياري s / sqrt(n)؛ كلما زادت البيانات كبر |t|.
  • قيمة p ثنائية الطرف هي erfc(|t| / sqrt(2)) للعيّنات الكبيرة؛ و|t| > 1.96 تعني p < 5%؛ وفاصل mean -/+ 1.96 * se الذي يحوي 0 يعني غير معنوي.
  • قارن الاستراتيجيات في الأيام نفسها بإحصاء t للفروق اليومية؛ واحذر من اختبار متغيرات كثيرة.

التالي: الانحدار الخطي (OLS)، لملاءمة خط يفسّر عائدًا بعائد آخر.

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

  • قِس المتوسط بوحدات ضجيجه باستخدام t_statistic25 نقطة
  • حوّل t إلى قيمة p باستخدام two_sided_p25 نقطة
  • أحِط المتوسط الحقيقي باستخدام confidence_interval25 نقطة
  • قارن استراتيجيتين يومًا بيوم باستخدام paired_t_statistic25 نقطة
المستكشف · lab-57-1
▾ lab-57-1
…
bash · داخل المتصفح
learner@quantcraft:~/lab-57-1$
لم يتم تحميل Python بعدPythonLn 1, Col 1Spaces: 4UTF-8

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

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

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

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

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

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