Exemple #1
0
    public static double Delta(double S, double t0, BSOption opt)
    {
        double T       = opt.gettimeexp();
        double K       = opt.getstrike();
        double vol     = opt.getvolatility();
        double q       = opt.getyield();
        double r       = opt.getriskfreerate();
        string opttype = opt.getoption();
        double dvalue;
        double d1 = (Math.Log(S / K) + (r - q + 0.5 * Math.Pow(vol, 2)) * (T - t0)) / (vol * Math.Sqrt(T - t0));
        double d2 = d1 - vol * Math.Sqrt(T - t0);

        if (S <= 0 || K <= 0 || vol <= 0 || T - t0 <= 0)
        {
            dvalue = 0;
        }
        if (opttype == "call")
        {
            dvalue = Math.Round(Math.Exp(-q * (T - t0)) * (RandLib.NormalCDF((Math.Log(S / K) + (r - q + 0.5 * Math.Pow(vol, 2)) * (T - t0)) / (vol * Math.Sqrt(T - t0)))), 4);
        }
        else
        {
            dvalue = Math.Round(Math.Exp(-q * (T - t0)) * (RandLib.NormalCDF((Math.Log(S / K) + (r - q + 0.5 * Math.Pow(vol, 2)) * (T - t0)) / (vol * Math.Sqrt(T - t0)))) - 1, 4);
        }
        return(dvalue);
    }
Exemple #2
0
    public static bool BSImpvol(double S, double t0, double target, int max_iter, double Opt_tol, double vol_tol, ref double impvol, BSOption opt)
    {
        bool   bool_value = true;
        double T          = opt.gettimeexp();
        double K          = opt.getstrike();
        double vol        = opt.getvolatility();
        double q          = opt.getyield();
        double r          = opt.getriskfreerate();
        double vol_in     = 0.4;
        double vol_f      = 0;
        string opttype    = opt.getoption();
        double V;
        double vega;
        double d1 = (Math.Log(S / K) + (r - q + 0.5 * Math.Pow(vol, 2)) * (T - t0)) / (vol * Math.Sqrt(T - t0));
        double d2 = d1 - vol * Math.Sqrt(T - t0);

        for (int i = 0; i <= max_iter; i++)
        {
            if (opttype == "call")
            {
                V = S * Math.Exp(-q * (T - t0)) * RandLib.NormalCDF(d1) - K * Math.Exp(-r * (T - t0)) * RandLib.NormalCDF(d2);
            }
            else
            {
                V = K * Math.Exp(-r * (T - t0)) * RandLib.NormalCDF(-d2) - S * Math.Exp(-q * (T - t0)) * RandLib.NormalCDF(-d1);
            }
            vega = S * Math.Exp(-q * (T - t0)) * RandLib.NormalPDF(d1) * Math.Sqrt(T - t0);
            if (i == 0)
            {
                vol_f = vol_in - (V - target) / vega;
            }
            else
            {
                if (Math.Abs(V - target) <= Opt_tol && Math.Abs((vol_f - vol_in)) <= vol_tol)
                {
                    vol_f = vol_in;
                    vol_f = vol_in - (V - target) / vega;
                }
            }
        }
        impvol = vol_f;
        return(bool_value);
    }
Exemple #3
0
    public static double Theta(double S, double t0, BSOption opt)
    {
        double T       = opt.gettimeexp();
        double K       = opt.getstrike();
        double vol     = opt.getvolatility();
        double q       = opt.getyield();
        double r       = opt.getriskfreerate();
        string opttype = opt.getoption();
        double thetavalue;
        double d1 = (Math.Log(S / K) + (r - q + 0.5 * Math.Pow(vol, 2)) * (T - t0)) / (vol * Math.Sqrt(T - t0));
        double d2 = d1 - vol * Math.Sqrt(T - t0);

        if (S <= 0 || K <= 0 || vol <= 0 || T - t0 <= 0)
        {
            thetavalue = 0;
        }
        if (opttype == "call")
        {
            thetavalue = Math.Round(((-S * Math.Exp(-q * (T - t0)) * RandLib.NormalPDF(d1) * 0.5 * vol / (Math.Sqrt(T - t0))) + q * S * Math.Exp(-q * (T - t0)) * RandLib.NormalCDF(d1) - r * K * Math.Exp(-r * (T - t0)) * RandLib.NormalCDF(d2)) / 365, 4);
        }
        else
        {
            thetavalue = Math.Round((-S * Math.Exp(-q * (T - t0)) * RandLib.NormalPDF(d1) * 0.5 * vol / (Math.Sqrt(T - t0)) + r * K * Math.Exp(-r * (T - t0)) * RandLib.NormalCDF(-d2) - q * S * Math.Exp(-q * (T - t0)) * RandLib.NormalCDF(-d1)) / 365, 4);
        }
        return(thetavalue);
    }