Estoy leyendo el artículo donde se presentan diferentes aproximaciones para la fijación de precios de las opciones sobre cestas. He intentado reproducir en Python el resultado obtenido por el método de Gentle.
Definimos el precio de una cesta de valores como la media ponderada de los precios de $n$ existencias al vencimiento $T$ $$ B(T) =\sum^n_{i=1} w_iS_i(T). $$
Nuestra tarea consiste en determinar el precio de una llamada ( $\theta = 1$ ) o un put ( $\theta = -1$ ) con huelga $K$ y madurez $T$ en la cesta, es decir, valorar la retribución $$ P_{Basket} (B(T), K, \theta) = [\theta (B(T) - K)]^+. $$
Del artículo he utilizado la aproximación de Gentle por media geométrica y los datos de entrada.
El método.
El hecho de que una media geométrica de variables aleatorias log-normales sea log-normal permite una forma de valoración tipo Black-Scholes. para valorar el pago aproximado. En concreto tras reescribir el resultado de la opción cesta como $$ P_{basket}=\left(\theta\left( \sum_{i=1}^n w_i S_i(T) - K \right)\right)^+ = \left(\theta\left( \left( \sum_{i=1}^n w_i F_i^T \right) \sum_{i=1}^n a_i S^*_i(T) - K \right)\right)^+, $$ donde el $T$ -precio a plazo de las acciones $i$ $$ F_i^T = S_i(0) \exp\left( \int_0^T (r(s) - d_i(s))ds \right), $$ $r(\cdot)$ y $d_i(\cdot)$ son los tipos de interés deterministas y la rentabilidad de los dividendos, $$ a_i=\frac{w_i F_i^T}{\sum_{i=1}^n w_i F_i^T}, \quad S_i^*=\frac{S_i(T)}{F_i^T}. $$ Aproximamos $\sum_{i=1}^n a_i S^*_i(T)$ por la media geométrica: $$ \overset{\sim}{B}(T) = \left( \sum_{i=1}^n w_i F^T_i \right) \prod_{i=1}^n (S_i^*(T))^{a_i}. $$
Para corregir la media, $$ K^* = K - (E(B(T)) - E(\overset{\sim}B(T))) $$ se introduce. Como aproximación para $(B(T) - K)^+$ , $(\overset{\sim}B(T) - K^*)^+$ que, como $\overset{\sim}B(T)$ tiene una distribución log-normal -- puede valorarse mediante la fórmula Black-Scholes que da como resultado $$ V_{Basket} (T) = e^{-rT}\theta\left( e^{\overset{\sim}m + \frac{1}{2} \overset{\sim}v^2} N(\theta d_1) - K^*N(\theta d_2)\right) , $$
$$V_{basket}^{call}(T) = e^{-r \cdot T} \cdot (e^{\tilde{m} + 0.5 \cdot \tilde{v}^2} \cdot N(d_1) - K^* \cdot N(d_2)) $$ y $$ V_{basket}^{put}(T) = e^{-r \cdot T} \cdot (K^* \cdot N(-d_2) - e^{\tilde{m} + 0.5 \cdot \tilde{v}^2} \cdot N(-d_1)), $$ $N(\cdot)$ la función de distribución de una variable aleatoria normal estándar y $$d_1 = \frac{\overset{\sim}m - \ln K^* + \overset{\sim}v^2}{\overset{\sim}v}, \quad d_2 = d_1 - \overset{\sim}v, $$ $$ \overset{\sim}m = E(\ln \overset{\sim}B(T)) = \ln \left(\sum^n_{i=1} w_i F^T_i \right) - \frac{1}{2} \sum^n_{i=1} a_i \sigma^2_i T$$ y $$ \overset{\sim}v^2 = Var(\ln \overset{\sim} B(T)) = \sum^{n}_{i=1}\sum^{n}_{j=1} a_ia_j \sigma_i \sigma_j \rho_{ij}T. $$
Los datos de entrada del artículo . El marco Black-Scholes es válido. Calcule los precios de la opción de compra sobre una cesta, con cuatro acciones y parámetros dados por $T = 5.0$ , $r = 0.0$ , $\rho_{ij} = 0.5, \forall i \neq j$ , $K = 100$ , $F^T_i = 100$ , $\sigma_i = 40\%$ y $w_i = 0.25$ , $i, j = 1,2,3,4$ .
Del artículo se desprende que el resultado es $23.78$ :
El código Python se encuentra a continuación.
import numpy as np
from scipy.stats import norm
exp = np.exp
log = np.log
sqrt = np.sqrt
N = norm.cdf
T = 5
r = 0
rho = np.ones((4, 4)) * 0.5 + np.eye(4) * 0.5
K = 100
F = np.array([100., 100., 100., 100.])
sigma = np.array([0.4, 0.4, 0.4, 0.4])
w = np.array([0.25, 0.25, 0.25, 0.25])
a = w * F / np.sum(w * F)
K_star = K
m_tilde = log(np.sum(w * F)) - 0.5 * np.sum(a * sigma ** 2 * T)
v_tilde = sqrt((a * sigma).T @ rho @ (a * sigma) * T)
d1 = (m_tilde - log(K_star) + v_tilde ** 2) / v_tilde
d2 = d1 - v_tilde
basket_call = exp(-r * T) * (exp(m_tilde + 0.5 * v_tilde ** 2) * N(d1) - K_star * N(d2))
print('Basket call price:', basket_call)
Precio de compra de la cesta: 19,294903017034283. Lamentablemente, no puedo reproducir el resultado del artículo.
Pregunta. ¿Podría alguien verificar el código Python? Creo que el lugar débil en el código es el comando: K_star = K
. ¿Cómo se especifica el K_star
¿correctamente?