7. Visualizar datos con matplotlib: tu primer gráfico de precios
Nivel 2: Python desde Cero para Finanzas
Un número suelto casi nunca cuenta la historia completa; un gráfico, casi siempre. Matplotlib es la librería estándar de Python para crear gráficos, y aunque tiene una interfaz rápida al estilo MATLAB, la forma recomendada de usarla — sobre todo en cuanto tu código empieza a crecer — es su interfaz orientada a objetos.
import matplotlib.pyplot as plt
import numpy as np
dias = np.arange(0, 30)
precios = 180 + np.cumsum(np.random.randn(30)) # simulacion simple de una caminata aleatoria de preciosLa idea central de la interfaz orientada a objetos es que, en vez de dibujar sobre un estado global implícito, creas explícitamente un objeto Figure (el lienzo completo) y uno o más objetos Axes (los ejes donde realmente se dibuja), y llamas a métodos sobre ellos. La forma más práctica de crear ambos a la vez es plt.subplots():
fig, ax = plt.subplots(figsize=(10, 5))
ax.plot(dias, precios, color="tab:blue", label="Precio simulado")
ax.set_xlabel("Dia")
ax.set_ylabel("Precio")
ax.set_title("Evolucion de precio simulada")
ax.legend()
plt.show()Esta forma explícita — trabajar sobre fig y ax en vez de sobre funciones sueltas como plot() a secas — se vuelve imprescindible en cuanto necesitas más de un gráfico en la misma figura, algo habitual cuando comparas varios activos o varias métricas a la vez:
fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(14, 5))
axes[0].plot(dias, precios, color="tab:blue")
axes[0].set_title("Precio")
retornos = np.diff(precios) / precios[:-1]
axes[1].plot(dias[1:], retornos, color="tab:red")
axes[1].set_title("Retorno diario")
fig.tight_layout()
plt.show()Cuando defines más de una serie en el mismo gráfico, usar el argumento label en cada plot() y luego llamar a ax.legend() sin argumentos es más robusto que pasar los nombres a mano en legend(): si más adelante añades o quitas una serie, la leyenda se actualiza sola en vez de desincronizarse.
fig, ax = plt.subplots(figsize=(10, 5))
ax.plot(dias, precios, label="Estrategia A")
ax.plot(dias, precios * 1.02, label="Estrategia B") # ejemplo ilustrativo
ax.legend(loc=0) # loc=0 deja que matplotlib elija la mejor posicion automaticamente
plt.show()Y para guardar el resultado en un archivo, en vez de solo mostrarlo en pantalla, el método es savefig sobre el objeto fig, no sobre plt:
fig.savefig("evolucion_precio.png", dpi=200)Con esto ya tienes lo esencial para pasar de una lista de números a un gráfico legible — que es, en la práctica, el primer paso de cualquier análisis exploratorio antes de construir una sola estrategia.