投資組合優化
如何使用python中的部門約束計算最佳投資組合
我目前正在研究 CVXPY。
主要目標是能夠計算出最優的投資組合,在我看來,這意味著我們需要最大化
(預期回報 - 無風險)/波動率
為了簡單起見,我想將無風險排除在等式之外(目前它幾乎為零)。
我的問題是:我想根據可以分配給某個部門的最大分配來限制投資組合中的權重。
Sector Stocks A 1 2 3 B 4 5 6
我怎樣才能實現,分配給每個部門的最小值和最大值位於某些頻段之間?
我已經看過這篇文章:行業級別的限制
但我真的很想用 cvxpy 作為答案來實現它。不幸的是,我不知道如何實現這一點?
我已經得到了共變異數矩陣、返回估計值和波段,但根本找不到實現這些約束的方法。任何幫助將不勝感激!
編輯:我盡了最大努力,想出了這個腳本: 感謝@Attack68 的評論與本文相結合:夏普二次優化
import cvxpy as cp import numpy as np np.random.seed(101) ## NUMBER OF ASSETS n_assets = 4 ## NUMBER OF OBSERVATIONS n_obs = 1000 ## GENERATE RANDOM RETURNS return_vec = np.random.randn(n_assets, n_obs) ## SET UP PROBLEM C = np.asmatrix(np.cov(return_vec)) # Covar Matrix mu = np.asmatrix(np.mean(return_vec,axis=1)) # return estimat mu0 = -0.0075 # risk free rate y = cp.Variable(n_assets) # "weights" A = np.asmatrix([[0.6,0.6,0,0],[-1.2,-1.2,0,0],[0,0,0.2,0.2],[0,0,-1.2,-1.2]]) bounds = np.asmatrix([0.4,0.2,0.8,0.2]) # HOW CAN I SUBSTRACT THE BOUNDS FROM ONLY THE NON-NULL VALUES? (AS FAR AS THIS WILL BE NEEDED?) A_mod = A #- bounds.T ## CREATE CONSTRAINTS constraints = [(mu-mu0)@y==1, y >= 0, y@A_mod >= 0] ## FORM OBJECTIVE obj = cp.Minimize(cp.quad_form(y,C)) ## FORM AND SOLVE PROBLEM prob = cp.Problem(obj, constraints) prob.solve() w = y.value/sum(y.value) w array([0.35386785, 0.17693393, 0.4034641 , 0.06573412])
不幸的是,這個解決方案不符合約束條件。我究竟做錯了什麼?
這很簡單。它涉及確保約束作為矩陣標準表格的一部分呈現。
您通常會受到所有資產總和為 1 的約束,即矩陣向量方程:
$$ \delta^T x = 1 $$
如果您想為某個部門的資產創建不平等約束,只需將它們隔離開來:
$$ \begin{bmatrix} 1 & 1 & 1 & 0 & 0 & 0 \ -1 & -1 & -1 & 0 & 0 & 0 \ 0 & 0 & 0 & 1 & 1 & 1 \ 0 & 0 & 0 & -1 & -1 & -1 \ \end{bmatrix} x \leq \begin{bmatrix} a_1 \ a_2 \ b_1 \ b_2 \end{bmatrix} $$
然後將這些矩陣向量行添加(堆疊)到您擁有的任何現有不等式約束中。