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

Argumentos de funciones y valores por defecto

Posición en la rutaMódulo 1 de 11 · Tema 9 de 33
1.9 Argumentos de funciones y valores por defecto
—Puntuación del lab— / 100XP total—Racha—

Por posición o por nombre

Los argumentos se pueden pasar por posición (emparejados con los parámetros en orden) o por nombre (quantity=200). Los nombres hacen legible una llamada cuando una función tiene varias entradas del mismo tipo y permiten pasar los argumentos en cualquier orden. Los argumentos posicionales van primero; una vez que usas un nombre, el resto también debe llevar nombre.

def pnl(entry, exit_price, quantity):
    return (exit_price - entry) * quantity

print(pnl(184.0, 185.5, 200))                            # 300.0
print(pnl(quantity=200, entry=184.0, exit_price=185.5))  # 300.0

Los valores por defecto hacen opcionales los parámetros

Escribe name=value en la línea def y quien llama puede omitir ese argumento; se usa el valor por defecto. Los parámetros con valor por defecto van después de los que no lo tienen. Los valores por defecto sirven para ajustes que casi siempre son iguales, como una tarifa o un mínimo, y cualquiera puede sustituirse por su nombre.

# Parameters with a default are optional
def fee(notional, rate=0.001, minimum=1.0):
    return max(minimum, notional * rate)

print(fee(36850.0))                # 36.85
print(fee(36850.0, rate=0.0005))   # 18.425
print(fee(100.0, minimum=0.5))     # 0.5

Cualquier número de argumentos: *args

Un parámetro escrito *prices reúne todos los argumentos posicionales adicionales en una tupla, así que average(1, 2, 3) y average(1, 2, 3, 4, 5) funcionan. Lo contrario ocurre en la llamada: average(*quotes) desempaqueta una lista en argumentos separados.

# *prices collects the extra arguments into a tuple
def average(*prices):
    return sum(prices) / len(prices)

print(average(184.0, 185.0, 186.0))  # 185.0
quotes = [184.0, 185.0]
print(average(*quotes))              # 184.5

Opciones con nombre cualesquiera: **options

Del mismo modo, **options reúne los argumentos con nombre adicionales en un diccionario de nombres y valores (los diccionarios tendrán pronto su propio tema). Sirve para funciones que aceptan extras opcionales, como los ajustes de una orden. sorted(options) da los nombres en orden alfabético, de modo que la salida es predecible.

# **options collects extra named arguments into a dictionary
def describe(symbol, **options):
    text = symbol
    for name in sorted(options):
        text += f" {name}={options[name]}"
    return text

print(describe("AAPL", tif="day", limit=184.5))  # AAPL limit=184.5 tif=day

La trampa del valor por defecto mutable

Un valor por defecto se crea una sola vez, cuando se define la función, no en cada llamada. Con un número o un texto es inofensivo. Con una lista, todas las llamadas que usan el valor por defecto comparten y cambian la misma lista. La solución habitual es usar None por defecto y crear una lista nueva dentro de la función.

# A default list is created once and shared by every call
def add_fill(fill, fills=[]):
    fills.append(fill)
    return fills

print(add_fill(100))  # [100]
print(add_fill(200))  # [100, 200]   <- surprise: the same list

# The fix: default to None and build a new list inside
def add_fill_fixed(fill, fills=None):
    if fills is None:
        fills = []
    fills.append(fill)
    return fills

print(add_fill_fixed(100))  # [100]
print(add_fill_fixed(200))  # [200]
Mantén la llamada y la definición alineadasDar un valor por defecto a un parámetro cambia el significado de una llamada corta, así que elige valores que te alegre ver aplicados en silencio. Si un valor debe elegirlo de verdad quien llama, déjalo sin valor por defecto: Python avisará del argumento que falta en lugar de adivinar.
  • Usa nombres en las llamadas con varias entradas del mismo tipo.
  • Valores por defecto para ajustes casi siempre iguales; nunca una lista o diccionario.
  • *args para cualquier número de valores, **options para extras con nombre.

A continuación: ámbito y clausuras, para ver qué nombres puede ver una función y cómo puede recordar valores.

Lab: qué se califica

  • Hacer opcionales la cantidad y el lado con position_pnl25 pts
  • Aceptar cualquier número de precios con average25 pts
  • Recibir opciones de orden con nombre mediante describe_order25 pts
  • Evitar la trampa de la lista compartida con add_fill25 pts
Explorador · lab-9-1
▾ lab-9-1
…
bash · en el navegador
learner@quantcraft:~/lab-9-1$
Python aún no cargadoPythonLn 1, Col 1Spaces: 4UTF-8

¿Restablecer este tema?

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