← Volver al Portafolio

Reportes Financieros Automatizados - Atrium

Data Analyst & Python Developer

Pipeline automatizado de inversiones: Arquitectura SQL, modelado de riesgo financiero con Python (Pandas) y visualización en Power BI.

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.

-- 1. Definición del Esquema (DDL) para Activos Financieros CREATE TABLE Activos ( Ticker VARCHAR(10) PRIMARY KEY, Nombre_Activo VARCHAR(100), Tipo VARCHAR(50), -- Accion, Bono, ETF Sector VARCHAR(50), Estado VARCHAR(20) DEFAULT 'Activo' ); -- 2. Vista Analítica: Unificación y Filtrado -- Utilizamos funciones de ventana para preparar datos previos CREATE VIEW vw_Cotizaciones_Ready AS SELECT A.Ticker, A.Nombre_Activo, A.Tipo, C.Fecha, C.Precio_Cierre, C.Volumen, -- Obtenemos el precio del día anterior para validar consistencia 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 # --- 1. Conexión Segura a Base de Datos --- 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}") # --- 2. Feature Engineering (Cálculo de Métricas) --- # Cálculo de Retorno Logarítmico Diario df['Retorno_Log'] = np.log(df['Precio_Cierre'] / df['Precio_Cierre'].shift(1)) # Cálculo de Volatilidad (Desviación Estándar Anualizada - 252 días) riesgo = df.groupby('Ticker')['Retorno_Log'].std() * np.sqrt(252) # Cálculo de Media Móvil Exponencial (EMA 30 días) para detectar tendencias df['EMA_30'] = df.groupby('Ticker')['Precio_Cierre'].transform(lambda x: x.ewm(span=30).mean()) # --- 3. Limpieza y Exportación --- df_final = df.dropna() # Eliminamos valores nulos generados por el lag 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).

-- 1. Valor de Mercado (Mark-to-Market) -- Multiplica la posición actual por el último precio de cierre disponible Valor de Mercado = SUMX( Portafolio, Portafolio[Cantidad] * RELATED(Cotizaciones[Precio_Cierre]) ) -- 2. Clasificación Dinámica de Perfil de Riesgo Perfil Riesgo = SWITCH( TRUE(), 'Activos'[Tipo] = "Bono", "Conservador 🛡️", 'Activos'[Tipo] = "ETF", "Moderado ⚖️", 'Activos'[Tipo] = "Accion", "Agresivo 🚀", "Sin Clasificar" ) -- 3. Rendimiento % (Profit & Loss) 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.

Dashboard Fondos Atrium