27. Funciones y tablas para calcular resultados de derivados

Un programa confiable separa las reglas de cálculo, la validación de datos y la presentación de escenarios para que los resultados puedan revisarse y reutilizarse.

27.1 Del contrato a una función verificable

Los derivados estudiados en el curso pueden expresarse como funciones: reciben datos de un contrato y un escenario de precio, y devuelven un resultado. Esta separación ayuda a distinguir la regla financiera de la interfaz, la tabla o el formato de moneda.

Idea central: una función de cálculo debe ser pequeña, tener nombres claros, devolver un resultado predecible y no depender de elementos visuales. Así es más fácil probarla con casos conocidos.

27.2 Funciones puras y datos de entrada

Una función pura devuelve siempre el mismo resultado para los mismos argumentos y no modifica variables externas. Este estilo es especialmente útil para cálculos financieros porque permite comparar escenarios sin efectos ocultos.

Por ejemplo, el resultado de un forward largo depende del precio final, el precio acordado y la cantidad. No necesita leer directamente un campo HTML ni escribir una tabla para hacer su cálculo.

function resultadoForwardLargo(precioFinal, precioEntrega, cantidad) {
  return (precioFinal - precioEntrega) * cantidad;
}

const resultado = resultadoForwardLargo(112, 100, 25);
console.log(resultado); // 300

La interfaz puede llamar a esta función y luego decidir cómo mostrar el número: como moneda, con separadores locales o dentro de una fila de tabla.

27.3 Un vocabulario de funciones reutilizables

Conviene crear pequeñas funciones con una responsabilidad definida. Algunas reglas comunes en este curso son:

Pago de call

Calcula máximo(S − K, 0) sin incorporar prima ni cantidad.

Pago de put

Calcula máximo(K − S, 0) por unidad.

Resultado neto

Incorpora prima, lado de posición y cantidad.

Tabla de escenarios

Repite el cálculo para una serie de precios finales.

Separar estas funciones evita duplicar fórmulas parecidas y reduce la probabilidad de que una tabla use una regla distinta de la que muestra el resumen principal.

27.4 Diseñar datos de contrato

Agrupar los datos en un objeto hace más legible el programa. Un objeto de opción puede tener tipo, lado, ejercicio, prima y cantidad. Una función puede recibir ese objeto junto con el precio final.

const opcion = {
  tipo: "call",
  lado: "comprada",
  ejercicio: 100,
  prima: 6,
  cantidad: 10
};

function resultadoOpcion(opcion, precioFinal) {
  const pago = opcion.tipo === "call"
    ? Math.max(precioFinal - opcion.ejercicio, 0)
    : Math.max(opcion.ejercicio - precioFinal, 0);
  const neto = opcion.lado === "comprada" ? pago - opcion.prima : opcion.prima - pago;
  return neto * opcion.cantidad;
}

El objeto no valida por sí mismo sus datos. Debemos comprobar que tipo y lado sean valores admitidos, que las cantidades sean positivas y que los precios sean números finitos.

27.5 Validar antes de calcular

Un algoritmo puede estar bien escrito y aun así producir resultados inútiles si recibe datos inválidos. Las validaciones básicas deben ocurrir antes de construir la tabla o mostrar un resumen.

  • Los precios, primas y cantidades deben ser números finitos.
  • Los precios y primas no deberían ser negativos en los modelos del curso.
  • La cantidad debe ser mayor que cero.
  • El tipo de contrato y la posición deben pertenecer al conjunto admitido.
  • Las unidades temporales y monetarias deben ser compatibles cuando se calculan precios a plazo.

Un mensaje de validación claro es preferible a mostrar NaN o una tabla parcialmente calculada.

01Entradas
02Validación
03Función
04Escenarios
05Presentación

27.6 Construir una tabla de escenarios

Una tabla de escenarios responde a una pregunta simple: ¿qué resultado tendría el contrato si el precio final fuera cada uno de estos valores? Para evitar omisiones, generamos una lista de precios y aplicamos la misma función a cada uno.

