Python 的 List 对象中的收敛点

我有一个列表对象,它基本上采用两个值之间的差异。这是优化问题,我试图找出接近零的值,以便我可以找到局部最小值。列表对象的值应为 [-100,-90,-80,...0.0001,...80,90,100]。

import numpy as np
import scipy.stats as sp

def BSM_Call(S,K,T,r,Sigma):
    d1 = (np.log(S/K) + (r+Sigma**2/2)*T) / (Sigma*np.sqrt(T))
    d2 = d1 - (Sigma*np.sqrt(T))
    Call = S*sp.norm.cdf(d1) - K*np.exp(-r*T)*sp.norm.cdf(d2)
    return Call 

ini_vol = 0.0001
rng = np.arange(0.0001,1,0.0001)
diff = []
for i in range(len(rng)):
    diff.append(67.33923210204784 - BSM_Call(4395.26,4400,31/365,ini_vol+rng[i]))   

一旦确定了优化点,我想获取对应的 ini_vol+rng[i] 值。

WUDEjiyi123 回答:Python 的 List 对象中的收敛点

在我看来,您正在尝试找到使结果最接近零的 Sigma 值(在从 BSM_Call 和常量 67.339 中减去返回值之后...)。假设是这种情况,我会这样做:-

import numpy as np
import scipy.stats as sp


def BSM(S,K,T,r,Sigma):
    _St = Sigma * np.sqrt(T)
    d1 = (np.log(S / K) + (r + Sigma**2 / 2) * T) / _St
    return S * sp.norm.cdf(d1) - K * np.exp(-r * T) * sp.norm.cdf(d1 - _St)


lo = None
ini = None
for i in range(1,10000):
    ini_vol = i / 10000
    bsm = BSM(4395.26,4400,31 / 365,ini_vol)
    diff = 67.33923210204784 - bsm
    adiff = abs(diff)
    if lo is None or adiff < lo:
        lo = diff
        ini = ini_vol
        if lo == 0:
            break
print(f'ini_vol = {ini:.4f}')

请注意,我已将 BSM_Call 更改为 BSM,以突出其中的微小效率改进。另请注意,无需构建列表,因为您可以在循环中进行计算。有可能提前休息,所以我已经允许了

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

大家都在问