El Problema
El equipo de Portfolio Management descargaba manualmente archivos CSV de múltiples fuentes (Bloomberg/Yahoo) y realizaba cálculos de riesgo en hojas de Excel inestables. Esto generaba retrasos en la información y errores humanos en la valuación de la cartera.
La Solución
Se implementó un Pipeline de Datos Automatizado. Los precios se almacenan en SQL Server, un script de Python se ejecuta diariamente para calcular volatilidad y medias móviles, y Power BI muestra los resultados actualizados para la toma de decisiones.
Stack Técnico
- 🗄️ SQL Server: Diseño de esquema (Star Schema) y Vistas.
- 🐍 Python (Pandas): ETL y Algoritmos Financieros.
- 📊 Power BI: Modelado de datos y Dashboard Financiero.
Impacto en el Negocio
100%
Automatización
-4 hrs
Ahorro Diario
Real-Time
Valuación de Riesgo
Ingeniería de Datos en SQL
Diseño del esquema de base de datos y creación de vistas analíticas para pre-procesar la información antes de Python.
CREATE TABLE Activos (
Ticker VARCHAR(10) PRIMARY KEY,
Nombre_Activo VARCHAR(100),
Tipo VARCHAR(50),
Sector VARCHAR(50),
Estado VARCHAR(20) DEFAULT 'Activo'
);
CREATE VIEW vw_Cotizaciones_Ready AS
SELECT
A.Ticker,
A.Nombre_Activo,
A.Tipo,
C.Fecha,
C.Precio_Cierre,
C.Volumen,
LAG(C.Precio_Cierre, 1) OVER (PARTITION BY A.Ticker ORDER BY C.Fecha) AS Precio_Anterior
FROM Activos A
INNER JOIN Cotizaciones C ON A.Ticker = C.Ticker
WHERE A.Estado = 'Activo'
AND C.Fecha >= '2023-01-01';
Procesamiento Avanzado con Python
Script ETL que conecta a SQL, limpia outliers y calcula métricas complejas (Volatilidad Anualizada y Media Móvil Exponencial).
import pandas as pd
import numpy as np
import pyodbc
conn_str = 'DRIVER={SQL Server};SERVER=srv_finanzas;DATABASE=AtriumDB;Trusted_Connection=yes;'
query = "SELECT * FROM vw_Cotizaciones_Ready ORDER BY Fecha ASC"
try:
with pyodbc.connect(conn_str) as conn:
df = pd.read_sql(query, conn)
except Exception as e:
print(f"Error de conexión: {e}")
df['Retorno_Log'] = np.log(df['Precio_Cierre'] / df['Precio_Cierre'].shift(1))
riesgo = df.groupby('Ticker')['Retorno_Log'].std() * np.sqrt(252)
df['EMA_30'] = df.groupby('Ticker')['Precio_Cierre'].transform(lambda x: x.ewm(span=30).mean())
df_final = df.dropna()
print(f"Procesados {len(df_final)} registros. Volatilidad Media: {riesgo.mean():.2%}")
Métricas Financieras en Power BI
El modelo tabular utiliza medidas DAX para realizar valuaciones de mercado en tiempo real (Mark-to-Market).
Valor de Mercado =
SUMX(
Portafolio,
Portafolio[Cantidad] * RELATED(Cotizaciones[Precio_Cierre])
)
Perfil Riesgo = SWITCH(
TRUE(),
'Activos'[Tipo] = "Bono", "Conservador 🛡️",
'Activos'[Tipo] = "ETF", "Moderado ⚖️",
'Activos'[Tipo] = "Accion", "Agresivo 🚀",
"Sin Clasificar"
)
Rendimiento % =
DIVIDE([Valor de Mercado] - [Costo Total], [Costo Total], 0)
Dashboard Final
El resultado final es un tablero interactivo tipo "Bloomberg Terminal" con modo oscuro.