2 votos

Replicando opción de compra por efectivo y acciones bajo el modelo de BS

Supongamos que estamos en un mercado siguiendo el modelo Black-Scholes (BS), y queremos usar efectivo y acciones para replicar una opción de compra.
Realizamos la expansión de Taylor del precio de la llamada $ V $ con respecto al precio de la acción $ S $: $$ V(S_t + s) = V(S_t) + \Delta_{S_t}s + \frac{1}{2}s^2\Gamma_{S_t} + o(s^2). $$ De esto, deducimos la siguiente desigualdad:
$$ V(S_t + s) - V(S_t) > \Delta_{S_t}s \quad\quad\quad (1). $$
Nuestra cartera de replicación está dada por:
$$ \Pi = x + \sum_{t=1}^{T} \Delta_{t-1}(S_t - S_{t-1}), $$
donde $x$ es el precio de la llamada en el momento $ t=0 $.

Mi pregunta es: en cada momento $ t $, si mi entendimiento es correcto, $V$ debería dominar a $ \Pi $ según la ecuación (1). Sin embargo, el gráfico muestra un patrón inverso. ¿Alguien puede explicar por qué el gráfico muestra este comportamiento?

enter image description here

Código:

import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm
rng = np.random.default_rng()
class BS_path:
  def __init__(self, mu, sigma, n_path, n_timestep, S_0, T):
    self.mu = mu
    self.sigma = sigma
    self.n_path = n_path
    self.n_timestep = n_timestep
    self.dt = T/self.n_timestep
    self.t = np.linspace(0,T,n_timestep+1)
    self.normal = rng.standard_normal(size=(n_path,n_timestep))
    self.initial = S_0
    self.w = np.concatenate((np.zeros((n_path, 1)), np.cumsum(self.normal * np.sqrt(self.dt), axis=1)), axis=1) # Camino de Movimiento Browniano
    self.var = S_0**2 * np.exp(2*mu*T) * (np.exp(sigma**2*T) - 1)
    self.mean = S_0 * np.exp(mu*T)

  def stock_path(self,plot = False):
    S = self.initial * np.exp((self.mu - 0.5 * self.sigma**2) * self.t + self.sigma * self.w)
    return S

class hedging_simulator(BS_path):
    def __init__(self, mu, sigma, n_path, n_timestep, S_0, T, strike):
        super().__init__(mu, sigma, n_path, n_timestep, S_0, T)
        self.maturity = T - self.t
        self.strike = strike

    def theoretical_price(self):
        S_t = self.stock_path()
        K = self.strike
        ds = np.diff(S_t)
        r = self.mu
        sigma = self.sigma

        d1 = (np.log(S_t / K) + (r + 0.5 * sigma**2) * self.maturity) / (sigma * np.sqrt(self.maturity) + 1e-9)
        d2 = d1 - sigma * np.sqrt(self.maturity)

        call_price = S_t * norm.cdf(d1) - K * np.exp(-r * self.maturity) * norm.cdf(d2)
        delta = norm.cdf(d1)
        return call_price, delta, ds, S_t

    def delta_hedge(self):
      call_price, delta, ds, _ = self.theoretical_price()
      x = call_price[0,0]
      portfolio = x + np.cumsum(delta[0,:-1] * ds)
      plt.figure(figsize=(10, 5),dpi = 120)
      plt.plot(self.t[1:], call_price[0,1:], label='precio de la opción')
      plt.plot(self.t[1:], portfolio, label='cartera de cobertura', linestyle='--')
      plt.title('Proceso de cobertura')
      plt.xlabel('Tiempo')
      plt.ylabel('precio')
      plt.legend()
      plt.grid(True)
      plt.show()

hs = hedging_simulator(mu = .05, sigma=0.16, n_path=1, n_timestep=1000, S_0=100, T = 1, strike = 100)
hs.delta_hedge()

4voto

user65759 Puntos 1

Sin haber leído tu código, ¿qué pasó con el theta de la opción? Aquí es donde creo que te equivocaste.

En general, cualquier derivación que resulte en la "conclusión" de que la cartera de replicación autofinanciada domina o es dominada por el derivado para todos los caminos es falaz porque eso implicaría arbitraje.

Si tienes en cuenta el theta, y para simplificar ignorando la especificación errónea del modelo y los intervalos de cobertura discretos, lo que llegarás a es $$ V(S_T,K, T) = V(S_t,K,t) + \int_t^T \Delta(S_u,K,u) dS_u $$

Claramente esto no implica tu ecuación (1) $$ dV(S_t,K,t) > \Delta(S_t,K,t) dS_t $$

Finanhelp.com

FinanHelp es una comunidad para personas con conocimientos de economía y finanzas, o quiere aprender. Puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X