σμ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 AcademyRutas
Ctrl K
AO
+1,2 k estudiantes
Iniciar sesiónUnirse ↗
Rutas
AO
+1,2 k estudiantes
Iniciar sesión
  • English
  • Français
  • Español
  • العربية
  • Português
  • Deutsch
  • 日本語
  • 中文
Ruta de Python›Módulo 2 · NumPy y pandas para datos de mercado›Tema 2.2·~35 minPrincipiante

Indexación y segmentación de arrays

Posición en la rutaMódulo 2 de 11 · Tema 2 de 20
2.2 Indexación y segmentación de arrays
—Puntuación del lab— / 100XP total—Racha—

Posiciones y porciones, ahora en varias dimensiones

Los arreglos se indexan como las listas: a[0] es el primer elemento, a[-1] el último y a[inicio:fin:paso] una porción que se detiene antes de fin. La diferencia es que un arreglo puede tener varias dimensiones, y se da un índice o porción por dimensión, separados por comas: m[fila, columna]. Un : solo significa «toda esta dimensión»: m[:, 1] es toda la segunda columna y m[1] (o m[1, :]) toda la segunda fila. Los números negativos cuentan desde el final y un paso de -1 invierte.

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]]

Las porciones son vistas, no copias

A diferencia de una porción de lista, una porción básica de NumPy no copia los datos: es una vista sobre la misma memoria, así que escribir a través de ella cambia el arreglo original. Eso hace que cortar sea instantáneo incluso en arreglos enormes, pero sorprende: part = a[1:4]; part[0] = 99 también cambia a[1]. Cuando necesites un arreglo independiente, llama a .copy(). Puedes comprobarlo con np.shares_memory(a, b). El mismo comportamiento de vista vale para filas, columnas, pasos y porciones invertidas.

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

Máscaras booleanas y listas de índices

Comparar un arreglo da un arreglo de booleanos del mismo tamaño: r > 0 es True donde el rendimiento es positivo. Usando esa máscara como índice, r[r > 0], se eligen solo esos elementos. Combina condiciones con & (y), | (o) y ~ (no), cada condición entre paréntesis, porque los and/or de Python no funcionan con arreglos. Una lista o arreglo de enteros también sirve, a[[0, 2, 5]], que toma exactamente esas posiciones en ese orden. La selección por máscara o por lista de índices copia los datos, y también puedes asignar a través de una máscara: 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
Sabe cuál tienes: una vista o una copiaLas porciones básicas (a[1:4], m[:, 1], a[::2]) son vistas; las máscaras y listas de índices (a[a > 0], a[[0, 2]]) son copias. Una función que devuelve una porción de su argumento da a quien llama una ventana a sus propios datos, así que una escritura posterior puede cambiarlos de forma inesperada. Decide a propósito: devuelve una vista cuando importa la velocidad y los datos son de solo lectura; si no, .copy(). Las pruebas del lab comprueban ambos comportamientos.
  • Un índice o porción por dimensión: m[fila, col], m[:, 1] (una columna), m[-1] (última fila), a[::-1].
  • Las porciones básicas son vistas (las escrituras se reflejan; .copy() para separar); máscaras y listas de índices hacen copias.
  • Máscaras: a[a > 0], combina con &, |, ~ entre paréntesis; np.argsort da las posiciones en orden.

A continuación: vectorización, que reemplaza los bucles de Python por aritmética sobre arreglos completos.

Lab: qué se califica

  • Tomar las filas más recientes con last_rows25 pts
  • Quedarse solo con las ganancias con positive_values25 pts
  • Muestrear uno de cada k valores con every_kth25 pts
  • Hallar las posiciones de los k valores mayores con top_k_indices25 pts
Explorador · lab-35-1
▾ lab-35-1
…
bash · en el navegador
learner@quantcraft:~/lab-35-1$
Python aún no cargadoPythonLn 1, Col 1Spaces: 4UTF-8

¿Restablecer este tema?

Todo lo que hay en lab-35-1 vuelve a los archivos iniciales y se limpia el terminal. Tu solución actual se perderá: no se puede deshacer.

Se restablecerá
  • main.py → código inicial
  • Historial del terminal y salida de pruebas
  • Cambios sin enviar
Se conservará
  • Mejor puntuación del lab
  • Tu XP y tu racha
  • Progreso de la lección y notas

Inicia sesión para ejecutar tu código.

Todas las clases se pueden leer gratis. Crea una cuenta o inicia sesión para ejecutar código, lanzar las pruebas y enviar este lab.

  • IDE en el navegador con terminal bash — sin instalar nada
  • Corrección instantánea, XP y tu lugar en la ruta
Crear una cuentaIniciar sesión
O
Continuar con GitHub