cvxpy 投資組合優化與風險預算
我正在嘗試在 Python 中的 cvxpy 中進行一些投資組合建構:
weight = Variable(n) ret = mu.T * weight risk = quad_form(weight, Sigma) prob = Problem(Maximize(ret), [risk <= .01]) prob.solve()
但是,我想包括資產級別的風險預算限制,例如,沒有資產可以對總風險貢獻超過 1% 的風險。這個約束看起來像(mctr = 對總風險的邊際貢獻,actr = 對總風險的絕對貢獻)
mctr = Sigma * weight / 0.1 actr = mul_elemwise(mctr, weight) prob = Problem(Maximize(ret), [risk <= .01, actr <=.01])
但是,當我嘗試執行此 cvxpy 錯誤時
>> mul_elemwise(mctr, w) *** ValueError: The first argument to mul_elemwise must be constant.
然後我嘗試將約束重新定義為
actr = diag(mctr, weight.T)
但仍然是一個錯誤:
(Pdb) prob.solve() *** cvxpy.error.DCPError: Problem does not follow DCP rules.
現在我明白為什麼會出現這些錯誤,但我也知道這些是相當常見的約束,所以我想知道如何將它們表述為 cvxpy 以便我可以解決我的優化問題。謝謝
根本問題:你的 ACTR 約束不是凸的
這 $ i $ 對您的風險貢獻的約束可以寫成:
$$ w_i \sum_j \sigma_{ij} w_j \leq c_i s $$ 這不是一個凸約束,因為 $ w_j w_i $ 術語(一個函式 $ g(x,y)=xy $ 不是凸的 $ x $ 和 $ y $ )。它們不是凸約束,因此您將無法在 CVX 的規則集中將它們寫為凸約束。
有關您的優化問題的更多詳細資訊
讓 $ \mathbf{w} $ 表示投資組合權重的向量, $ \boldsymbol{\mu} $ 預期收益的向量, $ \Sigma $ 共變異數矩陣, $ s $ 最大標準偏差, $ \mathbf{m} $ 對風險的最大邊際貢獻的向量,以及 $ \mathbf{c} $ 對風險的最大貢獻的向量。
直接轉換受(1)投資組合回報的標準差,(2)對風險的邊際貢獻,和(3)對風險的邊際貢獻乘以投資組合權重的限制條件下的最大化回報 $ \circ $ 表示元素明智的產品(即哈達瑪產品)。
$$ \begin{equation} \begin{array}{*2{>{\displaystyle}r}} \mbox{maximize (over $\mathbf{w}$)} & \boldsymbol{\mu}’ \mathbf{w} \ \mbox{subject to} & \sqrt{\mathbf{w}’ \Sigma \mathbf{w}} \leq s\ & \frac{1}{\sqrt{ \mathbf{w}’ \Sigma \mathbf{w} }}\Sigma \mathbf{w} \leq \mathbf{m} \ & \frac{1}{\sqrt{\mathbf{w}’\Sigma \mathbf{w}}}\left( \Sigma \mathbf{w} \right) \circ \mathbf{w} \leq \mathbf{c} \end{array} \end{equation} $$
假設標準偏差約束綁定我們有:
$$ \begin{equation} \begin{array}{*2{>{\displaystyle}r}} \mbox{maximize (over $\mathbf{w}$)} & \boldsymbol{\mu}’ \mathbf{w} \ \mbox{subject to} & \sqrt{\mathbf{w}’ \Sigma \mathbf{w}} \leq s\ & \Sigma \mathbf{w} \leq s \mathbf{m} \ & \left( \Sigma \mathbf{w} \right) \circ \mathbf{w} \leq s \mathbf{a} \quad \quad \text{<—– still not convex} \end{array} \end{equation} $$
我們現在有一個凸優化問題(即受仿射等式約束和凸不等式約束的凸目標)除了最後一個約束!您將無法使用 CVX 的規則集將風險約束的貢獻寫為凸約束,因為它不是凸的!
該怎麼辦?一種方法是使用更通用的求解器,並註意您可能會遇到局部最大值,因為問題不是凸的。你是對的,這些是常見的限制。有關於這個主題的論文,你可能會檢查一些提出的算法。例如,論文“SCRIP:風險平價投資組合設計的連續凸優化方法”看起來很有趣,但我沒有仔細閱讀它以支持它。
問題的進一步背景:為什麼有這些限制?
讓 $ \mathbf{w} $ 是表示投資組合權重的向量 $ n $ 風險資產(即不包括無風險利率),並讓 $ \Sigma $ 是他們收益的共變異數矩陣..
投資組合收益的標準差 $ R_p = \mathbf{w}’ \mathbf{R} + \left( 1 - \sum_i w_i\right) r_f $ 作為權重的函式 $ \mathbf{w} $ 由以下給出:
$$ \begin{align*} f (\mathbf{w}) &= \operatorname{Std}(R_p) \ &= \sqrt{\mathbf{w}’\Sigma\mathbf{w} } \end{align*} $$
取投資組合權重的偏導數,你得到:
$$ \frac{\partial f}{\partial \mathbf{w}} = \frac{1}{f (\mathbf{w})}\Sigma \mathbf{w} $$
觀察收益的標準差 $ f(\mathbf{w}) $ 在權重上是一級同質的 $ \mathbf{w} $ (IE $ f (\lambda \mathbf{w}) = \lambda f(\mathbf{w}) $ 因此由歐拉齊次函式定理:
$$ f(\mathbf{w}) = w_1 \frac{\partial f}{\partial w_1} +w_2 \frac{\partial f}{\partial w_2}+ \ldots + w_n \frac{\partial f}{\partial w_n} $$
很多人打電話 $ w_i \frac{\partial f}{\partial w_i} $ 資產 $ i $ 對風險的貢獻,因為它們很好地加起來了總數。但請注意 $ w_i\frac{\partial f}{\partial w_i} $ 如果資產中的全部頭寸,不衡量投資組合回報的標準差會發生什麼 $ i $ 被排除在外。
相反,它是一個衍生品。觀察 $ \frac{\partial f}{\partial \log w_i} = w_i \frac{\partial f}{\partial w_i} $ 因此,該術語將標準偏差的變化與頭寸規模的無限小的百分比變化聯繫起來。(您可以顯示服用 $ \frac{d}{\log x} $ 給出關於百分比變化的導數 $ x $ .)