簡體   English   中英

python-使用true / false約束進行優化

[英]python - Optimization with true/false constraint

我目前正在研究Python中的約束優化問題,雖然我可以表述我的問題,但遇到以下錯誤:“ LSQ子問題中的奇異矩陣C”。

我相信發生這種情況是因為我的兩個約束(相等性)不是連續的,也不是與它們相關的其他東西,因為優化程序沒有它們就可以工作。

下面是一個示例:

vol_tgt = 0.1

sign_vec =

---------------+----+
| XLK US Equity |  1 |
| XOP US Equity |  1 |
| KRE US Equity |  1 |
| KBE US EQUITY |  1 |
| XLK US EQUITY |  1 |
| XLE US EQUITY |  1 |
| XLF US EQUITY |  1 |
| XRT US EQUITY |  1 |
| XLU US EQUITY |  1 |
| XLY US EQUITY |  1 |
| XLV US EQUITY |  1 |
| STS FP EQUITY |  1 |
| STR FP EQUITY |  1 |
| STZ FP EQUITY |  1 |
| STW FP EQUITY |  1 |
| STQ FP EQUITY |  1 |
| STN FP EQUITY | -1 |
+---------------+----+

return_vec =

+---------------+--------------+
| XLK US Equity | 0.005951589  |
| XOP US Equity | 0.024262624  |
| KRE US Equity | 0.007112154  |
| KBE US EQUITY | 0.003097968  |
| XLK US EQUITY | 0.005951589  |
| XLE US EQUITY | 0.019948716  |
| XLF US EQUITY | 0.003813095  |
| XRT US EQUITY | -0.001202198 |
| XLU US EQUITY | 0.003021156  |
| XLY US EQUITY | 0.002821742  |
| XLV US EQUITY | 0.004961415  |
| STS FP EQUITY | 0.000827929  |
| STR FP EQUITY | 0.005422823  |
| STZ FP EQUITY | -0.003453351 |
| STW FP EQUITY | -0.001449392 |
| STQ FP EQUITY | 0.015776843  |
| STN FP EQUITY | 0.000937061  |
+---------------+--------------+

代碼如下:

### define necessary functions ###
def optimization_function(weights,returns , vol_tgt, signs) :
    return - np.sum(np.log(np.abs(weights)))  #multiply by -1 since we wish to maximize but we give the problem 
        #to a minimizer

def portfolio_vol(weights,returns , vol_tgt, signs) : # inequality
    portf_return = np.dot(weights.T,returns)
    return np.sqrt(portf_return) - vol_tgt

def absolute_exposure(weights,returns , vol_tgt, signs) :
    return np.sum(np.abs(weights)) - 1

def positive_weights(weights,returns , vol_tgt, signs) :
    return float(np.sum(weights[signs == 1] <= 0))

def negative_weights(weights,returns , vol_tgt, signs) :
    return float(np.sum(weights[signs == -1] >= 0))

weights = sp.fmin_slsqp(optimization_function,lol,args=(return_vec,vol_tgt,sign_vec,),
                                    ieqcons = [portfolio_vol,],eqcons=[absolute_exposure,positive_weights,])

麻煩的函數是positive_weights和negative_weights。 沒有他們,我就沒有問題。 有沒有辦法解決這個問題?

先感謝您。

將這些表示為不平等約束似乎更為自然。 例如, return weights[signs == 1].min()並將其約束為非負數。 (除非權重0和權重1e-308之間的區別實際上很關鍵,在這種情況下,我猜您可以在返回之前減去一個很小的數字。)– user2357112

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM