3 votos

Implementaciones de Black Scholes y Monte Carlo en Java

Posible duplicado:
¿Existe alguna biblioteca de precios de opciones en Java (preferiblemente de código abierto) además de jquantlib?

¿Puede alguien recomendar una biblioteca con una implementación de Black Scholes y Monte Carlo en Java? Idealmente algo que sea sólo Java y no requiera una dll de C++ o .so o .lib etc..

He publicado una pregunta similar sobre el código abierto y las opciones parecen ser bastante limitadas hasta ahora:

Quantlib - C++ usando SWIG o similar para comunicarse con JVM JQuantLib - puerto de QuantLib a Java puro, pero no puede acceder al sitio desde hace 2 días. finmath.net - Parece ser todo java y es prometedor, pero se encuentran problemas para ejecutar los applets que lo utilizan.

Actualmente, esto es para la fijación de precios de opciones muy simples de tipo vainilla en euros. Pero debe estar abierto a la complejidad que seguramente vendrá prob. requiriendo Monte Carlo u otros modelos de fijación de precios.

Gracias de antemano.

1voto

kjv Puntos 2513

Este está en C#, pero podría ayudarte a crear el tuyo en Java: Problema de divergencia con mi monte carlo pricer...

using System;
using System.Threading.Tasks;
using MathNet.Numerics.Distributions;
using MathNet.Numerics.Random;

namespace MonteCarlo
{
    class VanillaEuropeanCallMonteCarlo
    {
        static void Main(string[] args)
        {
            const int NUM_SIMULATIONS = 10000000;
            const decimal strike = 50m;
            const decimal initialStockPrice = 52m;
            const decimal volatility = 0.2m;
            const decimal riskFreeRate = 0.05m;
            const decimal maturity = 0.5m;
            Normal n = new Normal();
            n.RandomSource = new MersenneTwister();

            VanillaEuropeanCallMonteCarlo vanillaCallMonteCarlo = new VanillaEuropeanCallMonteCarlo();

            Task<decimal>[] simulations = new Task<decimal>[NUM_SIMULATIONS];

            for (int i = 0; i < simulations.Length; i++)
            {
                simulations[i] = new Task<decimal>(() => vanillaCallMonteCarlo.RunMonteCarloSimulation(strike, initialStockPrice, volatility, riskFreeRate, maturity, n));
                simulations[i].Start();
            }

            Task.WaitAll(simulations);

            decimal total = 0m;

            for (int i = 0; i < simulations.Length; i++)
            {
                total += simulations[i].Result;
            }

            decimal callPrice = (decimal)(Math.Exp((double)(-riskFreeRate * maturity)) * (double)total / (NUM_SIMULATIONS * 2));

            Console.WriteLine("Call Price: " + callPrice);
            Console.WriteLine("Difference: " + Math.Abs(callPrice - 4.744741008m));
        }

        decimal RunMonteCarloSimulation(decimal strike, decimal initialStockPrice, decimal volatility, decimal riskFreeRate, decimal maturity, Normal n)
        {
            decimal randGaussian = (decimal)n.Sample();
            decimal endStockPriceA = initialStockPrice * (decimal)Math.Exp((double)((riskFreeRate - (decimal)(0.5 * Math.Pow((double)volatility, 2))) * maturity + volatility * (decimal)Math.Sqrt((double)maturity) * randGaussian));
            decimal endStockPriceB = initialStockPrice * (decimal)Math.Exp((double)((riskFreeRate - (decimal)(0.5 * Math.Pow((double)volatility, 2))) * maturity + volatility * (decimal)Math.Sqrt((double)maturity) * (-randGaussian)));
            decimal sumPayoffs = (decimal)(Math.Max(0, endStockPriceA - strike) + Math.Max(0, endStockPriceB - strike));
            return sumPayoffs;
        }
    }
}

0voto

m0j0 Puntos 21

Podrías probar a ver si NAG podría adaptarse a sus necesidades como sugerí en este puesto .

No es gratuito, pero creo que es una herramienta bastante buena para abordar problemas de cualquier complejidad.

Sin embargo, no lo he probado personalmente.

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