如何根据数据帧数据优化 objective 函数

How do I optimise an objective function based on dataframe data

我有一个 objective 函数,它采用时间序列数据的 numpy 数组,用于计算随时间数据的估计 return 投资。此函数如下所示:

def bwp(x, *processed):
    pred,real = x
    money = 1000
    for i in range(0, len(processed)):
        if processed[i, 3] > pred and processed[i-1,4] > real:
            money = money + (money * processed[i, 4])
    return money * -1

我想最小化这个函数,它既便宜又不连续,所以我想用暴力的方法来优化它。

我正在尝试使用以下代码对此进行优化:

def opt_2(processed):
    bounds = (slice(-1, 1), slice(-1, 1))
    resbrute = optimize.brute(bwp, ranges=bounds, args=processed, full_output=True, finish=optimize.fmin)
    print(resbrute[0])
    print(resbrute[1])

我收到错误:

File "<input>", line 5, in bwp
TypeError: tuple indices must be integers or slices, not tuple

我不确定 bwp 中是什么导致它崩溃

编辑:处理的输入是一个 numpy 数组而不是数据帧

编辑: 处理的数据样本是:

2.90381543e+03  2.91549000e+03 -1.16745703e+01  0.00000000e+00 0.00000000e+00 -8.35888672e+00
2.89545654e+03  2.92187000e+03 -2.64134570e+01 -2.87858747e-03 2.18831140e-03 -8.35888672e+00
2.89380762e+03  2.92918000e+03 -3.53723828e+01 -5.69487318e-04 2.50182246e-03 -1.64892578e+00
2.89789600e+03  2.92579000e+03 -2.78940039e+01  1.41280259e-03 -1.15732048e-03  4.08837891e+00

由于processed是一个元组,你可能需要分解成N个变量如下:

def bwp(x, *processed):
    pred, real = x
    money = 1000
    v1, v2, v3, ... vN = processed
    ...

您的问题缺少可重现的示例,因此请不要犹豫 print(processed) 了解 scipy.optimize.brute 给您的论据。

我真的不认为需要使用不同数量的位置函数参数。相反,只需通过以下方式传递整个 np.array processed

def bwp(x, processed):
    pred, real = x
    money = 1000
    for i in range(0, processed.shape[0]):
        if processed[i, 3] > pred and processed[i-1,4] > real:
            money = money + (money * processed[i, 4])
    return money * -1

def opt_2(processed):
    bounds = [(-1, 1), (-1, 1)]
    resbrute = optimize.brute(lambda x: bwp(x, processed), ranges=bounds, full_output=True, finish=optimize.fmin)
    print(resbrute[0])
    print(resbrute[1])

请注意,我假设 processed 是 np.array,形状为 (4, 6),如您的问题所示。