function crearEscenarios(desde, hasta, paso, calcularResultado) {
  const filas = [];
  for (let precio = desde; precio <= hasta; precio += paso) {
    filas.push({ precio, resultado: calcularResultado(precio) });
  }
  return filas;
}

const filas = crearEscenarios(80, 120, 10, precio =>
  resultadoForwardLargo(precio, 100, 1)
);
console.log(filas);

El parámetro calcularResultado recibe una función. Esto permite reutilizar el generador con forwards, calls, puts o combinaciones de estrategias sin reescribir el bucle.

27.7 Redondeo y formato

El cálculo interno debe conservar precisión suficiente. El formato monetario se aplica al final, al presentar un dato al usuario. Redondear después de cada operación puede acumular diferencias, especialmente en tablas grandes o flujos de varios períodos.

Intl.NumberFormat permite presentar importes de acuerdo con una configuración local. Esa presentación no transforma la unidad económica: una aplicación debe documentar qué moneda representa cada importe y evitar mezclar monedas en la misma tabla sin conversión.

27.8 Simulador: calculadora y tabla de escenarios

Elegí un instrumento y una posición. El laboratorio usa una función para calcular el resultado en el precio seleccionado y reutiliza esa misma función para construir la tabla. Probá cambiar el instrumento para observar cómo se modifica el perfil.

Calculadora reutilizable de derivados

Resultados al vencimiento para un forward o una opción, sin costos adicionales fuera de la prima.

Resultado por unidad$ 9,00
Resultado total$ 90,00
Filas generadas5
Escenarios calculados con la misma función del resumen.
Precio finalResultado por unidadResultado total

27.9 Pruebas de casos sencillos

Antes de confiar en una calculadora, conviene probar valores que permitan anticipar la respuesta:

  • Un forward largo con precio final igual al precio acordado debe dar cero.
  • Una call con S menor o igual que K debe tener pago bruto cero.
  • Una put con S mayor o igual que K debe tener pago bruto cero.
  • La suma de una opción comprada y vendida equivalente debe ser cero en el modelo sin costos externos.
  • Duplicar la cantidad debe duplicar el resultado total, sin cambiar el resultado por unidad.

Estas pruebas no cubren todos los casos, pero detectan inversiones de signo, omisiones de prima y errores de multiplicación muy frecuentes.

Importante: una calculadora educativa no conoce la especificación completa de un contrato real. El resultado sólo es válido dentro de los datos, reglas y unidades explícitamente ingresados.

27.10 Ejercicio propuesto

Construí una función para calcular el resultado de una put comprada. Debe recibir precio final, ejercicio, prima y cantidad. Probala con K = $80, prima = $5, cantidad = 20 y precios finales $90, $80, $75 y $60.

  1. Escribí la función de pago bruto.
  2. Incorporá la prima y la cantidad.
  3. Generá una tabla de los cuatro escenarios.
  4. Verificá qué precio produce resultado neto cero.
Ver solución y código

El resultado por unidad es máximo(K − S, 0) − prima. Con S = $90 y $80, el resultado total es −$100. Con S = $75 es cero. Con S = $60, el resultado total es $300. El punto de equilibrio es $80 − $5 = $75.

function resultadoPutComprada(S, K, prima, cantidad) {
  const pago = Math.max(K - S, 0);
  return (pago - prima) * cantidad;
}

[90, 80, 75, 60].forEach(S => {
  console.log(S, resultadoPutComprada(S, 80, 5, 20));
});

27.11 Ideas para recordar

  • Las funciones puras separan reglas financieras de la interfaz y facilitan las pruebas.
  • Los objetos permiten agrupar los datos de un contrato y reducir errores de argumentos.
  • Las validaciones deben ejecutarse antes de calcular o mostrar resultados.
  • Una tabla de escenarios debe usar la misma función que el resultado principal.
  • El formato monetario se aplica al presentar; los cálculos internos deben conservar precisión y unidades claras.

En el próximo y último tema construiremos un simulador integrador de futuros, forwards y opciones.