⚠ El trading implica un riesgo significativo de pérdida. Todo el contenido de este sitio es únicamente educativo y no constituye asesoramiento financiero.
Lección 2 de 13 · Gratis

Lo esencial de Python para finanzas en una sesión: tipos de datos, listas, diccionarios, bucles, funciones y mensajes de error

Aprende el mínimo de Python básico que necesita un trader: números, cadenas, listas, diccionarios, bucles, funciones y cómo leer un traceback.

Autor: Moustafa HijaziContenido revisado: 2026-10-306 min de lecturaCurso de autoaprendizaje

Qué aprenderás

  • Los tipos de datos que encontrarás en los datos de precios: int, float, str, bool, None y datetime.
  • Cómo almacenan una lista de operaciones las listas y los diccionarios, y cómo la procesa un bucle for.
  • Cómo escribir una función con un docstring y un argumento por defecto, y por qué las funciones hacen que los backtests se puedan probar.
  • Cómo leer un traceback de Python de abajo arriba y corregir los cinco errores más comunes.

Explicación

Tipos. Todo valor en Python tiene un tipo. 42 es un int (número entero), 42.5 un float (número decimal almacenado en binario), "AAPL" un str (texto), True un bool, y None significa «sin valor». Los floats son aproximados (0.1 + 0.2 imprime 0.30000000000000004), así que nunca los compares con ==; usa round() o una tolerancia. Para las fechas, usa los timestamps de pandas (lección 3).

Las listas son colecciones ordenadas que se escriben entre corchetes: closes = [100.0, 102.0, 101.5]. La indexación empieza en cero (closes[0] es 100.0), los índices negativos cuentan desde el final (closes[-1] es el último cierre) y el slicing (troceado) closes[1:3] devuelve los elementos 1 y 2, pero no el 3. La misma regla de excluir el final se aplica a iloc en pandas.

Los diccionarios asignan valores a claves: trade = {"symbol": "AAA", "entry": 50.0, "qty": 100}. Se accede con trade["entry"]; una clave inexistente lanza KeyError, mientras que trade.get("fee", 0.0) devuelve un valor por defecto.

Bucles y condiciones. Un bucle for recorre cada elemento: for t in trades: seguido de un bloque sangrado. La sangría (cuatro espacios) define el bloque. if, elif y else ramifican según condiciones, y los operadores de comparación son ==, !=, <, >=.

Las funciones empaquetan la lógica para que pueda reutilizarse y probarse. La palabra clave def inicia una definición, los parámetros van entre paréntesis y return devuelve un valor:

def r_multiple(entry, exit_price, stop, side="long"):

'''Devuelve el beneficio en unidades de riesgo inicial (R).'''

risk = abs(entry - stop)

pnl = exit_price - entry if side == "long" else entry - exit_price

return pnl / risk

La cadena entre comillas triples es un docstring (documentación) y side="long" es un argumento por defecto. Mantén las funciones pequeñas, explícitas en sus entradas y libres de efectos secundarios; eso es lo que permite someterlas a pruebas unitarias en la lección 9.

Leer errores. Cuando algo falla, Python imprime un traceback. Lee primero la última línea: indica el tipo de error y el mensaje. Después mira la línea justo encima, que muestra en qué parte de tu código ocurrió. Los errores más comunes: NameError (usaste una variable antes de definirla, a menudo porque no se ejecutó una celda del notebook); TypeError (por ejemplo, sumar una cadena de un archivo CSV a un número; se corrige con float()); KeyError (una columna o clave de diccionario está escrita de otra forma; revisa espacios y mayúsculas); IndexError (pediste el elemento 10 de una lista con 10 elementos; recuerda que la indexación empieza en cero); y ZeroDivisionError (un stop igual a la entrada da un riesgo de cero).

Ejemplo práctico

Ejemplo hipotético: tres operaciones largas cerradas, todas en euros, sin comisiones ni impuestos.

trades = [

{"symbol": "AAA", "entry": 50.0, "exit": 53.0, "stop": 48.0, "qty": 100},

{"symbol": "BBB", "entry": 20.0, "exit": 19.0, "stop": 19.0, "qty": 250},

{"symbol": "CCC", "entry": 80.0, "exit": 78.0, "stop": 76.0, "qty": 60},

]

total = 0.0

for t in trades:

