如何将定义在函数外部、循环中的变量输入到函数中?

Posted

技术标签:

【中文标题】如何将定义在函数外部、循环中的变量输入到函数中?【英文标题】:How do you input variables defined outside of a function, in a loop, into a function? 【发布时间】:2021-09-22 01:05:30 【问题描述】:

我正在对 pandas 中的一些交易策略进行回测,并定义了函数:

def TakeOutDuplicates(DataFrame):
    Buy = []
    Sell = []
    flag = -1
    for i in range(len(DataFrame)-1):
        if DataFrame[ (takeOutThisStrategys[x][Time][j+1]) ][i] == "Buy":
            Sell.append(np.nan)
            if flag != 1:
                Buy.append(DataFrame["Open"][i+1])
                flag=1
            else: 
                Buy.append(np.nan)
        elif DataFrame[ (takeOutThisStrategys[x][Time][j+1]) ][i] == "Sell":
            Buy.append(np.nan)
            if flag != 0:
                Sell.append(DataFrame["Open"][i+1])
                flag=0
            else: 
                Sell.append(np.nan)
        else:
            Buy.append(np.nan)
            Sell.append(np.nan)
    return(Buy, Sell)

它在我的数据框中搜索特定列并将买入和卖出信号减少到一个系列中,这样我就可以分析它的买入价格和卖出价格,而不是看到它告诉我连续购买 30 次,它只是在第一次说买时记录买入价,然后在说卖出时说卖出价。

我正在运行以调用此函数的循环是:

for Time in TimePeriods:  # TimePeriods = [5, 15, 60, 240, 1440] (in minutes)
    for j in range(savedi-1):      # savedi = 15
        takeOutThisStrategys[x][Time][j+1] = f"Strategy j+1 on Time Mins"
        replaces[x][Time][j+1] = TakeOutDuplicates(df)

如您所见,我想将我的字典替换为从函数 TakeOutDuplicates 返回的买入和卖出价格。除非我运行它并检查我的字典,如下所示:

检查 5 分钟的时间范围:

replaces[x][5]

1: ([14185.11,
   nan,
   nan,
   14185.03,
   nan,
   nan,
   nan,
   nan,
   nan,
   nan,
   nan,
   nan,
   nan,
   nan,
   nan,
   nan,
   nan,
   14121.72,...])

现在检查 240 分钟(4 小时)的时间范围。

replaces[x][240]

1: ([14185.11,
   nan,
   nan,
   14185.03,
   nan,
   nan,
   nan,
   nan,
   nan,
   nan,
   nan,
   nan,
   nan,
   nan,
   nan,
   nan,
   nan,
   14121.72,...])

正如您所看到的,所有买入和卖出信号都是相同的,这不是应该的,这意味着当我运行我的循环时,它不会获取 Time 和 j 的变量,然后将它们输入到我的函数中,正如我所预料的那样。我该如何解决这个问题?

【问题讨论】:

我不肯定这会解决问题,但您应该将这些变量作为函数参数并显式传递而不是隐式传递。至少它会使调试更容易。 所以我也尝试了 def TakeOutDuplicates(DataFrame, Time, j): 但是没用,你是这个意思吗? 您可能还想传入xtakeOutThisStrategys,因为它们没有在函数内部定义——或者您可以通过传入takeOutThisStrategys[x][Time][j+1] 来简化它?然后你可以在你的函数中打印出来,看看它是否每次都在更新。不过,我怀疑实际问题出在df 很遗憾这个解决方案不起作用,不知道现在还能尝试什么 【参考方案1】:

我设法解决了这个问题,但问题在于,当我定义我的策略时,我忘了乘以我的时间段:

所以我有这个:

df.loc[( (df[str(length*1) + " MA"] > df[str(l*1) + " MA"]) & (df["Close"] > df[str(l*1) + " MA"])), f"Strategy i on Time Mins"] = "Buy"

而不是这个:

df.loc[( (df[str(length*Time) + " MA"] > df[str(l*Time) + " MA"]) & (df["Close"] > df[str(l*Time) + " MA"])), f"Strategy i on Time Mins"] = "Buy"

【讨论】:

以上是关于如何将定义在函数外部、循环中的变量输入到函数中?的主要内容,如果未能解决你的问题,请参考以下文章

Loop函数将不准确的值添加到变量,并且在跟踪代码时未定义数组。如何解决?

如何在Python中定义静态变量

Matlab如何在定义函数过程中使用外部的变量?

Python:将字典中的变量加载到命名空间中

php作用域

如何将自定义函数加载到 R 中的 foreach 循环中?