程式

Python中的最小變異數投資組合

  • December 31, 2021

我有一個投資組合或 $ 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。

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