pnl = (t["exit"] - t["entry"]) * t["qty"]

r = r_multiple(t["entry"], t["exit"], t["stop"])

total += pnl

print(t["symbol"], pnl, round(r, 2))

print("Total:", total)

Beneficio de AAA = (53 − 50) × 100 = €300; riesgo por acción €2, así que R = 3 ÷ 2 = 1.5. BBB = (19 − 20) × 250 = −€250; riesgo de €1 por acción, R = −1.0 (salida exacta en el stop). CCC = (78 − 80) × 60 = −€120; riesgo de €4, R = −0.5. Total = 300 − 250 − 120 = −€70. Líneas de salida: AAA 300.0 1.5, BBB -250.0 -1.0, CCC -120.0 -0.5, Total: -70.0.

total += pnl es una forma abreviada de total = total + pnl. Tres operaciones no dicen nada sobre un método; lo importante es la mecánica.

Error frecuente

Ejecutar las celdas del notebook fuera de ordenLos notebooks ejecutan las celdas en cualquier orden. Si editas la lista trades y vuelves a ejecutar solo la celda del bucle, un valor obsoleto alimenta en silencio el resultado; tras reiniciar el kernel, en cambio, obtienes NameError. Antes de fiarte de cualquier número, usa «Restart Kernel and Run All Cells» (reiniciar el kernel y ejecutar todas las celdas) y asegúrate de que se ejecuta de principio a fin sin errores.

Actividad práctica

En papel, escribe una función position_size(account, risk_pct, entry, stop) que devuelva el número entero de acciones (redondeando hacia abajo) y lance un ValueError claro si el stop es igual a la entrada. Después escribe el resultado para una cuenta de €8,000, riesgo del 1.25%, entrada en €32.50 y stop en €30.00. Por último, indica qué tipo de error lanzaría Python si llamaras a la función con entry="32.50" (una cadena) sin convertirla.

Mostrar solución

def position_size(account, risk_pct, entry, stop):

per_share = abs(entry - stop)

if per_share == 0:

raise ValueError("el stop debe ser distinto de la entrada")

return int(account * risk_pct // per_share)

Cifras: presupuesto de riesgo = 8,000 × 0.0125 = €100; riesgo por acción = 32.50 − 30.00 = €2.50; 100 ÷ 2.50 = exactamente 40 acciones, así que la función devuelve 40 (riesgo planificado €100, valor de la posición €1,300).

Con entry="32.50", la expresión "32.50" - 30.0 lanza TypeError: unsupported operand type(s) for -: 'str' and 'float'. Conviértela con float(entry).

Limitaciones: la función ignora los tamaños mínimos de lote, las comisiones y el hecho de que un gap puede hacer perder más de los €100 planificados.

Ideas clave

  • Los floats son aproximados, la indexación empieza en cero y los slices excluyen el final; estos tres hechos evitan la mayoría de los errores de principiante.
  • Una lista de diccionarios es la forma natural de representar operaciones antes de pandas; los bucles la procesan y las funciones le dan lógica reutilizable.
  • Escribe funciones pequeñas y puras con docstrings; son las unidades que probarás en la lección 9.
  • Lee los tracebacks de abajo arriba, y reinicia y ejecuta todo antes de fiarte del resultado de un notebook.

Siguiente paso

La lección 3 presenta pandas: Series, DataFrames, el DatetimeIndex, cómo seleccionar y filtrar filas, y cómo convertir barras diarias en semanales con resample.

Autoevaluación

Responde a las preguntas y luego comprueba tus respuestas. Puedes volver a intentarlo tantas veces como quieras.

1. Dado closes = [100.0, 102.0, 101.5, 103.0], ¿qué devuelve closes[1:3]?

2. Un bucle sobre una lista de operaciones falla con KeyError: 'Exit'. ¿Cuál es la causa y la solución más probables?

3. Usando la función r_multiple de la lección para una operación corta: entrada en €40.00, stop en €42.00, salida en €35.00. ¿Qué devuelve?

Autoevaluación automática para tu propio repaso. Tus respuestas se comprueban en tu navegador y no las vemos ni evaluamos. No es un examen ni una titulación.

Tu progreso

«Completada» solo significa que marcaste la lección como terminada. No es una prueba de tu comprensión. El progreso y las notas se guardan solo en este navegador y en este dispositivo, no en una cuenta.