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
的值将是Nd1
或Nd1 - 1
.
我怀疑预期的计算是
var result = Math.exp( - dividendy * self.expiry) * ((self.type !== 'put') ? Nd1 : (Nd1 - 1));
// ^---------- added parentheses ----------^
我有一道考试题,我必须使用 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
的值将是Nd1
或Nd1 - 1
.
我怀疑预期的计算是
var result = Math.exp( - dividendy * self.expiry) * ((self.type !== 'put') ? Nd1 : (Nd1 - 1));
// ^---------- added parentheses ----------^