可以用 dict 或 sth 替换函数中的关键字吗?

问题描述

我有一个带有大量预定义参数函数(runstrat 函数中的 test.addstrategy)。

我想将关键字selcperc=p1、mperiod=int(p2) 更改为rperiodzperiod。这些也是 St 函数中的参数。

例如像 globalparams dict 这样的 dict 是否可能?

globalparams = dict(fromdate=datetime.datetime(2005,11,3),todate=datetime.datetime(2020,6,18),strategy="St",#Heatmap section
                    heatmap=True,heatmapparams= {'selcperc': "p1"},heatmapparams2= {'mperiod': "int(p2)",'printlog': "False"},)

if globalparams["heatmap"]:
    results_list = []
    for i in np.arange(0.02,0.12,0.02):
        for j in np.arange(60,250,10):
            PnL = runstrat(p1=i,p2=j)
            results_list.append([i,j,i,PnL])
    my_heatmap1(results_list)
    return

def runstrat(p1,p2):
    test= bt.Cerebro()
    test.addstrategy(eval(globalparams["strategy"],selcperc=p1,mperiod=int(p2),printlog=False)

    for fname in glob.glob(os.path.join(globalparams["path"],'*')):
        df = pd.read_csv(fname,index_col=0,parse_dates=True)
        if len(df)>200:
            test.adddata(bt.Feeds.PandasData(dataname=df,name=os.path.basename(fname).replace(".csv",""),fromdate=fromdate,todate=todate,plot=False))        

    test.run(maxcpus=0)
    return test.broker.getvalue()

                     
def my_heatmap1(data):
    data = np.array(data)
    xs = np.unique(data[:,1].astype(int))
    ys = np.unique(data[:,0].astype(float))
    vals = data[:,3].reshape(len(ys),len(xs))
    min_val_ndx = np.unravel_index(np.argmin(vals,axis=None),vals.shape)
    max_val_ndx = np.unravel_index(np.argmax(vals,vals.shape)

    cmap = LinearSegmentedColormap.from_list('',['red','orange','yellow','chartreuse','limegreen'])
    ax = sns.heatmap(vals,xticklabels=xs,yticklabels=ys,cmap='viridis',annot=True,fmt='.2f')

    ax.add_patch(Rectangle(min_val_ndx[::-1],1,fill=False,edgecolor='blue',lw=3,clip_on=False))
    ax.add_patch(Rectangle(max_val_ndx[::-1],clip_on=False))
    print(data)
    plt.tight_layout()
    plt.show()

St 是另一个非常冗长的课程。

编辑:

我现在通过 incl 做了一个糟糕的解决方法。我可能想要更改的所有参数。在全局参数中,我设置了一个包含所有案例的字典,它将用相关案例替换参数...

解决方法

关键字由被调用的函数定义,调用者无法更改它们。