優化
python中權重約束的投資組合優化
我正在嘗試使用 cvxpy 優化投資組合。我原來的結構如下:
w = Variable(n) ret = mu.T * w risk = quad_form(w, Sigma) prob = Problem(Maximize(ret), [risk <= .01])
這只是在某些風險約束下最大化回報。但是,我還想有一個權重/槓桿約束,如下所示:
prob = Problem(Maximize(ret), [risk <= .01, sum(abs(w)) <= 1.0])
然而,當我在我的許多權重中添加這個約束時,我的權重變為零,並且最佳投資組合只集中在 2-3 種資產中。這與沒有此約束的情況不同,後者導致投資組合更加多樣化。我有點困惑為什麼權重約束會導致這種情況。有沒有人有任何見解?
這比添加額外的約束要復雜一些。這是 markowitz 優化中的一個眾所周知的問題 - 如果您不非常小心地處理共變異數矩陣和預期收益向量,markowitz 通常會將您的權重噴射到邊緣並導致非常不多樣化的投資組合。
我建議大力美化文獻——這是一個很好的起點:
http://www.ledoit.net/honey.pdf
“估計股票收益的共變異數矩陣一直是最棘手的問題之一。標準的統計方法是收集過去股票收益的歷史併計算它們的樣本共變異數矩陣。不幸的是,這會產生有據可查的問題(Jobson 和 Korkie, 1980). 盡可能簡單地說,當考慮的股票數量很大時,尤其是相對於可用的歷史回報觀察的數量(這是通常的情況),樣本共變異數矩陣的估計誤差很大. 這意味著這樣估計的矩陣中最極端的係數傾向於取極端值,不是因為這是“真相”,而是因為它們包含極端量的誤差。平均變異數優化軟體總是會鎖定它們,並將最大的賭注押在那些最不可靠的係數上”
我在matlab上遇到了同樣的問題。我猜你需要把一些界限作為約束:
cons=({'type':'eq', 'fun': lambda x:sum(x)-1}) Bounds= [(0.1 , 0.5) for i in range(0,nb_assets)] Optim= scipy.optimize.minimize(fonction, InitialSolution,method='SLSQP',bounds=Bounds,constraints=cons)
這樣你就告訴優化工具找到一個更多樣化的解決方案。