σμ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.2·~35 Min.Einsteiger

Indizierung und Slicing von Arrays

Position in der SkillModul 2 von 11 · Thema 2 von 20
2.2 Indizierung und Slicing von Arrays
—Lab-Punkte— / 100XP gesamt—Serie—

Positionen und Slices, jetzt in mehreren Dimensionen

Arrays werden wie Listen indiziert: a[0] ist das erste Element, a[-1] das letzte und a[start:stop:schritt] ein Slice, das vor stop endet. Der Unterschied: Ein Array kann mehrere Dimensionen haben, und man gibt pro Dimension einen Index oder Slice an, durch Kommas getrennt: m[zeile, spalte]. Ein einzelnes : heißt „diese ganze Dimension“, m[:, 1] ist also die ganze zweite Spalte und m[1] (oder m[1, :]) die ganze zweite Zeile. Negative Zahlen zählen vom Ende, und ein Schritt von -1 kehrt um.

import numpy as np

a = np.array([10., 11., 12., 13., 14., 15.])
print(a[0], a[-1])           # 10.0 15.0
print(a[1:4])                # [11. 12. 13.]
print(a[-2:])                # [14. 15.]
print(a[::2])                # [10. 12. 14.]
print(a[::-1])               # [15. 14. 13. 12. 11. 10.]

# Two dimensions: one index or slice per dimension
m = np.arange(12).reshape(3, 4)
print(m[1, 2])               # 6
print(m[:, 1])               # [1 5 9]      the whole second column
print(m[-1, :])              # [ 8  9 10 11] the last row
print(m[0:2, 1:3])           # [[1 2]
                             #  [5 6]]

Slices sind Sichten, keine Kopien

Anders als ein Listen-Slice kopiert ein einfacher NumPy-Slice die Daten nicht: Er ist eine Sicht auf denselben Speicher, Schreiben darüber ändert also das Original. Das macht Slicing selbst bei riesigen Arrays sofort, überrascht aber: part = a[1:4]; part[0] = 99 ändert auch a[1]. Brauchen Sie ein unabhängiges Array, rufen Sie .copy() auf. Prüfen lässt es sich mit np.shares_memory(a, b). Dasselbe Sichtverhalten gilt für Zeilen, Spalten, Schritte und umgekehrte Slices.

import numpy as np

a = np.array([10., 11., 12., 13., 14., 15.])

part = a[1:4]           # a view, no data copied
part[0] = 99
print(a)                # [10. 99. 12. 13. 14. 15.]   a changed too

safe = a[1:4].copy()    # an independent array
safe[0] = -1
print(a)                # [10. 99. 12. 13. 14. 15.]   unchanged

print(np.shares_memory(a, a[::2]))   # True
print(np.shares_memory(a, safe))     # False

Boolesche Masken und Indexlisten

Der Vergleich eines Arrays liefert ein gleich großes Array aus Booleans: r > 0 ist True, wo die Rendite positiv ist. Als Index verwendet, wählt diese Maske r[r > 0] nur diese Elemente aus. Verknüpfen Sie Bedingungen mit & (und), | (oder) und ~ (nicht), jede in Klammern, da Pythons and/or mit Arrays nicht funktionieren. Auch eine Liste oder ein Array von Ganzzahlen geht, a[[0, 2, 5]], und wählt genau diese Positionen in dieser Reihenfolge. Auswahl per Maske oder Indexliste kopiert die Daten, und über eine Maske lässt sich auch zuweisen: a[a > 3] = 0.

import numpy as np

r = np.array([0.01, -0.02, 0.03, -0.01, 0.0, 0.02])
print(r > 0)                        # [ True False  True False False  True]
print(r[r > 0])                     # [0.01 0.03 0.02]
print(r[(r > 0) & (r < 0.025)])     # [0.01 0.02]    parentheses are required
print(np.where(r > 0)[0])           # [0 2 5]        positions where it holds

# Pick by position, in any order
w = np.array([3.0, 9.0, 1.0, 7.0])
order = np.argsort(-w)              # positions from the largest value down
print(order[:2], w[order[:2]])      # [1 3] [9. 7.]

# Assign through a mask
counts = np.array([1, 2, 3, 4, 5, 6])
counts[counts > 3] = 0
print(counts)                       # [1 2 3 0 0 0]
import numpy as np

# Rows are days, columns are assets (AAPL, MSFT, GOOG)
R = np.array([[ 0.02, -0.01,  0.03],
              [ 0.01,  0.00,  0.02],
              [-0.03,  0.02, -0.01],
              [ 0.00,  0.01,  0.04]])

print(R[:, [0, 2]])             # the AAPL and GOOG columns, as a copy
print(R[R[:, 0] > 0])           # the days on which AAPL rose (whole rows)
print(R[R[:, 0] > 0].shape)     # (2, 3)
print(R[-2:, 1].mean())         # 0.015  last two days of MSFT
Wissen Sie, was Sie haben: Sicht oder KopieEinfache Slices (a[1:4], m[:, 1], a[::2]) sind Sichten; Masken und Indexlisten (a[a > 0], a[[0, 2]]) sind Kopien. Eine Funktion, die einen Slice ihres Arguments zurückgibt, gibt dem Aufrufer ein Fenster auf dessen eigene Daten, sodass ein späteres Schreiben sie unerwartet ändern kann. Entscheiden Sie bewusst: Geben Sie eine Sicht zurück, wenn Geschwindigkeit zählt und die Daten schreibgeschützt sind, sonst .copy(). Die Lab-Tests prüfen beide Verhalten.
  • Ein Index oder Slice pro Dimension: m[zeile, spalte], m[:, 1] (eine Spalte), m[-1] (letzte Zeile), a[::-1].
  • Einfache Slices sind Sichten (Schreiben wirkt durch; .copy() zum Lösen); Masken und Indexlisten erzeugen Kopien.
  • Masken: a[a > 0], kombiniert mit &, |, ~ in Klammern; np.argsort liefert die Positionen in sortierter Reihenfolge.

Als Nächstes: Vektorisierung, Python-Schleifen durch Arithmetik auf ganzen Arrays ersetzen.

Lab: Was bewertet wird

  • Mit last_rows die neuesten Zeilen nehmen25 Pkt.
  • Mit positive_values nur die Gewinne behalten25 Pkt.
  • Mit every_kth jeden k-ten Wert abtasten25 Pkt.
  • Mit top_k_indices die Positionen der k größten Werte finden25 Pkt.
Explorer · lab-35-1
▾ lab-35-1
…
bash · im Browser
learner@quantcraft:~/lab-35-1$
Python noch nicht geladenPythonLn 1, Col 1Spaces: 4UTF-8

Dieses Thema zurücksetzen?

Alles in lab-35-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