σμ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 AcademySkills
Ctrl K
AO
+1,2 Tsd. Lernende
AnmeldenBeitreten ↗
Skills
AO
+1,2 Tsd. Lernende
Anmelden
  • English
  • Français
  • Español
  • العربية
  • Português
  • Deutsch
  • 日本語
  • 中文
Python-Skill›Modul 2 · NumPy & pandas für Marktdaten›Thema 2.20·~35 Min.Mittelstufe

Histogramme und Verteilungen

Position in der SkillModul 2 von 11 · Thema 20 von 20
2.20 Histogramme und Verteilungen
—Lab-Punkte— / 100XP gesamt—Serie—

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 1

Zeichnen 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]
Die Klassen verändern das BildZu wenige Klassen verstecken die Form, zu viele erzeugen Rauschen. Es gibt keine einzig richtige Zahl; probieren Sie einige und vergleichen Sie Histogramme mit denselben Grenzen. Bedenken Sie auch, dass ein Histogramm eine Stichprobe ist: Die nächste sieht etwas anders aus, beurteilen Sie also die grobe Form, nicht einzelne Balken.
  • 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_counts die Renditen jeder Klasse zählen25 Pkt.
  • Mit density die Häufigkeiten in eine Dichte umrechnen25 Pkt.
  • Mit fraction_beyond die Ränder messen25 Pkt.
  • Mit plot_histogram das Histogramm zeichnen25 Pkt.
Explorer · lab-53-1
▾ lab-53-1
…
bash · im Browser
learner@quantcraft:~/lab-53-1$
Python noch nicht geladenPythonLn 1, Col 1Spaces: 4UTF-8

Dieses Thema zurücksetzen?

Alles in lab-53-1 wird auf die Startdateien zurückgesetzt und das Terminal geleert. Ihre aktuelle Lösung geht verloren – das lässt sich nicht rückgängig machen.

Wird zurückgesetzt
  • main.py → Startcode
  • Terminal-Verlauf und Testausgabe
  • Nicht eingereichte Änderungen
Bleibt erhalten
  • Beste Lab-Punktzahl
  • Ihre XP und Ihre Serie
  • Vorlesungsfortschritt und Notizen

Melde dich an, um deinen Code auszuführen.

Alle Lektionen kannst du kostenlos lesen. Erstelle ein Konto oder melde dich an, um Code auszuführen, Tests zu starten und dieses Lab abzugeben.

  • IDE im Browser mit Bash-Terminal — nichts zu installieren
  • Sofortige Bewertung, XP und dein Platz auf der Skill
Konto erstellenAnmelden
ODER
Weiter mit GitHub