العدّ حسب النطاق
المتوسط والانحراف المعياري يضغطان ألف عائد في رقمين. أما المدرّج التكراري فيحتفظ بالشكل: يقسم نطاق القيم إلى فئات ويعدّ كم ملاحظة تقع في كل منها. أعمدة عالية في الوسط وقصيرة عند الطرفين هي الجرس المألوف؛ والشكل غير المتوازن أو ثقيل الأطراف تحذير. يعيد np.histogram(values, bins=edges) الأعداد ويعمل على مصفوفة كاملة. تأخذ الفئة i القيم من edges[i] (مشمولة) حتى edges[i + 1] (غير مشمولة)، والفئة الأخيرة وحدها تشمل حدها الأيمن.
import numpy as np
returns = np.array([-0.021, -0.012, -0.008, -0.004, -0.002, 0.000, 0.001, 0.003, 0.004, 0.006, 0.009, 0.015, 0.032])
edges = np.array([-0.03, -0.01, 0.0, 0.01, 0.03]) # four bins: -3%..-1%, -1%..0%, 0%..1%, 1%..3%
counts, _ = np.histogram(returns, bins=edges)
print(counts.tolist(), counts.sum(), len(returns)) # [2, 3, 6, 1] 12 13 the 3.2% return is outside every bin
# bins=4 asks numpy for 4 equal-width bins between the minimum and the maximum
counts, edges4 = np.histogram(returns, bins=4)
print(counts.tolist(), edges4.round(4).tolist()) # [3, 6, 3, 1] [-0.021, -0.0078, 0.0055, 0.0188, 0.032]التكرار أو الكثافة
تعتمد الأعداد على عدد الملاحظات وعلى عرض الفئات، فلا يمكن مقارنة مدرّجين بحجمي عينة مختلفين. وتحل الكثافة ذلك: اقسم كل عدد على المجموع المعدود وعلى عرض الفئة، فتساوي مساحة الأعمدة 1. عندئذٍ يمكن مقارنة الكثافة بمنحنى نظري كجرس التوزيع الطبيعي أو بعينة أخرى. يفعل ذلك np.histogram(values, bins=edges, density=True) وكذلك counts / (counts.sum() * np.diff(edges)).
counts, _ = np.histogram(returns, bins=edges)
density = counts / (counts.sum() * np.diff(edges))
print(density.round(2).tolist()) # [8.33, 25.0, 50.0, 4.17]
print((density * np.diff(edges)).sum()) # 1.0 the areas add up to 1رسمه وقراءة الأطراف
يعدّ ax.hist(values, bins=10) ويرسم باستدعاء واحد: عمود لكل فئة (ax.patches) وارتفاعاته هي الأعداد. سمِّ المحاور دائمًا فمدرّج العوائد بلا «العائد اليومي» تحته بلا معنى. الشكل هو المهم، والأطراف هي ما يؤلم: عدّ نسبة الملاحظات التي تبعد أكثر من k انحرافًا معياريًا عن المتوسط، np.mean(np.abs(x - mean) > k * std)، يبيّن كم مرة تقع القيم المتطرفة. وفي التوزيع الطبيعي تقع نحو 4.6% من القيم وراء انحرافين و0.27% وراء ثلاثة. والأسواق أسوأ من ذلك كما ستبيّن المواضيع التالية.
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
ax.hist(returns, bins=5)
ax.set_xlabel("Daily return")
ax.set_ylabel("Frequency")
print(len(ax.patches), [round(p.get_height()) for p in ax.patches]) # 5 [2, 4, 5, 1, 1] one bar per bin; the heights are the counts
# How often are the returns more than 1 standard deviation from the mean?
mean, std = returns.mean(), returns.std(ddof=1)
print(round(float(np.mean(np.abs(returns - mean) > 1 * std)), 3)) # 0.308 about 4 of 13 days# The number of bins changes the picture: compare a few
for bins in (2, 4, 8):
print(bins, np.histogram(returns, bins=bins)[0].tolist())
# 2 [9, 4]
# 4 [3, 6, 3, 1]
# 8 [1, 2, 2, 4, 2, 1, 0, 1]np.histogram(values, bins=edges)تعدّ القيم في كل فئة؛ والفئة الأخيرة تشمل حدها الأيمن.- تقسم الكثافة على المجموع المعدود وعرض الفئة، فتساوي المساحات 1 وتصبح العينات قابلة للمقارنة.
- يرسمه
ax.hist(values, bins=n)؛ ويقيسnp.mean(np.abs(x - mean) > k * std)الأطراف. سمِّ المحاور وقارن بالحدود نفسها.
التالي: متوسط العوائد وتباينها، الرقمان اللذان يلخصان التوزيع، محسوبين من تعريفيهما.
المختبر: ما الذي يُقيَّم
- عُدّ العوائد في كل فئة باستخدام
bin_counts25 نقطة - حوّل العدّ إلى كثافة باستخدام
density25 نقطة - قِس الأطراف باستخدام
fraction_beyond25 نقطة - ارسم المدرّج التكراري باستخدام
plot_histogram25 نقطة