计算javascript中的隐含波动率

我正在尝试使用javascript计算隐含波动率,我有以下代码

function pdf_stdgauss(x) {
    return Math.exp(-x * x / 2.0) / Math.sqrt(2.0 * Math.PI);
}

function cdf_stdgauss(x) {
    var t = 1.0 / (1.0 + 0.2316419 * (x < 0 ? -x : x));
    var b1 = 0.319381530;
    var b2 = -0.356563782;
    var b3 = 1.781477937;
    var b4 = -1.821255978;
    var b5 = 1.330274429;
    var a = t * (b1 + t * (b2 + t * (b3 + t * (b4 + t * b5))));
    return (x < 0 ? a * pdf_stdgauss(x) : (1.0 - a * pdf_stdgauss(x)));
}



function ecp(s,x,rfi,dvd,sigma,t) {
    var sst = sigma * Math.sqrt(t);
    var d1 = (Math.log(s / x) + (rfi - dvd + sigma * sigma / 2.0) * t) / sst;
    var d2 = d1 - sst;
    var Nd1 = cdf_stdgauss(d1);
    var Nd2 = cdf_stdgauss(d2);
    var pd1 = pdf_stdgauss(d1);
    var pd2 = pdf_stdgauss(d2);
    var erfi = Math.exp(-rfi * t);
    var edvd = Math.exp(-dvd * t);
    var c = s * edvd * Nd1 - x * erfi * Nd2;
    var p = c + x * erfi - s * edvd;
    var cdelta = edvd * Nd1;
    var pdelta = cdelta - edvd;
    var gamma = edvd * pd1 / (s * sst);
    var ctheta = dvd * s * edvd * Nd1 - rfi * x * erfi * Nd2 - 0.5 * sigma * sigma * s * s * gamma;
    var ptheta = ctheta + rfi * x * erfi - dvd * s * edvd;
    var vega = s * edvd * pd1 * Math.sqrt(t);
    var crho = x * erfi * Nd2 * t;
    var prho = x * erfi * (Nd2 - 1.0) * t;
    var cdvd = -s * edvd * Nd1 * t;
    var pdvd = s * edvd * (1.0 - Nd1) * t;
    return [c,cdelta,gamma,ctheta,vega,crho,cdvd,p,pdelta,ptheta,prho,pdvd];
}

function implied_volatility(i,s,t) {
    var cv = function(sigma) {
        var sst = sigma * Math.sqrt(t);
        var d1 = (Math.log(s / x) + (rfi - dvd + sigma * sigma / 2.0) * t) / sst;
        var d2 = d1 - sst;
        var Nd1 = cdf_stdgauss(d1);
        var Nd2 = cdf_stdgauss(d2);



        if (i == 7) {
            Nd1 = Nd1 - 1.0;
            Nd2 = Nd2 - 1.0;
        }
        return s * Math.exp(-dvd * t) * Nd1 - x * Math.exp(-rfi * t) * Nd2 - p;
    };
    var cvp = function(sigma) {
        var sst = sigma * Math.sqrt(t);
        var d1 = (Math.log(s / x) + (rfi - dvd + sigma * sigma / 2.0) * t) / sst;
        return s * Math.exp(-dvd * t) * pdf_stdgauss(d1) * Math.sqrt(t);
    };
    return newt_root(0.2,cv,cvp,0.000001);
}

function newt_root(x,f,fp,tol) {
    var x0;
    for (x0 = x; Math.abs(f(x0)) > tol; x0 -= f(x0) / fp(x0));
    return x0;
}

var dayselect = 23;
var monthselect = 1;
var yearselect = 2020;


function calculate_time2expire() {
    var today = new Date();
    var eday = parseInt(dayselect);
    var emonth = parseInt(monthselect);
    var edate = new Date(yearselect,emonth - 1,eday);
    var days = Math.ceil((edate.getTime() - today.getTime()) / 86400000);
    return days / 365.0;
}

它在大多数执行价格上都起作用,但是有时我得到Infinity或-Infinity作为输出。

我跑步时

var ceiv = 100.0 * implied_volatility(0,624.65,12352.35,11750,0.069,0,0.03287671232876712)

它返回无穷大

但是其他罢工价格给出了正确的IV,例如,如果我跑步

var ceiv = 100.0* implied_volatility(0,1521.75,31590,30100,0.069,0.0136986301369863)

它给出19.08

这是参数

implied_volatility(callput,optionprice,spotprice,strikeprice,riskfreeinterest/100,dividend,daytoexpireinyear)
sydth 回答:计算javascript中的隐含波动率

您的结果基本上是0.1 * 0.5 ^ 100,这是通过调用estimate = (estimate - low) / 2 + low 100次而得出的。您的初始估计为0.1,从而导致blackScholes的w非常大,这将导致stdNormCDF返回的具有w作为输入一部分的概率始终为1。因此,即使在迭代期间,价格也不会改变估计变得越来越小。

本文链接:https://www.f2er.com/2755717.html

大家都在问