1 votos

Ajuste de los parámetros dada una función inversa. (Orosi, 2015)

Estoy intentando replicar el modelo de volatilidad implícita de 5 parámetros de Orosi (2015), pero no consigo entender el procedimiento de ajuste de parámetros que propone Orosi. Mi objetivo principal es calibrar el modelo con mi conjunto de precios de compra observados, de modo que pueda derivar la función de densidad neutra del riesgo.

Considere que tengo observaciones empíricas de los precios de las llamadas, $c$ para una serie de precios de ejercicio, $x$ para un tiempo y una madurez determinados. Luego tengo que minimizar los errores al cuadrado:

$\sum_{i=1}^{n}(c(x_i)-c_i)^2$

Dónde $c(x_i)$ debe determinarse numéricamente a partir de la ecuación:

$x_i=1-c(x_i)+G\frac{(1-c(x_i))^\beta}{c(x_i)^\alpha}*(Ac(x_i)+1)^\gamma$

Con las siguientes limitaciones:

$G>0,\alpha>0,\beta>2,\gamma>1,0>A>-1$

Ahora estoy bastante cómodo con la minimización de la función objetivo en Python utilizando, por ejemplo, la función fmin de scipy, etc. Sin embargo, como señala el autor, como $c(x)$ se proporciona en un invertido manera " $c(x)$ tiene que ser derivado numéricamente usando una búsqueda de sección dorada o algo similar". No tengo ni idea de cómo hacerlo y de cómo implementarlo en un método "habitual" de minimización por mínimos cuadrados no lineales

Si alguien pudiera indicarme la dirección correcta o proporcionarme Python o pseudocódigo para que pueda resolverlo por mí mismo sería muy apreciado

3voto

ewindisch Puntos 246

Es necesario utilizar algún tipo de técnica de optimización dos veces. Una vez para resolver $c(x_i)$ y otra para minimizar el MSE. He añadido a continuación un hack rápido del problema donde se utiliza minimize_scalar para resolver $c(x_i)$ y el algoritmo de fuerza bruta se utiliza para resolver los parámetros que minimizan el MSE. Definitivamente hay mejores optimizaciones que se pueden utilizar, pero esto debería proporcionar la estructura que está buscando.

Palabras de advertencia: como se menciona en los comentarios, soy escéptico sobre si esto es utilizable en la práctica. Además, un problema de minimización global de 5 variables es muy difícil de resolver y sospecho que las soluciones serán poco fiables e inutilizables en la práctica.

Buena suerte.

from scipy import optimize

PRECISION = 1e-3

def error_c(c, params, x):
    error = abs(1-c+params[0]*((1-c)**params[2]/(c**params[1]))*(params[4]*c+1)**params[3]-x)
    return error

def get_c(x, params):
    c = optimize.minimize_scalar(error_c,
                                 bounds=(PRECISION, 1/PRECISION),
                                 method='bounded',
                                 args=(params, x),
                                 tol=PRECISION)
    return c.x

def mse(params, x, c):
    mse = 0
    for x_i, c_i in zip(x, c):
        mse += (get_c(x_i, params)-c_i)**2
    return(mse)

x = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0]
c = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0]

bounds = ((PRECISION, 1/PRECISION),
          (PRECISION, 1/PRECISION),
          (2+PRECISION, 1/PRECISION),
          (1+PRECISION, 1/PRECISION),
          (-1+PRECISION, -PRECISION))

result = optimize.brute(mse, ranges=bounds, args=(x, c), Ns=10)
print(result)

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