Scipy 函数最小化

Scipy function minimization

x1 和 x2 数据帧为: 分配 0.400000 均值 0.000732 标准偏差 0.015961 rfr 0.000000

分配 0.200000 均值 0.000957 标准偏差 0.016520 rfr 0.000000

def create_function_duo(x1df, x2df):
    def funct(xi):
        y=0
        
        y+=xi*(x1df.iat[1]-x1df.iat[3])/(x1df.iat[2]-x1df.iat[3])
        y+=(1-xi)*(x2df.iat[1]-x2df.iat[3])/(x2df.iat[2]-x2df.iat[3])
        #only includes minimization, answer is flipped to negative
        return -y
    xi=x1df.iat[0].item()
    bi = (0,None)
    be = (1,None)
    bnds = (bi, be)
    
    min_result = spo.minimize(funct, xi, method = 'SLSQP',  bounds = bnds, options = {'disp':True}) #, 
    print('minima found at')
    print(min_result.x, min_result.fun)
    
    return min_result.x

解释:我试图最大化两个基金的夏普比率。我意识到这应该只是吐回 1,但我无法获得最小化函数来返回任何有边界的东西。 如果我声明 bounds=(1,0) 我得到 'int is not iterable'

如果我用上面的,它会吐回来'ValueError: Objective function must return a scalar'

我什至尝试 return -y.item() 将其转换为浮点数,但出现错误:'ValueError: can only convert an array of size 1 to a Python scalar'

我不知道这里出了什么问题。函数 return 是一个值(已测试),函数声明在外部函数内部,并且在调用最小化时所有 x1df 和 x2df 应该是 'constant'。 我需要设置边界,以便 xi 仅在 0 和 1 之间,但 y 应该可以自由更改。 我试过 bi=(0,1), be=(None, None), 以及 bi=(None, 0), be=(None, 1), 连bi=(0,), be=(1,) (​​'ValueError: not enough values to unpack (expected 2, got 1)')。我在这里查看了一个边界问题,但我不相信我有 Xi 变量而不是 xi。我不明白有界限的东西,请让我知道我做错了什么。

边界应该是每个维度的 (min,max) 序列。我知道你有 1 个维度,但它仍然需要是一个序列。所以下面的工作(注意 bounds 参数为第一个也是唯一的参数 xi 指定 min=0.0,max=1.0 边界)

    min_result = spo.minimize(funct, xi, method = 'SLSQP',  bounds = ((0,1),), options = {'disp':True}) #, 

并生成(其余代码完好无损)

Optimization terminated successfully    (Exit mode 0)
            Current function value: [-0.05792978]
            Iterations: 5
            Function evaluations: 10
            Gradient evaluations: 5
minima found at
[0.] [-0.05792978]
array([0.])