有办法让GEKKO与熊猫一起工作吗?



我试图使GEKKO最大化功能"利润";但我做不到我总是以下面的错误结束。

我需要GEKKO解算器选择(Weight1, Weight2, Weight3…重量8)所以结果"函数"Profit"返回

每个权重可以为0(0%)~ 15(15%)之间的任意值,所有权重之和必须为100(100%)。

所有dataframe都需要计算每个Pick (Pick1, Pick2, Pick3…)的最终利润。

最后的"Result"是每个选择的利润减去基准的利润的总和。

:权重是变量;它们的范围从0到15;约束条件是它们的和必须是100。

到目前为止,我只能找到GEKKO最大化定义方程的例子。它能做到这样吗?

下面是我的代码:
from gekko import GEKKO
import pandas as pd
m = GEKKO()
Weight1 = m.Var(value=15,lb=0, ub=15)
Weight2 = m.Var(value=15,lb=0, ub=15)
Weight3 = m.Var(value=15,lb=0, ub=15)
Weight4 = m.Var(value=15,lb=0, ub=15)
Weight5 = m.Var(value=15,lb=0, ub=15)
Weight6 = m.Var(value=15,lb=0, ub=15)
Weight7 = m.Var(value=15,lb=0, ub=15)
Weight8 = m.Var(value=15,lb=0, ub=15)
m.Param(Weight1 + Weight2 + Weight3 + Weight4 + Weight5 + Weight6 + Weight7 + Weight8 == 100) #Sum of Weights must be 100%
def Profit(Weight1, Weight2, Weight3, Weight4, Weight5, Weight6, Weight7, Weight8):
RETURNS  = OPTIMIZATION_TABLE
PICKS = RETURNS[["picks"]].drop_duplicates()
PICKS["Weights"] = ""
PICKS.loc[(PICKS['picks']== "pick2") ,'Weights'] = Weight1/100
PICKS.loc[(PICKS['picks']== "pick1") ,'Weights'] = Weight2/100
PICKS.loc[(PICKS['picks']== "pick3") ,'Weights'] = Weight3/100
PICKS.loc[(PICKS['picks']== "pick4") ,'Weights'] = Weight4/100
PICKS.loc[(PICKS['picks']== "pick5") ,'Weights'] = Weight5/100
PICKS.loc[(PICKS['picks']== "pick6") ,'Weights'] = Weight6/100
PICKS.loc[(PICKS['picks']== "pick7") ,'Weights'] = Weight7/100
PICKS.loc[(PICKS['picks']== "pick8") ,'Weights'] = Weight8/100
COMPLETE = pd.merge(RETURNS, PICKS, left_on="picks", right_on="picks", how="left")
COMPLETE["final_return"] = COMPLETE.Weights * COMPLETE.daily_return
DATE_GROUP = pd.DataFrame(COMPLETE.groupby(['date'],as_index=False)['final_return'].sum())
DATE_GROUP = DATE_GROUP.sort_values("final_return", ascending=True)
DATE_GROUP = DATE_GROUP.reset_index(drop=True)
BENCHMARK_GROUP = BENCHMARK[["date", "daily_return"]]
BENCHMARK_GROUP = BENCHMARK_GROUP.sort_values('daily_return', ascending=True)
BENCHMARK_GROUP = BENCHMARK_GROUP.reset_index(drop=True)
FINAL_TABLE = pd.merge(BENCHMARK_GROUP, DATE_GROUP, left_index=True, right_index=True)
FINAL_TABLE["dif"] = FINAL_TABLE.final_return - FINAL_TABLE.daily_return
Result = sum(FINAL_TABLE.dif)
return Result
m.Maximize(Profit)
m.solve(disp=True)

最后得到的结果是:

--------- APM Model Size ------------
Each time step contains
Objects      :            0
Constants    :            0
Variables    :            9
Intermediates:            0
Connections  :            0
Equations    :            1
Residuals    :            1

@error: Model Expression
*** Error in syntax of function string: Invalid element: <functionsolverat0x000
001c63000dfc0>

Position: 1                   
<functionsolverat0x000001c63000dfc0>
?
有人能帮我一下吗?感谢您的宝贵时间!

Gekko第一次通过构建一个模型的符号形式,然后将变量和方程编译成具有自动微分的字节码,用于基于梯度的求解器。这意味着任何函数调用只在构建模型时使用,而不是在求解模型时使用。

有几种方法可以用二元变量来重新制定模型。下面是一个二进制变量的例子。

x = m.Var(lb=0,ub=1,integer=True)

其他逻辑条件包括if语句,如m.if3(x,0,1)sos1(类型为1的特殊有序集合)。SOS是一组二进制变量的组合,其中只有一个不允许为零。从一组互斥选项的可能数值中选择一个。

from gekko import GEKKO
m = GEKKO()
y = m.sos1([19.05, 25.0, 29.3, 30.2])
m.Obj(y) # select the minimum value
m.solve()
print(y.value)

在Gekko中允许使用Numpy, Pandas或其他函数来创建方程的符号表示。

最新更新