ما يعد به منحنى الجرس
تفترض نماذج مخاطر كثيرة أن العوائد تتبع التوزيع الطبيعي لأنه يجعل كل شيء قابلًا للحساب بمتوسط وانحراف معياري. والتوزيع الطبيعي دقيق جدًا بشأن القيم المتطرفة. احتمال البعد أكثر من k انحرافًا معياريًا عن المتوسط في أي اتجاه هو erfc(k / sqrt(2)): 31.7% لـ 1 و4.55% لـ 2 و0.27% لـ 3 و0.0063% لـ 4. فيقع يوم 4 سيغما مرة كل نحو 15800 يوم تداول، أي مرة كل 63 سنة تقريبًا، ويوم 5 سيغما مرة كل آلاف السنين.
import math
import numpy as np
for k in (1, 2, 3, 4, 5):
probability = math.erfc(k / math.sqrt(2)) # P(|Z| > k) for a normal variable
print(k, f"{probability:.2e}")
# 1 3.17e-01
# 2 4.55e-02
# 3 2.70e-03
# 4 6.33e-05
# 5 5.73e-07
print(round(1 / math.erfc(4 / math.sqrt(2)))) # 15787 trading days between 4-sigma days, if returns were normal
print(round(1 / math.erfc(5 / math.sqrt(2)) / 252)) # 6922 years between 5-sigma daysللأسواق أطراف ثقيلة
تنتج الأسواق الحقيقية أيام 4 و5 سيغما مرات كثيرة خلال مسيرة مهنية، في 1987 و2008 و2020. وتوزيعات عوائدها ذات أطراف ثقيلة: أيام متطرفة أكثر مما يسمح به الجرس (ووسط أعلى وأضيق). وطريقة بسيطة لرؤية ذلك هي نسبة الأطراف: حصة العوائد المرصودة وراء k انحرافًا معياريًا مقسومة على الحصة التي يعطيها التوزيع الطبيعي. نسبة قريبة من 1 تعني أطرافًا طبيعية؛ و5 تعني أن المتطرف أكثر تكرارًا بخمسة أضعاف؛ وفي البيانات اليومية عند k = 4 قد تبلغ المئات. والنماذج التي تفترض الطبيعية تقلّل بالضبط من شأن الأيام الأهم.
returns = np.array([0.010, 0.012, 0.008, 0.011, 0.009, 0.010, 0.012, -0.060, 0.010, 0.009])
def tail_ratio(x, k):
observed = np.mean(np.abs(x - x.mean()) > k * x.std(ddof=1)) # share beyond k standard deviations
return observed / math.erfc(k / math.sqrt(2)) # divided by what a normal would give
print(round(float(tail_ratio(returns, 2)), 2)) # 2.2 the one crash is 2.2 times too frequent at 2 sigma (a tiny sample, though)اختبار جارك-بيرا
يسأل الاختبار الرسمي: هل يمكن أن تأتي العيّنة بصورة معقولة من توزيع طبيعي؟ يجمع إحصاء جارك-بيرا مقياسي الشكل من الموضوع السابق: JB = n / 6 * (S² + K² / 4) حيث S الالتواء وK التفرطح الزائد. وفي العيّنة الطبيعية يقترب كلاهما من 0 فيكون JB صغيرًا. وتحت فرض الطبيعية يتبع JB توزيع مربع كاي بدرجتي حرية، وله لطرفه صيغة مغلقة exp(-JB / 2): وهي قيمة p. إن كانت أقل من 0.05 رُفضت الطبيعية. والقيمة الحرجة JB = 5.99. وعيّنتنا ذات العشرة أيام وانهيار واحد لها JB = 22.4 وقيمة p تبلغ 0.00001.
x = returns
n = len(x)
deviations = x - x.mean()
m2, m3, m4 = (np.mean(deviations ** k) for k in (2, 3, 4))
skew, kurt = m3 / m2 ** 1.5, m4 / m2 ** 2 - 3
jb = n / 6 * (skew ** 2 + kurt ** 2 / 4)
p_value = math.exp(-jb / 2)
print(round(float(jb), 2), p_value < 0.05) # 22.37 True normality rejected
print(f"{p_value:.1e}") # 1.4e-05# The p-value falls fast as the statistic grows: 5.99 is the 5% critical value
for jb in (0, 2, 5.99, 10, 22.37):
print(jb, round(math.exp(-jb / 2), 5))
# 0 1.0
# 2 0.36788
# 5.99 0.05004
# 10 0.00674
# 22.37 1e-05- يبعد المتغير الطبيعي أكثر من k انحرافًا باحتمال
erfc(k / sqrt(2)): 4.55% لـ 2 و0.0063% لـ 4. - تُظهر نسبة الأطراف، الحصة المرصودة مقسومة على الطبيعية، الأطراف الثقيلة: الأسواق أعلى بكثير من 1 عند 4 سيغما.
- جارك-بيرا:
n / 6 * (S**2 + K**2 / 4)؛ وقيمة p هيexp(-JB / 2)؛ وأقل من 0.05 تُرفض الطبيعية (JB فوق 5.99).
التالي: اختبارات الفرضيات: اختبار t، لتقرير ما إذا كان متوسط العائد يختلف فعلًا عن الصفر.
المختبر: ما الذي يُقيَّم
- قِس بُعد العيّنة عن التوزيع الطبيعي باستخدام
jarque_bera25 نقطة - حوّل الإحصاء إلى قيمة p باستخدام
normality_p_value25 نقطة - احسب ما يعد به منحنى الجرس باستخدام
normal_tail_probability25 نقطة - احسب مقدار ثقل الأطراف مقارنة بالطبيعي باستخدام
tail_ratio25 نقطة