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.