Financiero Documentación
Visión general
Punto de equilibrio, VPN, Monte Carlo, cascada de ingresos y desempeño de ventas.
Esta referencia cubre 6 engines. Cada endpoint trae ruta, permiso, parámetros, respuesta y los errores posibles.
Punto de equilibrio
Propósito
Análisis de punto de equilibrio: BEP en unidades/ingresos, margen de contribución, margen de seguridad, DOL y sensibilidad.
¿Por qué? Use este engine para responder objetivamente cuánto hay que vender para no perder dinero y qué tan cerca de eso está la operación. Calcula el punto de equilibrio en unidades y en ingresos, el margen de contribución por unidad y su porcentaje, y, cuando se informa actual_units_sold, el margen de seguridad y el grado de apalancamiento operativo (GAO). Opera en modo producto único o multiproducto y completa el análisis con sensibilidad a variaciones de +/-10% y +/-20% y una curva volumen-utilidad de 10 puntos.
¿Cómo? El margen de contribución es el precio unitario menos el costo variable unitario; el punto de equilibrio en unidades divide los costos fijos por ese margen (redondeando hacia arriba) y el punto de equilibrio en ingresos divide los costos fijos por el índice de margen de contribución. El margen de seguridad mide la distancia porcentual entre los ingresos reales y los ingresos de equilibrio, y el GAO relaciona la contribución total con la utilidad operativa. La sensibilidad recalcula el punto de equilibrio variando precio, costos fijos y costos variables en +/-10% y +/-20%. Exige un precio unitario mayor que el costo variable unitario.
Origen El análisis costo-volumen-utilidad fue introducido por Rautenstrauch (1930, The Successful Control of Profits) y está consolidado en la contabilidad gerencial por Horngren, Datar y Rajan (2018, Cost Accounting: A Managerial Emphasis).
Literatura de referencia
- Horngren, C. T., Datar, S. M. & Rajan, M. V. (2018). "Cost Accounting: A Managerial Emphasis." 16th ed., Pearson.
- Rautenstrauch, W. (1930). "The Successful Control of Profits."
Parámetros (params)
| Campo | Tipo | Obligatorio | Por defecto | Descripción |
|---|---|---|---|---|
fixed_costs | number | sí | Costos fijos totales del período. Obligatorio en modo de producto único (cuando data no tiene columna fixed_costs). | |
variable_cost_per_unit | number | sí | Costo variable por unidad producida/vendida. Obligatorio en modo de producto único. | |
price_per_unit | number | sí | Precio de venta por unidad. Debe ser mayor que variable_cost_per_unit. Obligatorio en modo de producto único. | |
actual_units_sold | number | no | Unidades efectivamente vendidas; cuando está presente, habilita margin_of_safety_pct y degree_of_operating_leverage (dol) en el resultado. |
Columnas de data[]
| Columna | Tipo | Obligatoria | Descripción |
|---|---|---|---|
product_id | string | no | Identificador de la fila en modo multi-producto. La presencia de esta columna junto a fixed_costs/variable_cost_per_unit/price_per_unit activa el análisis de portafolio por producto. |
product_name | string | no | Nombre de exhibición opcional del producto, retornado por fila en modo multi-producto. |
fixed_costs | number | no | Costos fijos por producto (solo modo multi-producto). |
variable_cost_per_unit | number | no | Costo variable por unidad por producto (solo modo multi-producto). |
price_per_unit | number | no | Precio de venta por unidad por producto (solo modo multi-producto). |
actual_units_sold | number | no | Unidades efectivamente vendidas por producto (solo modo multi-producto). |
Respuesta
En modo asíncrono (por defecto), 202 Accepted con {"process_uuid", "result_url"}; el resultado sale en GET /api/v1/results/{process_uuid}. Con ?sync=true o ?dry_run=true la respuesta es 200 con el resultado inline (y 504 con el process_uuid si el worker no responde a tiempo).
Errores
403- la engine no está enallowed_enginesde tu suscripción.413- subida por encima demax_upload_mb.422- engine desconocida o inactiva en el catálogo.429- cuota diaria (max_jobs_per_day) o por minuto excedida.
La validación es fail-fast: un envío rechazado no tiene ningún efecto secundario.
curl -X POST "https://intelligence.echosistema.live/api/v1/break_even/process?dry_run=true&playground=true" \
-H "X-TENANT-KEY: $TENANT_KEY"Monte Carlo (VAN)
Propósito
Simulación Monte Carlo de VAN: distribución probabilística de VAN y TIR con VaR/CVaR y percentiles.
¿Por qué? Use este engine para evaluar no solo el retorno esperado de una inversión con flujos de caja inciertos, sino el riesgo real de que salga mal. Simulando cientos de miles de escenarios, entrega las distribuciones de VAN y TIR: media, desviación estándar, percentiles, histograma y, en cada nivel de confianza pedido, VaR y CVaR. Con semilla configurable, los resultados son reproducibles.
¿Cómo? En cada simulación y cada período se muestrea un flujo de caja de la distribución de ese período, y el VAN del escenario es la inversión inicial más la suma de los flujos descontados a la tasa indicada. Tras N simulaciones agrega media, desviación estándar, percentiles e histograma; para cada nivel de confianza, el VaR es el percentil correspondiente a la cola mala y el CVaR es la media de los escenarios más allá de él. La TIR sale por bisección y, por encima de 10000 escenarios, sobre una submuestra de ese tamaño: los escenarios en que ninguna tasa anula el VAN quedan fuera, y cuando no queda ninguno la TIR media vuelve en cero. La semilla hace determinista la secuencia, así que la misma entrada devuelve el mismo resultado.
Origen El método de Monte Carlo fue formalizado por Metropolis y Ulam (1949, Journal of the American Statistical Association); su aplicación al análisis de riesgo de inversión viene de Hertz (1964, Harvard Business Review).
Literatura de referencia
- Metropolis, N. & Ulam, S. (1949). "The Monte Carlo Method." Journal of the American Statistical Association, 44(247), 335-341.
- Hertz, D. B. (1964). "Risk Analysis in Capital Investment." Harvard Business Review.
Parámetros (params)
| Campo | Tipo | Obligatorio | Por defecto | Descripción |
|---|---|---|---|---|
simulations | integer | no | 100000 | Número de iteraciones Monte Carlo; la grafía anterior de n_simulations. Entero positivo, como máximo 10000000. Un valor mayor se rechaza, no se recorta al tope. |
seed | integer | no | 42 | Semilla del generador aleatorio; la grafía anterior de random_state. Entero no negativo; entradas y semilla idénticas reproducen resultados idénticos. |
distribution | string | no | "normal" | Una distribución de muestreo para todos los períodos: "normal", "uniform", "triangular" o "lognormal". Un valor no reconocido se rechaza, no se reemplaza por el predeterminado. Se ignora cuando los datos traen su propia columna distribution. Note que "lognormal" cambia cómo se leen cash_flow_mean y cash_flow_std, vea esas columnas. |
initial_investment | number | no | 0 | Inversión inicial, normalmente negativa (la salida del período 0). Omitirla significa 0.0 en este envelope, que es lo que hacía el engine anterior; en monte_carlo_deep la misma omisión es error. |
discount_rate | number | no | 0.12 | Tasa de descuento aplicada por período. Debe ser un número positivo. |
mode | string | no | "npv" | Modo de simulación. Solo se admite "npv". |
confidence_levels | array | no | [0.8,0.9,0.95,0.99] | Niveles de confianza, cada uno estrictamente entre 0 y 1, en los que se calculan VaR y CVaR. |
Columnas de data[]
| Columna | Tipo | Obligatoria | Descripción |
|---|---|---|---|
period | integer | sí | Número positivo del período, usado como exponente de descuento. |
cash_flow_mean | number | no | Flujo de caja esperado del período. Obligatorio cuando la distribución del período es "normal" o "lognormal"; "normal" es la predeterminada. Bajo "lognormal" esto no es un flujo de caja en moneda, sino el mu de ln(X), así que un valor superior a 100 se rechaza en vez de muestrearse: una cifra en moneda ahí desbordaría la escala. |
cash_flow_std | number | no | Desviación estándar del flujo de caja del período; debe ser mayor que 0. Obligatorio cuando la distribución del período es "normal" o "lognormal". Bajo "lognormal" es el sigma de ln(X), en la misma escala logarítmica de cash_flow_mean. |
cash_flow_min | number | no | Menor flujo de caja del período; debe ser menor que cash_flow_max. Obligatorio cuando la distribución del período es "uniform" o "triangular". |
cash_flow_max | number | no | Mayor flujo de caja del período; debe ser mayor que cash_flow_min. Obligatorio cuando la distribución del período es "uniform" o "triangular". |
cash_flow_mode | number | no | Flujo de caja más probable del período; debe cumplir cash_flow_min <= cash_flow_mode <= cash_flow_max. Obligatorio cuando la distribución del período es "triangular". |
distribution | string | no | Distribución de muestreo solo de este período: "normal", "uniform", "triangular" o "lognormal". Cuando esta columna está presente, el parámetro distribution se ignora y cada período elige la suya. |
Respuesta
En modo asíncrono (por defecto), 202 Accepted con {"process_uuid", "result_url"}; el resultado sale en GET /api/v1/results/{process_uuid}. Con ?sync=true o ?dry_run=true la respuesta es 200 con el resultado inline (y 504 con el process_uuid si el worker no responde a tiempo).
Errores
403- la engine no está enallowed_enginesde tu suscripción.413- subida por encima demax_upload_mb.422- engine desconocida o inactiva en el catálogo.429- cuota diaria (max_jobs_per_day) o por minuto excedida.
La validación es fail-fast: un envío rechazado no tiene ningún efecto secundario.
curl -X POST "https://intelligence.echosistema.live/api/v1/monte_carlo/process?dry_run=true&playground=true" \
-H "X-TENANT-KEY: $TENANT_KEY"Monte Carlo (profundo)
Propósito
Simulación Monte Carlo de VPN/TIR a gran escala con aceleración dedicada (fallback en CPU).
Simulación Monte Carlo masivamente paralela de VPN y TIR sobre distribuciones de flujo de caja por período (normal, uniforme, triangular o lognormal), ejecutada con aceleración dedicada y fallback automático en CPU. Devuelve las distribuciones de VPN/TIR, percentiles, un histograma y VaR/CVaR en cada nivel de confianza pedido.
Parámetros (params)
| Campo | Tipo | Obligatorio | Por defecto | Descripción |
|---|---|---|---|---|
initial_investment | number | sí | Monto de la inversión inicial, típicamente negativo (salida en el período 0). | |
mode | string | no | "npv" | Modo de simulación. Solo "npv" está soportado por ahora. |
n_simulations | integer | no | 100000 | Número de iteraciones Monte Carlo. Entero positivo <= 10.000.000. |
discount_rate | number | no | 0.12 | Tasa de descuento usada en el cálculo del VPN. Número positivo. |
confidence_levels | array | no | [0.8,0.9,0.95,0.99] | Lista de niveles de confianza (cada uno estrictamente entre 0 y 1) para los cuales se calculan VaR/CVaR. |
random_state | integer | no | 42 | Semilla del RNG; entero no negativo, reproduce resultados idénticos para entradas idénticas. |
Columnas de data[]
| Columna | Tipo | Obligatoria | Descripción |
|---|---|---|---|
period | integer | sí | Número positivo del período de la fila de flujo de caja. |
distribution | string | sí | Distribución de muestreo del flujo de caja de este período: "normal", "uniform", "triangular" o "lognormal". |
mean | number | no | Flujo de caja medio del período. Obligatorio cuando distribution es "normal" o "lognormal". |
std | number | no | Desviación estándar del flujo de caja. Obligatoria (y > 0) cuando distribution es "normal" o "lognormal". |
min | number | no | Flujo de caja mínimo. Obligatorio cuando distribution es "uniform" o "triangular"; debe ser menor que max. |
max | number | no | Flujo de caja máximo. Obligatorio cuando distribution es "uniform" o "triangular"; debe ser mayor que min. |
mode | number | no | Flujo de caja más probable. Obligatorio cuando distribution es "triangular"; debe cumplir min <= mode <= max. |
Respuesta
En modo asíncrono (por defecto), 202 Accepted con {"process_uuid", "result_url"}; el resultado sale en GET /api/v1/results/{process_uuid}. Con ?sync=true o ?dry_run=true la respuesta es 200 con el resultado inline (y 504 con el process_uuid si el worker no responde a tiempo).
Errores
403- la engine no está enallowed_enginesde tu suscripción.413- subida por encima demax_upload_mb.422- engine desconocida o inactiva en el catálogo.429- cuota diaria (max_jobs_per_day) o por minuto excedida.
La validación es fail-fast: un envío rechazado no tiene ningún efecto secundario.
curl -X POST "https://intelligence.echosistema.live/api/v1/monte_carlo_deep/process?dry_run=true&playground=true" \
-H "X-TENANT-KEY: $TENANT_KEY"VPN
Propósito
Calculadora de VPN: valor presente neto, TIR, payback fraccionario e índice de rentabilidad.
¿Por qué? Use este engine para decidir si una inversión vale el capital: descuenta una serie de flujos de caja futuros a valor presente y entrega cuatro métricas clásicas de decisión. Son el NPV (valor presente neto), la TIR (tasa interna de retorno), el Payback Period sobre el flujo descontado acumulado y el Profitability Index, donde PI > 1 indica una inversión viable. El detalle por período hace el cálculo auditable línea por línea, base para comparar proyectos con objetividad.
¿Cómo? Cada flujo se multiplica por el factor de descuento 1 / (1 + r)^t y el NPV suma los flujos descontados restando la inversión inicial. La TIR es la tasa que lleva el NPV a cero, encontrada por el método de bisección en el intervalo -0.99 a 10.0 con tolerancia 1e-7 y hasta 1000 iteraciones. El Payback Period es el primer período en que el flujo descontado acumulado recupera la inversión, y el PI es la razón entre el valor presente de los flujos y la inversión inicial.
Origen La teoría del descuento de flujos de caja se remonta a Fisher (1930, The Theory of Interest); la práctica consolidada de evaluación de inversiones sigue a Brealey, Myers y Allen (2020, Principles of Corporate Finance).
Literatura de referencia
- Fisher, I. (1930). "The Theory of Interest." Macmillan.
- Brealey, R. A., Myers, S. C. & Allen, F. (2020). "Principles of Corporate Finance." 13th ed., McGraw-Hill.
Parámetros (params)
| Campo | Tipo | Obligatorio | Por defecto | Descripción |
|---|---|---|---|---|
discount_rate | number | no | 0.1 | Tasa de descuento anual (ej.: 0.10 para 10%). Debe ser > -1.0 y finita. |
initial_investment | number | no | 0 | Salida en el período 0. Cuando > 0, habilita payback_period y profitability_index en el resultado. |
Columnas de data[]
| Columna | Tipo | Obligatoria | Descripción |
|---|---|---|---|
period | number | sí | Período en que ocurre el flujo (usado como exponente de descuento). Las filas se ordenan por período antes del cálculo. |
cash_flow | number | sí | Monto del flujo de caja del período. |
Respuesta
En modo asíncrono (por defecto), 202 Accepted con {"process_uuid", "result_url"}; el resultado sale en GET /api/v1/results/{process_uuid}. Con ?sync=true o ?dry_run=true la respuesta es 200 con el resultado inline (y 504 con el process_uuid si el worker no responde a tiempo).
Errores
403- la engine no está enallowed_enginesde tu suscripción.413- subida por encima demax_upload_mb.422- engine desconocida o inactiva en el catálogo.429- cuota diaria (max_jobs_per_day) o por minuto excedida.
La validación es fail-fast: un envío rechazado no tiene ningún efecto secundario.
curl -X POST "https://intelligence.echosistema.live/api/v1/npv/process?dry_run=true&playground=true" \
-H "X-TENANT-KEY: $TENANT_KEY"Cascada de ingresos
Propósito
Cascada de ingresos: descompone la variación de ingresos entre dos períodos en clientes nuevos/perdidos, frecuencia y ticket promedio.
Compara los ingresos por cliente entre dos períodos y descompone la variación de forma exacta (sin término residual) en ingresos de clientes nuevos, ingresos de clientes perdidos, un efecto de frecuencia (ΔFrecuencia × AOV_período1) y un efecto de AOV (ΔAOV × Frecuencia_período2). Si no se dan los límites de los períodos, los datos se dividen automáticamente en la fecha del punto medio.
Parámetros (params)
| Campo | Tipo | Obligatorio | Por defecto | Descripción |
|---|---|---|---|---|
period_1_start | string | no | Fecha inicial (YYYY-MM-DD) del período 1. Por defecto: el menor purchase_date de los datos. | |
period_1_end | string | no | Fecha final (YYYY-MM-DD) del período 1. Por defecto: el punto medio entre la menor y la mayor purchase_date. | |
period_2_start | string | no | Fecha inicial (YYYY-MM-DD) del período 2. Por defecto: el día siguiente a period_1_end. | |
period_2_end | string | no | Fecha final (YYYY-MM-DD) del período 2. Por defecto: el mayor purchase_date de los datos. |
Columnas de data[]
| Columna | Tipo | Obligatoria | Descripción |
|---|---|---|---|
customer_id | string | sí | Identificador del cliente usado para clasificar estado nuevo/perdido/retenido entre los dos períodos. |
purchase_date | string | sí | Fecha de la compra (YYYY-MM-DD) usada para asignar la transacción al período 1 o 2. |
amount | number | sí | Monto de la transacción. |
Respuesta
En modo asíncrono (por defecto), 202 Accepted con {"process_uuid", "result_url"}; el resultado sale en GET /api/v1/results/{process_uuid}. Con ?sync=true o ?dry_run=true la respuesta es 200 con el resultado inline (y 504 con el process_uuid si el worker no responde a tiempo).
Errores
403- la engine no está enallowed_enginesde tu suscripción.413- subida por encima demax_upload_mb.422- engine desconocida o inactiva en el catálogo.429- cuota diaria (max_jobs_per_day) o por minuto excedida.
La validación es fail-fast: un envío rechazado no tiene ningún efecto secundario.
curl -X POST "https://intelligence.echosistema.live/api/v1/revenue_waterfall/process?dry_run=true&playground=true" \
-H "X-TENANT-KEY: $TENANT_KEY"Desempeño de ventas
Propósito
Desempeño de ventas: ingresos por producto, cantidad, tendencia de ingresos, participación de mercado y margen de ganancia opcional.
¿Por qué? Use este engine para ver de una sola vez qué sostiene los ingresos, qué está creciendo y qué se está encogiendo en el portafolio. Para cada producto entrega ingresos totales, cantidad vendida, precio promedio, tendencia de ingresos, market share porcentual y, cuando la columna cost está presente, el margen de utilidad. Ordena los productos por ingresos y destaca los mejores y peores performers, además de la tasa de crecimiento general del período.
¿Cómo? Agrega las transacciones por product_id, sumando ingresos y cantidad, y deriva el precio promedio unitario. Divide el período por la mediana de las fechas de venta en dos mitades y calcula la tendencia de cada producto como la variación porcentual entre las sumas de ingresos de la primera y la segunda mitad; el market share es la participación del producto en los ingresos totales. Como la tendencia compara sumas absolutas, mitades con distinta cantidad de períodos pueden sesgar el resultado, y los datasets con más puntos temporales producen divisiones más equilibradas.
Origen El análisis de desempeño de ventas por producto sigue los fundamentos de gestión de marketing de Kotler y Keller (2016, Marketing Management).
Literatura de referencia
- Kotler, P. & Keller, K. L. (2016). "Marketing Management." 15th ed., Pearson.
Parámetros (params)
| Campo | Tipo | Obligatorio | Por defecto | Descripción |
|---|---|---|---|---|
top_n | integer | no | 5 | Cantidad de productos en el tope y en la base (por total_revenue) incluidos en el resumen. |
Columnas de data[]
| Columna | Tipo | Obligatoria | Descripción |
|---|---|---|---|
product_id | string | sí | Identificador del producto; las transacciones se agregan por product_id. |
sale_date | string | sí | Fecha de la venta. Acepta strings de fecha, Unix en segundos/ms/días o YYYYMMDD; usada para dividir los ingresos entre las mitades en el cálculo de tendencia. |
quantity | number | sí | Cantidad vendida en la transacción. |
revenue | number | sí | Monto de ingresos de la transacción. |
cost | number | no | Costo de la mercadería en la transacción. Cuando está presente, habilita profit_margin_pct por producto y grand_total_cost/grand_total_profit/avg_profit_margin_pct agregados. |
Respuesta
En modo asíncrono (por defecto), 202 Accepted con {"process_uuid", "result_url"}; el resultado sale en GET /api/v1/results/{process_uuid}. Con ?sync=true o ?dry_run=true la respuesta es 200 con el resultado inline (y 504 con el process_uuid si el worker no responde a tiempo).
Errores
403- la engine no está enallowed_enginesde tu suscripción.413- subida por encima demax_upload_mb.422- engine desconocida o inactiva en el catálogo.429- cuota diaria (max_jobs_per_day) o por minuto excedida.
La validación es fail-fast: un envío rechazado no tiene ningún efecto secundario.
curl -X POST "https://intelligence.echosistema.live/api/v1/sales_performance/process?dry_run=true&playground=true" \
-H "X-TENANT-KEY: $TENANT_KEY"