如何在嵌套字典中进行有效的循环,从而使字典最小化?

问题描述

我试图多次最小化一个函数。我开发了一个名为BlackScholesModel的类;此类包含要最小化的函数,即difference类中的方法BlackScholesModel

我创建了一个嵌套字典来保存每个类对象。嵌套字典的代码为:

expirations = ('2020-12-17','2021-12-16')
today = datetime.Now()
stock_price = stockquotes.Stock("^GSPC").current_price

BSM = {name:name for name in expirations}

for i,a in enumerate(expirations):
    strikeP = {count:count for count in range(0,len(expirations))}
    for j in range(0,len(strike[a])):
        strikeP[j] = BlackScholesModel(datetime.strptime(expirations[i],"%Y-%m-%d"),\
                                       today,stock_price,strike[a][j],\
                                       premium=call_premium[a][j])
    BSM[a] = strikeP

输出

{'2020-12-17': {0: <BlackScholesMerton.BlackScholesModel at 0x22deb7f5708>,1: <BlackScholesMerton.BlackScholesModel at 0x22debc805c8>,2: <BlackScholesMerton.BlackScholesModel at 0x22dec1312c8>},'2021-12-16': {0: <BlackScholesMerton.BlackScholesModel at 0x22debd324c8>,1: <BlackScholesMerton.BlackScholesModel at 0x22debd36088>,2: <BlackScholesMerton.BlackScholesModel at 0x22debd36fc8>,}}

具有这个嵌套的字典,我想遍历每个元素并最小化每个类方法difference;但是,len(BSM['2020-12-17'])是93,而len(BSM['2021-12-16'])是50。我有以下代码

implied_vol = {name:name for name in expirations}

x0 = 1

for i,len(BSM[a])):
        strikeP[j] = minimize(BSM[a][j].difference,x0)['x']
    implied_vol[a] = strikeP

由于大量事务,计算机无法完成此操作。我试图找到一种使我的代码更高效的方法。我想以类似于嵌套字典BSM的格式存储每个最小结果。任何帮助或想法都非常欢迎。

解决方法

毛里西奥

您是否尝试估计函数minimize(BlackScholesModel.difference,x0)的平均执行时间?有了这个估算的数量,是否可以执行所需的最小化数量?

假设可以在合理的时间内执行此操作,则可以通过并行执行来更快地执行此操作:

from joblib import Parallel,delayed

def minimize_expiration(expiration_dict):
    strikeP = {}
    for i,bs in expiration_dict.items():
        strikeP[i] = minimize(bs.difference,x0)['x']
    return strikeP

N_JOBS = -1 # number of cores to use (-1 to use all available cores)
implied_vol_list = Parallel(n_jobs=N_JOBS,verbose=1)(delayed(minimize_expiration)(BSM[expiration]) for expiration in expirations)

IV = {expiration: iv for expiration,iv in zip(expirations,implied_vol_list)}

如果BlackScholesModel的实现不可序列化,则这种方法可能会遇到问题