28. Proyecto integrador: simulador de futuros, forwards y opciones

El proyecto integra los conceptos del curso en una herramienta que representa una posición, calcula resultados al vencimiento y compara escenarios de precio.

28.1 Objetivo del proyecto

Construiremos un simulador educativo capaz de calcular el resultado de una posición en un futuro, un forward, una call o una put. La herramienta recibirá datos básicos del contrato y mostrará un resultado para un precio final seleccionado junto con una tabla de escenarios.

Objetivo didáctico: no se trata de crear una plataforma de negociación ni de valuar instrumentos reales. Se trata de convertir reglas financieras explícitas en funciones, validaciones e interfaces que puedan revisarse y ampliarse.

28.2 Alcance definido

Un buen proyecto empieza por declarar lo que hará y lo que no hará. Nuestro simulador utilizará resultados al vencimiento y trabajará con un único subyacente, una posición y una cantidad. Para forwards y futuros usará un perfil lineal; para opciones incorporará el ejercicio y la prima.

Futuros y forwards

Resultado lineal según precio final, precio acordado, cantidad y dirección.

Calls y puts

Pago bruto no lineal, prima y posición comprada o vendida.

Escenarios

Tabla de precios finales generada con la misma función de cálculo.

Exclusiones

No incorpora volatilidad, valor temporal, márgenes, tasas, impuestos, costos ni datos de mercado.

28.3 Modelo de datos del contrato

Para evitar una lista extensa de argumentos, representaremos la posición como un objeto. Sus propiedades dependen del instrumento, pero algunas son comunes: tipo, posición, precio acordado o ejercicio, prima y cantidad.

const contrato = {
  instrumento: "call",
  posicion: "comprada",
  ejercicio: 100,
  prima: 6,
  cantidad: 10
};

const escenario = { precioFinal: 115 };

El objeto representa un modelo simplificado. Una versión más completa podría incluir moneda, fecha de vencimiento, multiplicador, subyacente, tamaño de contrato, contraparte y convenciones de liquidación.

28.4 Una función central de cálculo

El corazón del proyecto es una función que recibe un contrato y un precio final. Según el instrumento, selecciona la regla correspondiente y devuelve componentes que luego servirán para construir el resumen y la tabla.

function calcularResultado(contrato, precioFinal) {
  const { instrumento, posicion, precio, prima, cantidad } = contrato;
  const signo = posicion === "larga" || posicion === "comprada" ? 1 : -1;

  if (instrumento === "forward" || instrumento === "futuro") {
    const porUnidad = (precioFinal - precio) * signo;
    return { pagoBruto: porUnidad, resultadoTotal: porUnidad * cantidad };
  }

  const pago = instrumento === "call"
    ? Math.max(precioFinal - precio, 0)
    : Math.max(precio - precioFinal, 0);
  const porUnidad = posicion === "comprada" ? pago - prima : prima - pago;
  return { pagoBruto: pago, resultadoTotal: porUnidad * cantidad };
}

La función concentra las reglas del curso. Si se modifica, todas las partes de la interfaz deben utilizar esa misma versión para evitar inconsistencias entre tarjetas y tablas.

28.5 Validar el contrato antes de simular

La interfaz puede recibir texto, campos vacíos o números fuera de rango. Antes de llamar a la función central, debemos verificar que:

  • el instrumento sea futuro, forward, call o put;
  • la posición sea válida para ese instrumento;
  • los precios y la prima sean números finitos y no negativos;
  • la cantidad sea positiva;
  • la prima se aplique sólo a opciones en el modelo;
  • la unidad de precio y la cantidad sean compatibles.

La validación protege la herramienta contra resultados engañosos. No alcanza con que JavaScript pueda multiplicar los valores: deben tener significado económico dentro del modelo.

01Contrato
02Validación
03Función
04Escenarios
05Lectura

28.6 Generar escenarios de precio

Una simulación no debe limitarse a un precio final. Generar varios escenarios permite entender la forma del perfil y comprobar el resultado. Elegimos un paso y construimos valores por debajo, alrededor y por encima del precio acordado o ejercicio.

function generarEscenarios(centro, paso, calcular) {
  return [-2, -1, 0, 1, 2].map(desplazamiento => {
    const precioFinal = Math.max(0, centro + desplazamiento * paso);
    return { precioFinal, ...calcular(precioFinal) };
  });
}

const filas = generarEscenarios(100, 10, precioFinal =>
  calcularResultado(contrato, precioFinal)
);

