Nach Bereichen zählen
Mittelwert und Standardabweichung pressen tausend Renditen in zwei Zahlen. Ein Histogramm behält die Form: Es teilt den Wertebereich in Klassen und zählt, wie viele Beobachtungen in jede fallen. Hohe Balken in der Mitte und niedrige an den Rändern ergeben die vertraute Glocke; eine unsymmetrische oder randlastige Form ist ein Warnsignal. np.histogram(values, bins=edges) liefert die Häufigkeiten und arbeitet auf einem ganzen Array. Klasse i nimmt die Werte von edges[i] (eingeschlossen) bis edges[i + 1] (ausgeschlossen); nur die letzte Klasse schließt auch ihren rechten Rand ein.
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]Häufigkeit oder Dichte
Häufigkeiten hängen von der Zahl der Beobachtungen und der Klassenbreite ab, daher lassen sich zwei Histogramme mit verschiedenen Stichprobengrößen nicht vergleichen. Eine Dichte behebt das: Teilen Sie jede Häufigkeit durch die gezählte Gesamtzahl und durch die Klassenbreite, sodass die Fläche der Balken 1 ergibt. Dann lässt sich eine Dichte mit einer theoretischen Kurve wie der Normalverteilung oder mit einer anderen Stichprobe vergleichen. np.histogram(values, bins=edges, density=True) leistet das, ebenso 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 1Zeichnen und die Ränder lesen
ax.hist(values, bins=10) zählt und zeichnet in einem Aufruf: ein Balken je Klasse (ax.patches), dessen Höhen die Häufigkeiten sind. Beschriften Sie immer die Achsen, denn ein Renditehistogramm ohne „Tagesrendite“ darunter bedeutet nichts. Die Form ist wichtig, und die Ränder tun weh: Den Anteil der Beobachtungen zu zählen, die mehr als k Standardabweichungen vom Mittel entfernt liegen, np.mean(np.abs(x - mean) > k * std), zeigt, wie oft Extreme vorkommen. Bei einer Normalverteilung liegen etwa 4,6 % der Werte jenseits von 2 und 0,27 % jenseits von 3 Standardabweichungen. Märkte sind schlimmer, wie die nächsten Themen zeigen.
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)zählt die Werte jeder Klasse; die letzte Klasse schließt ihren rechten Rand ein.- Eine Dichte teilt durch die gezählte Gesamtzahl und die Klassenbreite: Die Flächen ergeben 1, und Stichproben werden vergleichbar.
ax.hist(values, bins=n)zeichnet es;np.mean(np.abs(x - mean) > k * std)misst die Ränder. Beschriften Sie die Achsen und vergleichen Sie mit denselben Grenzen.
Als Nächstes: Mittelwert und Varianz von Renditen, die zwei Zahlen, die eine Verteilung zusammenfassen, aus ihren Definitionen berechnet.
Lab: Was bewertet wird
- Mit
bin_countsdie Renditen jeder Klasse zählen25 Pkt. - Mit
densitydie Häufigkeiten in eine Dichte umrechnen25 Pkt. - Mit
fraction_beyonddie Ränder messen25 Pkt. - Mit
plot_histogramdas Histogramm zeichnen25 Pkt.