21.1 De un período al árbol completo
El modelo del tema 19 supone un único salto entre hoy y el vencimiento, lo que es una simplificación extrema: en la práctica, el activo se mueve muchas veces antes de T. La solución es natural: repetir el modelo de un período en cada paso. El resultado es el árbol binomial, la estructura de valoración discreta más importante del curso.
Idea central: el valor de un nodo es el valor esperado neutral descontado de sus dos nodos hijos. Repitiendo esa operación desde el vencimiento hasta hoy se obtiene la prima de la opción.
21.2 Construcción del árbol y recombinación
Cada nodo queda identificado por el paso i (de 0 a N) y la cantidad j de subidas acumuladas (de 0 a i). Su precio es:
Con S0 = 100, u = 1,2 y d = 0,8, los precios por nivel son: en t = 0, 100; en t = 1, 120 y 80; en t = 2, 144, 96 y 64.
El árbol recombina: una subida seguida de una bajada llega al mismo nodo que una bajada seguida de una subida, porque S0 × u × d = S0 × d × u. Por eso no hay 2N caminos separados: con N pasos hay N + 1 precios terminales y (N + 1)(N + 2) / 2 nodos en total. Con N = 2: 6 nodos y 3 precios terminales, aunque los caminos posibles sean 4. Con N = 10: 66 nodos.
21.3 La probabilidad neutral en cada período
La condición de no arbitraje del tema 19 debe valer en cada paso del árbol, siempre con la tasa del período:
Si los factores u, d y la tasa por período son constantes —como en nuestro ejemplo, con p = 0,625— la misma probabilidad neutral se usa en todos los nodos. Si algún parámetro cambia con el tiempo, cada nodo emplea la p del período correspondiente.
Un cuidado práctico importante: la tasa r debe expresarse en la misma unidad temporal que un paso (por ejemplo, una tasa trimestral si los pasos son trimestrales). Mezclar tasas anuales con pasos mensuales es el error más común al implementar un árbol.
21.4 Valoración hacia atrás
El algoritmo de valoración recorre el árbol desde el vencimiento hasta hoy:
- En cada nodo terminal
(N, j), calcular el pago de la opción:max(S(N, j) − K, 0)para una call omax(K − S(N, j), 0)para una put. - En cada nodo anterior, reemplazar el valor por la esperanza neutral descontada de sus dos hijos.
- El valor del nodo inicial
(0, 0)es la prima.
Cada paso del recorrido descuenta una sola vez; al llegar a hoy quedan N descuentos acumulados, equivalentes a dividir por (1 + r)N. La fórmula vale para cualquier pago europeo: sólo cambia lo que se calcula en los nodos terminales.
21.5 Ejemplo completo a dos períodos
Con los datos que venimos usando —S0 = $100, u = 1,2, d = 0,8, r = 5 % por período— valoramos una call europea con K = $100 a dos períodos. Los pagos terminales son max(144 − 100, 0) = 44, max(96 − 100, 0) = 0 y max(64 − 100, 0) = 0.
V(1,0) = [0,625 × 0 + 0,375 × 0] / 1,05 = 0
V(0,0) = [0,625 × 26,1905 + 0,375 × 0] / 1,05 = $15,5896
| Paso | Subidas (j) | Precio S | Valor de la call |
|---|---|---|---|
| 0 | 0 | 100,00 | 15,5896 |
| 1 | 1 | 120,00 | 26,1905 |
| 1 | 0 | 80,00 | 0,0000 |
| 2 | 2 | 144,00 | 44,0000 |
| 2 | 1 | 96,00 | 0,0000 |
| 2 | 0 | 64,00 | 0,0000 |
La call de un período valía $11,9048; con dos períodos vale $15,5896. Más tiempo hasta el vencimiento significa más valor para una call europea sin dividendos, porque hay más estados finales favorables posibles.
21.6 La fórmula cerrada del binomial
La valoración hacia atrás no es más que una suma de esperanzas: bajo p, la probabilidad de terminar con exactamente j subidas es la binomial C(N, j) × pj × (1 − p)(N − j). Sumando los pagos ponderados y descontando de una vez se obtiene la fórmula cerrada:
Con N = 2, el único término con pago distinto de cero es el de dos subidas (pago 44): [0,6252 × 44] / 1,052 = 17,1875 / 1,1025 = $15,5896 ✓. La fórmula cerrada y el recorrido hacia atrás dan siempre el mismo resultado; el árbol tiene la ventaja de que además entrega los valores y los deltas de todos los nodos intermedios.
21.7 Replicación dinámica: el delta cambia en cada nodo
En un árbol de varios períodos la cartera replicante ya no es estática: en cada nodo hay que recalcularla. El delta del nodo es la pendiente entre sus dos hijos, Δ(i, j) = [V(i+1, j+1) − V(i+1, j)] / [S(i+1, j+1) − S(i+1, j)], y la posición en el bono surge de B = V − Δ × S.
| Nodo | Precio S | Valor V | Δ | B (bono) |
|---|---|---|---|---|
| t = 0 | 100,00 | 15,5896 | 0,6548 | −49,8866 |
| t = 1, subida | 120,00 | 26,1905 | 0,9167 | −83,8095 |
| t = 1, bajada | 80,00 | 0,0000 | 0,0000 | 0,0000 |
La operación es autofinanciada: al subir, la cartera armada en t = 0 vale 0,654762 × 120 − 49,886621 × 1,05 ≈ 26,1905, exactamente el valor de la opción en ese nodo; esa plata se reasigna a la nueva cartera (0,9167 activos y una deuda mayor, de 83,8095), sin aportar ni retirar fondos. Al bajar, la opción no vale nada y la réplica se desarma sola: Δ = 0 y B = 0.
Idea central: la cobertura ya no es «comprar 0,5 activos y esperar»: es una estrategia que se rebalancea en cada nodo. En el límite de pasos muy pequeños, replicar la opción exige operar de manera casi continua.
21.8 Más períodos y el camino hacia Black-Scholes
Todo lo anterior se generaliza sin cambios a N pasos: con N = 3 se obtienen 4 precios terminales y 10 nodos; con N = 10, 11 precios terminales y 66 nodos. En la práctica, los factores y la tasa se calibran por período; una elección frecuente es
donde σ es la volatilidad del activo. A medida que N crece, el conjunto de precios terminales se vuelve una aproximación cada vez más fina del movimiento continuo del activo y la prima del árbol converge al valor del modelo de Black-Scholes, que se estudia en el tema 23. El árbol conserva una ventaja decisiva: admite el ejercicio anticipado de las opciones americanas, algo que Black-Scholes no puede manejar directamente. De eso se ocupa el tema 22.
21.9 Implementación en JavaScript
La valoración hacia atrás se implementa con dos bucles: uno recorre los niveles desde el vencimiento y otro los nodos de cada nivel. El arreglo valores se reutiliza nivel por nivel, porque cada nodo sólo necesita los valores de sus dos hijos.
function valorBinomio(spot, u, d, tasa, strike, pasos, tipo = 'call') {
const p = ((1 + tasa) - d) / (u - d);
let valores = [];
for (let j = 0; j <= pasos; j++) {
const precioFinal = spot * Math.pow(u, j) * Math.pow(d, pasos - j);
valores.push(tipo === 'call' ? Math.max(precioFinal - strike, 0) : Math.max(strike - precioFinal, 0));
}
for (let i = pasos - 1; i >= 0; i--) {
for (let j = 0; j <= i; j++) {
valores[j] = (p * valores[j + 1] + (1 - p) * valores[j]) / (1 + tasa);
}
}
return valores[0];
}
console.log(valorBinomio(100, 1.2, 0.8, 0.05, 100, 1).toFixed(4)); // "11.9048"
console.log(valorBinomio(100, 1.2, 0.8, 0.05, 100, 2).toFixed(4)); // "15.5896"
console.log(valorBinomio(100, 1.2, 0.8, 0.05, 100, 3).toFixed(4)); // "21.1235"Para trabajar con todo el árbol —por ejemplo, para ver los deltas de cada nodo— conviene guardar los precios y los valores nivel por nivel. La función auxiliar deltaEn obtiene el delta de un nodo cualquiera a partir de sus dos hijos.
function nivelesArbol(spot, u, d, tasa, strike, pasos, tipo = 'call') {
const p = ((1 + tasa) - d) / (u - d);
const precios = [];
for (let i = 0; i <= pasos; i++) {
precios.push([]);
for (let j = 0; j <= i; j++) {
precios[i].push(spot * Math.pow(u, j) * Math.pow(d, i - j));
}
}
const valores = [];
valores[pasos] = precios[pasos].map(precio =>
tipo === 'call' ? Math.max(precio - strike, 0) : Math.max(strike - precio, 0)
);
for (let i = pasos - 1; i >= 0; i--) {
valores[i] = [];
for (let j = 0; j <= i; j++) {
valores[i].push((p * valores[i + 1][j + 1] + (1 - p) * valores[i + 1][j]) / (1 + tasa));
}
}
return { precios, valores, p };
}
function deltaEn(precios, valores, nivel, estado) {
return (valores[nivel + 1][estado + 1] - valores[nivel + 1][estado]) /
(precios[nivel + 1][estado + 1] - precios[nivel + 1][estado]);
}
const arbol = nivelesArbol(100, 1.2, 0.8, 0.05, 100, 2);
console.log(arbol.valores[0][0].toFixed(4)); // "15.5896" (prima)
console.log(deltaEn(arbol.precios, arbol.valores, 0, 0).toFixed(4)); // "0.6548" (delta de hoy)
console.log(deltaEn(arbol.precios, arbol.valores, 1, 1).toFixed(4)); // "0.9167" (nodo de subida)
console.log(deltaEn(arbol.precios, arbol.valores, 1, 0).toFixed(4)); // "0.0000" (nodo de bajada)Los deltas confirman la cobertura dinámica: en el nodo de subida hay que sostener más activo (0,9167) y endeudarse más; en el de bajada, la posición se cierra por completo.
21.10 Laboratorio: árbol binomial de varios períodos
Modificá los parámetros y el número de pasos (entre 1 y 6). El laboratorio construye el árbol completo, muestra la prima, el delta de hoy y la tabla de todos los nodos con su precio, valor y delta hacia los hijos. En el renglón final se verifica el resultado con la fórmula cerrada del apartado 21.6. Los nodos terminales no tienen delta (no tienen hijos).
Árbol binomial
Opciones europeas; valoración hacia atrás con la misma p en todos los nodos.
| Paso | Subidas (j) | Precio S | Valor V | Δ |
|---|
21.11 Supuestos, límites y controles
El árbol hereda los supuestos del modelo de un período y agrega los propios del encadenamiento:
- Parámetros constantes por período: u, d y r pueden variar entre pasos, pero cada paso debe cumplir
d < 1 + r < ucon su propia tasa del período. - Rebalanceos sin costo: replicar en cada nodo implica operar muchas veces; comisiones y spreads de mercado erosionan ese supuesto.
- La calibración es la decisión crítica: el resultado depende de u, d y σ elegidos; con
u = eσ√Δtyd = 1/uhay que definir la volatilidad por período. - Opciones europeas: este tema valora al vencimiento; el ejercicio anticipado es el tema 22.
Lista de control del árbol binomial:
- ¿Se cumple
d < 1 + r < uen cada período y0 < p < 1? - ¿Los precios terminales se generan con
S0 × uj × d(N − j)? - ¿Los pagos corresponden al tipo (call o put) y al strike correcto?
- ¿El recorrido hacia atrás llega hasta el nodo inicial y aplica un descuento por nivel?
- ¿La prima coincide con la fórmula cerrada (equivalente a la esperanza descontada del tema 20)?
- ¿Los deltas de los nodos reproducen los cambios de valor entre hijos?
Alcance educativo: el curso explica modelos y relaciones de valoración. Los precios obtenidos dependen de los supuestos del modelo y no constituyen recomendaciones de inversión.
21.12 Próximo paso: opciones americanas
El árbol binomial es la estructura ideal para estudiar el ejercicio anticipado: en cada nodo se puede comparar el valor de continuar (la esperanza descontada de los hijos, como en este tema) con el valor de ejercer de inmediato (la ganancia intrínseca). La opción americana se valora tomando el mayor de los dos, y ese simple cambio permite responder preguntas que Black-Scholes no aborda: ¿conviene ejercer hoy?, ¿cuánto vale ese derecho?
El tema 22 formaliza esa comparación nodo a nodo y muestra por qué sólo las puts americanas suelen ejercerse antes del vencimiento en ausencia de dividendos.
21.13 Ejercicio propuesto
Con los mismos datos del ejemplo —S0 = $100, u = 1,2, d = 0,8, r = 5 % por período y dos períodos— se pide valorar una put europea con K = $100.
- Escribí los precios terminales y los pagos de la put en cada uno.
- Valorá hacia atrás: los nodos de t = 1 y la prima de hoy.
- Calculá el Δ de cada nodo de decisión y explicá su signo.
- Verificá la paridad put-call con la call de dos períodos (prima $15,5896):
C − Pdebe ser igual aS0 − K / (1 + r)2. - La put de un período valía $7,1429, ¿por qué la de dos períodos vale menos?
Ver orientación de resolución
Precios terminales: 144, 96 y 64; pagos de la put: 0, 4 y 36. En t = 1: nodo de subida [0,625 × 0 + 0,375 × 4] / 1,05 = $1,4286; nodo de bajada [0,625 × 4 + 0,375 × 36] / 1,05 = $15,2381. Prima: [0,625 × 1,4286 + 0,375 × 15,2381] / 1,05 = $6,2925. Deltas: hoy (1,4286 − 15,2381) / (120 − 80) = −0,3452; en el nodo de subida (0 − 4) / (144 − 96) = −0,0833; en el de bajada (4 − 36) / (96 − 64) = −1,0000. Los Δ negativos indican posición corta en el activo: la put se replica vendiendo parte del subyacente e invirtiendo en el bono. Paridad: C − P = 15,5896 − 6,2925 = 9,2971 y S0 − K / 1,052 = 100 − 90,7029 = 9,2971 ✓. La put de dos períodos vale menos que la de uno (6,2925 < 7,1429) porque, al extenderse el plazo, el strike descontado K / (1 + r)T pesa menos en la paridad; la call, en cambio, sube de 11,9048 a 15,5896.
function valorBinomio(spot, u, d, tasa, strike, pasos, tipo = 'call') {
const p = ((1 + tasa) - d) / (u - d);
let valores = [];
for (let j = 0; j <= pasos; j++) {
const precioFinal = spot * Math.pow(u, j) * Math.pow(d, pasos - j);
valores.push(tipo === 'call' ? Math.max(precioFinal - strike, 0) : Math.max(strike - precioFinal, 0));
}
for (let i = pasos - 1; i >= 0; i--) {
for (let j = 0; j <= i; j++) {
valores[j] = (p * valores[j + 1] + (1 - p) * valores[j]) / (1 + tasa);
}
}
return valores[0];
}
console.log(valorBinomio(100, 1.2, 0.8, 0.05, 100, 2, 'put').toFixed(4)); // "6.2925"
console.log(valorBinomio(100, 1.2, 0.8, 0.05, 100, 1, 'put').toFixed(4)); // "7.1429"
const call = valorBinomio(100, 1.2, 0.8, 0.05, 100, 2);
const put = valorBinomio(100, 1.2, 0.8, 0.05, 100, 2, 'put');
console.log((call - put).toFixed(4)); // "9.2971" (paridad)21.14 Ejercicio adicional: más períodos, ¿más valor?
Con la misma call europea (S0 = $100, u = 1,2, d = 0,8, r = 5 %, K = $100) ahora el vencimiento se extiende a tres períodos.
- Escribí los cuatro precios terminales y los pagos de la call.
- Valorá la call con la fórmula cerrada del apartado 21.6.
- Compará con las primas de uno y dos períodos ($11,9048 y $15,5896): ¿qué patrón se observa?
- ¿Cuántos nodos tiene el árbol de tres períodos? ¿Y el de diez?
- ¿Qué debería pasar con la prima si se aumentara mucho el número de períodos manteniendo la misma volatilidad total?
Ver orientación de resolución
Precios terminales: 172,8; 115,2; 76,8 y 51,2; pagos: 72,8; 15,2; 0 y 0. Fórmula cerrada: [0,6253 × 72,8 + 3 × 0,6252 × 0,375 × 15,2] / 1,053 = [17,7734 + 6,6797] / 1,157625 = $21,1235. La secuencia 11,9048 < 15,5896 < 21,1235 es creciente: para una call europea sin dividendos, más tiempo hasta el vencimiento significa más valor. El árbol de tres períodos tiene (3 + 1)(3 + 2) / 2 = 10 nodos; el de diez, 66. Con muchísimos períodos (y u, d recalibrados para mantener la volatilidad por unidad de tiempo), la prima converge al valor de Black-Scholes del tema 23: el límite continuo del árbol.
function valorBinomio(spot, u, d, tasa, strike, pasos, tipo = 'call') {
const p = ((1 + tasa) - d) / (u - d);
let valores = [];
for (let j = 0; j <= pasos; j++) {
const precioFinal = spot * Math.pow(u, j) * Math.pow(d, pasos - j);
valores.push(tipo === 'call' ? Math.max(precioFinal - strike, 0) : Math.max(strike - precioFinal, 0));
}
for (let i = pasos - 1; i >= 0; i--) {
for (let j = 0; j <= i; j++) {
valores[j] = (p * valores[j + 1] + (1 - p) * valores[j]) / (1 + tasa);
}
}
return valores[0];
}
console.log(valorBinomio(100, 1.2, 0.8, 0.05, 100, 1).toFixed(4)); // "11.9048"
console.log(valorBinomio(100, 1.2, 0.8, 0.05, 100, 2).toFixed(4)); // "15.5896"
console.log(valorBinomio(100, 1.2, 0.8, 0.05, 100, 3).toFixed(4)); // "21.1235"