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