我正在使用 Julia 的Zygote.jl
包来计算期权希腊字母(即期权价格相对于参数的导数)的自动差异能力。请参阅下面使用 Black Scholes 计算看涨期权的希腊字母。在我的笔记本电脑上运行需要 40 秒。我做错了什么会导致它花费这么多时间吗?
我的猜测是,当Zygote
必须通过 进行区分时,困难的部分就来了Distributions
,但我不确定。
using Distributions
using Zygote
function bs_call(theta)
s = theta[1]
k = theta[2]
r = theta[3]
t = theta[4]
sigma = theta[5]
vol = sigma * sqrt(t)
d1 = (log(s / k) + (r + 0.5 * sigma ^ 2) * t) / vol
d2 = d1 - vol
n = Normal()
price = cdf(n, d1) * s - cdf(n, d2) * k * exp(-1.0 * r * t)
price
end
function main()
theta = [100, 110, .20, 1.0, .50]
println(bs_call(theta))
println(bs_call'(theta))
end
main()
编辑:使用SpecialFunctions
(to build a cdf
function from erf
) 而不是Distributions
让我缩短到 25 秒。见下文:
using SpecialFunctions
using Zygote
function cdf(x)
0.5 * (1 + erf(x / sqrt(2)))
end
function bs_call(theta)
s = theta[1]
k = theta[2]
r = theta[3]
t = theta[4]
sigma = theta[5]
vol = sigma * sqrt(t)
d1 = (log(s / k) + (r + 0.5 * sigma ^ 2) * t) / vol
d2 = d1 - vol
price = cdf(d1) * s - cdf(d2) * k * exp(-1.0 * r * t)
price
end
function main()
theta = [100.0, 110.0, .20, 1.0, .50]
println(bs_call(theta))
println(bs_call'(theta))
end
main()