投資組合優化

如何使用python中的部門約束計算最佳投資組合

  • June 7, 2019

我目前正在研究 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} $$

然後將這些矩陣向量行添加(堆疊)到您擁有的任何現有不等式約束中。

引用自:https://quant.stackexchange.com/questions/45954