3 votos

En C# Utilizando Black Scholes Newton devuelve NaN ocasionalmente

Primera advertencia: yo soy un programador de hacer esto para un cliente, y mi conocimiento de las opciones probablemente tiene agujeros en ella. Así que ser un poco indulgente aquí. =)

El Problema: Cuando ejecuto Black Scholes Newton en contra de todas las opciones en una cadena, a veces tengo NaN valores de retorno. Mi comparación de la precisión está en contra de ThinkorSwim números.

Aquí están las capturas de pantallas en el tema: http://imgur.com/a/cItIj

lugar, la huelga, el tiempo, etc, son todo lo que hay. Y la mayoría del tiempo los números son exactos. Pero una vez que llegan a ciertos rangos con Llamadas y Pone, tengo los de NaN, y me parece que no puede encontrar el patrón en cuanto a por qué

Estoy usando garagebandhedgefund del código como base, con ajustes para la pone/llamadas.

Aquí está el método de Newton Código:

 public static double OptionPriceImpliedVolatilityCallBlackScholesNewton(double S, double K, double r, double time, double optionPrice,bool iscall, bool isput,out double price,out double diff)
    {
        price = 0;
        diff = 0;
        int MAX_ITERATIONS = 100;
        double ACCURACY = 1.0e-5;
        double t_sqrt = Math.Sqrt(time);
        double sigma = (optionPrice / S) / (0.398 * t_sqrt);    // find initial value  
         price = 0;
        for (int i = 0; i < MAX_ITERATIONS; i++)
        {
            if (iscall)
            {
                 price = OptionPriceCallBlackScholes(S, K, r, sigma, time);
            }
            if (isput)
            {
                 price = OptionPricePutBlackScholes(S, K, r, sigma, time);
            }
            diff = optionPrice - price;
            if (Math.Abs(diff) < ACCURACY)
                return sigma;
            double d1 = (Math.Log(S / K) + r * time) / (sigma * t_sqrt) + 0.5 * sigma * t_sqrt;
            double vega = (S * t_sqrt * NormDist(d1));
            sigma = sigma + diff / vega;
        }
        return sigma;  // something screwy happened, should throw exception  // <--- original code  
        //throw new Exception("An error occurred"); // Comment this line if you uncomment the line above  
    }

Mi pregunta: ¿Es mi código? Es de ciertos rangos de valores? Hay casos donde Newton no puede devolver valores válidos? Yo soy un poco sacado de aquí.

Para el registro, cuando puedo utilizar estos datos en contra de garageband la Interseccion de código, me da errores a través de la junta. No sé si esto está relacionado. Estoy bastante seguro de la veracidad de mis datos de entrada, ya que tengo algunos válido regresa con Newton.

7voto

Nicolas Puntos 8

La opción de los precios no puede ser convertida a la volatilidad. E. g. Una oferta para un en-el-dinero de la llamada que está por debajo de su valor intrínseco. Así que a veces NaN es una respuesta válida. La mejor manera de manejarlo es hacer precursores de los cheques antes de bajar a la búsqueda de bucle.

1voto

Benjamin Puntos 99

.NET dobles regresar double.NaN cuando haces las cosas como dividir cero por cero. Con dobles, nada menos que double.Epsilon es de "cero" para el propósito de este resultado.

Sugiero que su vega es menor que double.Epsilon

¿Qué sucede si ejecuta el mismo método que utiliza decimal lugar?

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