El mismo cálculo se aplica a cada fila. Si una tabla parece extraña, conviene comparar una de sus filas con el resultado principal para verificar que ambos usen los mismos datos.

28.7 Pruebas antes de entregar la herramienta

Un proyecto integrador necesita pruebas de casos límite, no sólo un escenario atractivo. Estas verificaciones son una base razonable:

  • Futuro o forward largo con precio final igual al acordado: resultado cero.
  • Call comprada con S menor que K: pérdida igual a la prima total.
  • Put comprada con S mayor que K: pérdida igual a la prima total.
  • Posiciones comprada y vendida equivalentes: resultados opuestos.
  • Cantidad duplicada: resultado total duplicado.
  • Datos inválidos: mensaje claro, sin tabla engañosa.

Las pruebas pueden automatizarse con un marco de testing en un proyecto mayor. Aquí las aplicamos como controles manuales sobre las funciones y el simulador.

28.8 Simulador integrador

La herramienta siguiente reúne el proyecto. Elegí un instrumento, una posición y sus datos. Para futuros y forwards, “precio acordado” funciona como precio de entrada; para opciones, como precio de ejercicio. La prima se usa sólo en opciones.

Simulador educativo de derivados

Resultados al vencimiento: futuros, forwards, calls y puts bajo reglas simplificadas.

Pago bruto por unidad$ 15,00
Resultado por unidad$ 9,00
Resultado total$ 90,00
Escenarios calculados por la misma función central.
Precio finalPago bruto/unidadResultado/unidadResultado total

28.9 Cómo ampliar el proyecto

Una vez que la versión básica funciona y está probada, se puede ampliar gradualmente. Algunas mejoras posibles son:

  • agregar especificaciones de contrato, multiplicadores y monedas;
  • representar fechas, vencimientos y días restantes;
  • incorporar gráficos con los mismos datos de la tabla;
  • permitir una cartera de varias posiciones y sumar resultados;
  • guardar escenarios en almacenamiento local del navegador;
  • incorporar validaciones por tipo de instrumento y mensajes más detallados.

Cada mejora debe mantener la separación entre datos, funciones de cálculo y presentación. Añadir más controles visuales no debe alterar una fórmula que ya fue validada.

Importante: el simulador no utiliza datos en tiempo real, no valora instrumentos antes del vencimiento ni contempla todos los riesgos contractuales. Es un proyecto de aprendizaje, no una plataforma de inversión ni de gestión de riesgos.

28.10 Ejercicio final propuesto

Extendé el simulador para admitir una cartera formada por dos posiciones: un futuro largo con precio de entrada $100 y cantidad 10, más una put comprada con K = $95, prima $3 y cantidad 10. Evaluá los precios finales $80, $95, $100, $110 y $125.

  1. Representá ambas posiciones como objetos.
  2. Creá una función que sume los resultados de la cartera.
  3. Generá la tabla de cinco escenarios.
  4. Explicá cómo la put modifica el perfil del futuro largo ante una caída.
  5. Indicá qué costos o riesgos del mundo real faltan en el modelo.
Ver solución y código

La put comprada limita parte del efecto de una caída del futuro largo por debajo de $95, a cambio de la prima. Por ejemplo, con S = $80, el futuro largo da −$200 y la put da ($15 − $3) × 10 = $120; el resultado de cartera es −$80.

function futuroLargo(S) {
  return (S - 100) * 10;
}

function putComprada(S) {
  return (Math.max(95 - S, 0) - 3) * 10;
}

function cartera(S) {
  return futuroLargo(S) + putComprada(S);
}

[80, 95, 100, 110, 125].forEach(S => console.log(S, cartera(S)));
// Con S = 80, resultado: -80

El modelo deja fuera margen de futuros, costos de operación, volatilidad y valor temporal de la put, reglas de ejercicio, liquidez, impuestos y el riesgo de que los instrumentos no coincidan perfectamente.

28.11 Ideas para recordar

  • Un simulador útil declara con precisión su alcance y sus exclusiones.
  • El modelo de datos debe conservar instrumento, posición, precio, prima, cantidad y unidades.
  • Una función central de cálculo evita que el resumen y la tabla usen fórmulas distintas.
  • Validar datos y probar casos límite es parte del diseño, no una etapa opcional.
  • Las simulaciones educativas ayudan a comprender perfiles de resultado, pero no sustituyen contratos, datos de mercado ni análisis profesional.

Con este proyecto finalizás el curso de Futuros, Forwards y Opciones. Podés volver a los temas anteriores para ampliar el simulador con los modelos y supuestos que estudiaste.