0

编写一个 python 脚本来计算 Implied Normal Vol ;符合 Jekel 文章(行业标准)。

https://jaeckel.000webhostapp.com/ImpliedNormalVolatility.pdf

他们说他们正在使用广义不完全伽马函数逆。

来电:

F(x)=v/(K - F) -> 找到使这成为真的 x

其中 F 是逆不完全 Gamma 函数

并且 x = (K - F)/(T*sqrt(T) ; v 是调用的值

对于那个 x,IV 是 =(KF)/x*sqrt(T)

我正在使用的示例:

F=40

X=38

T=100/365

v=5.25

音量= 20%

使用方程式我应该能够回退 20% 的 Vol

Scipy 在其特殊功能中有上下不完全 Gamma Function Inverse。

较低: scipy.special.gammaincinv(a, y) :{a 必须是正参数}

上: scipy.special.gammainccinv(a, y) : {a 必须是正参数}

Implementation:

SIG= sympy.symbols('SIG')
F=40
T=100/365
K=38

def Objective(sig):
    SIG=sig
    return(special.gammaincinv(.5,((F-K)**2)/(2*T*SIG**2))+special.gammainccinv(.5,((F-K)**2)/(2*T*SIG**2))+5.25/(K-F))

x=optimize.brentq(Objective, -20.00,20.00, args=(), xtol=1.48e-8, rtol=1.48e-8, maxiter=1000, full_output=True)


IV=(K-F)/x*T**.5

Print(IV)

我知道我错了,但是我哪里错了/我该如何解决它并使用我在文章中读到的内容?

4

1 回答 1

0

您是否也在Quantitative Finance Stack Exchange上发布了此内容?你可能会在那里得到更好的回应。

这不是我的领域,但看起来你的主要问题是brentq要求传递的函数在传递and参数Objective时返回具有相反符号的值。但是,这最终不会发生,因为根据 scipy 文档,gammaincinvgammainccinv总是返回一个介于 0 和无穷大之间的值。-2020

不幸的是,我不确定如何解决这个问题。您是否尝试在论文的第二部分实施解析解决方案(而不是迭代求根)?

于 2020-06-05T01:39:53.207 回答