Javascript 和 Python 之间的差异

Discrepancies between Javascript and Python

我有一道考试题,我必须使用 Black 和 Schole 公式找到看跌期权和看涨期权的 delta。

我找到了一个网站 http://www.deltaquants.com/calc-test 可以为我做这件事,所以我进入代码并找到了这个函数:

getDelta: function(spot, strike, volatility, riskfree, dividendy) {
    var self = this;
    var d1 = self.getD1(spot, strike, volatility, riskfree, dividendy);
    var Nd1 = phi(d1);
    // Interesting line
    var result = Math.exp( - dividendy * self.expiry) * (self.type !== 'put') ? Nd1 : (Nd1 - 1); 
    return result.toFixed(6);
}

我在 Python 中复制了它:

def delta(q, t, nd1, put: bool):
    return np.exp(- q * t) * (nd1 - 1 * put)

print(delta(.02, .25, .5279031701805211, True)) # -0.46974223705768553
print(delta(.02, .25, .5279031701805211, False)) # 0.5252702421349968

使用相同的输入(Nd1 = nd1, dividendy = q, self.expiry = t),JS代码returns -0.472097为put,0.527903为电话。

我重写了他们的 JS 代码以便在控制台中进行测试:

const delta = (q, t, nd1, type) => Math.exp(-q * t) * (type !== "put") ? nd1 : (nd1 - 1);

如果你像我在 python 中那样重写 JS:

const delta2 = (q, t, nd1, put) => Math.exp(-q * t) * (nd1 - 1 * put);
// Where put is a boolean

你得到的结果与我的 python 代码相同,似乎 Mat.exp 部分在他们的代码中总是被忽略。你知道为什么吗?

问题是三元运算符 (... ? ... : ...) 的运算符优先级低于乘法,因此如果您有一个表达式 A * B ? C : D,它会被解析为 (A * B) ? C : D 而不是比 A * (B ? C : D).

如果您添加括号以强调表达式的解析方式,您将得到以下结果:

    var result = (Math.exp( - dividendy * self.expiry) * (self.type !== 'put')) ? Nd1 : (Nd1 - 1);
    //           ^-------------------- added parentheses ---------------------^

这里可以看到包含Math.exp的表达式处于三元运算符的条件下,所以result的值将是Nd1Nd1 - 1.

我怀疑预期的计算是

    var result = Math.exp( - dividendy * self.expiry) * ((self.type !== 'put') ? Nd1 : (Nd1 - 1));
    //                                                  ^---------- added parentheses ----------^