σμ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 1 · Fundamentos de Python para quants›Tema 1.19·~45 minPrincipiante

Excepciones y manejo de errores

Posición en la rutaMódulo 1 de 11 · Tema 19 de 33
1.19 Excepciones y manejo de errores
—Puntuación del lab— / 100XP total—Racha—

Cuando algo sale mal

Cuando Python no puede hacer lo que pides, lanza una excepción: float("abc") lanza ValueError, {}["x"] lanza KeyError, 1 / 0 lanza ZeroDivisionError, abrir un archivo que falta lanza FileNotFoundError. Si nada la maneja, el programa se detiene e imprime un traceback, la cadena de llamadas que llevó hasta allí, que se lee de abajo arriba. Es el resultado correcto para un error real. Para problemas previsibles, como un mal precio escrito por un usuario, manejas la excepción con try y except.

# Handle an expected problem
def to_price(text):
    try:
        return float(text)
    except ValueError:
        return None

print(to_price("184.25"))  # 184.25
print(to_price("abc"))     # None

# An unhandled one stops the program with a traceback
# print(int("abc"))        # ValueError: invalid literal for int()...

Captura solo lo que esperas

Nombra el tipo de excepción: except ValueError:. Un except: a secas o except Exception: también se traga errores que no querías ocultar, como un TypeError causado por pasar None, y el programa sigue con datos erróneos. Varios tipos pueden compartir un manejador, except (ValueError, KeyError):, o tener manejadores separados. Python prueba los manejadores en orden y ejecuta el primero que coincide. Puedes conservar el error con except ValueError as error: y examinarlo.

# Specific handlers, tried in order
def read_quantity(text):
    try:
        return int(text)
    except ValueError as error:
        print("not a whole number:", error)
        return 0
    except TypeError:
        print("expected text, got something else")
        return 0

print(read_quantity("200"))  # 200
print(read_quantity("2.5"))  # prints the message, then 0
print(read_quantity(None))   # prints the message, then 0

else y finally

Dos partes opcionales completan la sentencia. else: se ejecuta solo cuando el bloque try no lanzó nada, lo que mantiene corta la línea arriesgada y deja el código posterior fuera de la protección. finally: se ejecuta siempre, haya error o no, incluso tras un return: úsalo para limpiar. A menudo un bloque with ya hace la limpieza por ti, como con los archivos.

# else runs on success, finally runs always
def describe(text):
    try:
        price = float(text)
    except ValueError:
        print("bad price")
    else:
        print("price is", price)
    finally:
        print("done with", repr(text))

describe("184.25")
# price is 184.25
# done with '184.25'
describe("abc")
# bad price
# done with 'abc'

Lanzar tus propios errores

Una función que recibe un valor que no puede aceptar debe negarse con claridad usando raise, no devolver en silencio algo erróneo: raise ValueError("price must be positive"). Elige el tipo incorporado adecuado (ValueError para un tipo correcto pero un valor malo, TypeError para un tipo incorrecto) y escribe un mensaje que diga qué falló. Quien llama decide entonces si lo captura. Dentro de un bloque except, un raise a secas vuelve a lanzar el error recién capturado, útil cuando solo querías registrarlo.

# Refuse bad input, let the caller decide
def parse_price(text):
    price = float(text)           # may raise ValueError itself
    if not price > 0:
        raise ValueError("price must be positive")
    return price

for text in ["184.25", "-5", "abc"]:
    try:
        print(parse_price(text))
    except ValueError as error:
        print("rejected:", error)
# 184.25
# rejected: price must be positive
# rejected: could not convert string to float: 'abc'
No ocultes errores que no puedes arreglarUn except que no hace nada (except: pass) convierte un fallo que podrías haber depurado en cifras erróneas y silenciosas, mucho peor en código de trading. Captura un error solo donde conozcas una respuesta sensata: usar un valor por defecto, omitir el elemento, reintentar, o avisar y parar. Si no, deja que suba hasta un lugar que sí sepa qué hacer.
  • try / except SpecificError: maneja los problemas esperados, nada más.
  • else se ejecuta si no se lanzó nada; finally siempre.
  • raise ValueError("message") rechaza con claridad una entrada inválida.

A continuación: módulos e importaciones, cómo reutilizar código de la biblioteca estándar y de tus propios archivos.

Lab: qué se califica

  • Convertir texto sin fallar con safe_float25 pts
  • Rechazar un precio inválido con parse_price25 pts
  • Saltar las entradas inválidas con first_valid_price25 pts
  • Manejar un archivo ausente o dañado con read_quantity25 pts
Explorador · lab-19-1
▾ lab-19-1
…
bash · en el navegador
learner@quantcraft:~/lab-19-1$
Python aún no cargadoPythonLn 1, Col 1Spaces: 4UTF-8

¿Restablecer este tema?

Todo lo que hay en lab-19-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