程式
Python中的最小變異數投資組合
我有一個投資組合或 $ N $ 資產在 $ t=10 $ 天。
import numpy as np import pandas as pd n= 10 A = pd.DataFrame([np.random.randn(5) for i in range(n)],columns=['a', 'b', 'c', 'd', 'e']) A T = A.shape[0] k = A.shape[1] print(T,k)
共變異數矩陣
Σ = A.cov().to_numpy() Sigma = Σ print(Sigma)
我想通過 Python 中的凸優化來最小化變異數。
其實我想解決
$$ \min \quad (1/2) w^T \Sigma w $$ 英石$$ w_{i}\geq 0,\sum_{i=1}^{n}w_{I} =1 $$
所以我這樣做:
import cvxpy as cp w = cp.Variable(n) # Defining risk objective risk = cp.quad_form(w,Sigma) objective = cp.Minimize((1/2)*risk) # Budget and weights constraints constraints = [cp.sum(w) == 1, w >= 0] # Solver prob = cp.Problem(objective, constraints) prob.solve()
但我收到一個錯誤:
Exception: Invalid dimensions for arguments.
我的錯誤是什麼?有人嗎?
你的
Sigma
矩陣是 5x5 而不是 10x10,試試這個A = pd.DataFrame( [np.random.randn(n) for i in range(5*n)], columns=[chr(65+i) for i in range(n)] )
它會起作用的。
$$ ADDITION following a remark $$ 我假設您期望投資組合的維數為 10(因為您寫
n=10;w = cp.Variable(n)
),因此您的共變異數矩陣應該具有投資組合的維數,即 10。