σμ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.10·~40 minPrincipiante

Ámbito y clausuras

Posición en la rutaMódulo 1 de 11 · Tema 10 de 33
1.10 Ámbito y clausuras
—Puntuación del lab— / 100XP total—Racha—

Dónde vive un nombre

El ámbito de un nombre es la parte del programa donde se puede usar. Un nombre creado dentro de una función es local: existe solo mientras esa función se ejecuta y es invisible fuera. Un nombre creado en el nivel superior del archivo es global: las funciones pueden leerlo. Cuando Python encuentra un nombre, busca primero en la función, luego en cualquier función envolvente, luego en el archivo y por último en los predefinidos.

rate = 0.001            # global: defined outside any function

def fee(notional):
    minimum = 1.0       # local: exists only during the call
    return max(minimum, notional * rate)

print(fee(36850.0))     # 36.85
# print(minimum)        # would raise NameError: minimum is not defined

Asignar crea un nombre local

Leer un global desde dentro de una función no es problema. Pero asignar a un nombre dentro de una función crea un nombre local nuevo, aunque exista un global con el mismo nombre: el global queda intacto. Eso protege tus datos, y es también la razón de que cambiar un estado global desde una función requiera palabras extra (global) que rara vez deberías necesitar. Pasa los valores como argumentos y devuelve los resultados con return.

# Assigning inside a function makes a new local name
balance = 1000

def deposit(amount):
    balance = amount     # a different, local balance
    return balance

print(deposit(50))  # 50
print(balance)      # 1000 (the global one is unchanged)

Funciones que crean funciones

Una función puede definir otra dentro de sí misma y devolverla con return. La función interna conserva el acceso a las variables de la externa, incluso después de que esta termine. Ese conjunto de una función y los valores que recuerda es una clausura (closure). Es una forma limpia de construir una herramienta a partir de ajustes: una calculadora para acciones y otra para ETF.

# A closure remembers the variables of the function that made it
def make_fee_calculator(rate, minimum):
    def fee(notional):
        return max(minimum, notional * rate)
    return fee

stock_fee = make_fee_calculator(0.001, 1.0)
etf_fee = make_fee_calculator(0.0005, 0.5)
print(stock_fee(36850.0))  # 36.85
print(etf_fee(36850.0))    # 18.425

Estado que vive entre llamadas: nonlocal

Una clausura también puede cambiar lo que recuerda. Como asignar crearía un nombre local nuevo, la función interna declara antes nonlocal count: «este nombre pertenece a la función envolvente». Cada llamada de la función externa crea su propia memoria, así que dos contadores nunca interfieren. Así un generador de identificadores de órdenes o una media móvil guarda su estado sin ninguna variable global.

# nonlocal lets the inner function rebind the outer variable
def make_counter():
    count = 0
    def next_id():
        nonlocal count
        count += 1
        return count
    return next_id

order_ids = make_counter()
print(order_ids(), order_ids(), order_ids())  # 1 2 3
other = make_counter()
print(other())                                # 1 (its own count)
# State between calls: an exponential moving average
def make_ema(alpha):
    value = None
    def update(price):
        nonlocal value
        value = price if value is None else alpha * price + (1 - alpha) * value
        return value
    return update

ema = make_ema(0.5)
print(ema(100.0), ema(110.0), ema(110.0))  # 100.0 105.0 107.5
Una clausura guarda la variable, no una copiaLa función interna busca la variable cuando se ejecuta, así que ve el último valor. Eso hace funcionar al contador y a la media, y también explica por qué una clausura creada dentro de un bucle ve el valor final de la variable del bucle, salvo que la pases como argumento o valor por defecto.
  • Dentro de una función, los nombres que asignas son locales; pasa los datos y devuélvelos con return.
  • Una función que construye y devuelve una función convierte ajustes en una herramienta.
  • Usa nonlocal para el estado que debe sobrevivir entre llamadas, una memoria por clausura.

A continuación: comprensiones de listas, para construir una lista nueva a partir de otra en una sola línea legible.

Lab: qué se califica

  • Construir un contador que recuerde su cuenta con make_counter25 pts
  • Empaquetar ajustes de comisión en una función con make_fee_calculator25 pts
  • Mantener una media móvil entre llamadas con make_ema25 pts
  • Crear una comprobación de precio a partir de un límite con make_limit_checker25 pts
Explorador · lab-10-1
▾ lab-10-1
…
bash · en el navegador
learner@quantcraft:~/lab-10-1$
Python aún no cargadoPythonLn 1, Col 1Spaces: 4UTF-8

¿Restablecer este tema?

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