投資組合優化

計算具有資產分配約束的切線投資組合

  • December 9, 2018

我希望計算有效邊界的切線投資組合,但要考慮投資組合min_allocationsmax_allocations的資產權重。這些限制讓我覺得我需要使用優化工具,例如cvxopt. 切線投資組合是使夏普比率最大化的投資組合,我相信計算切線投資組合需要輸入compute_tanp(exp_ret_vec, cov_mat, min_allocations, max_allocations, rf)

這些講義能夠將上面的優化問題轉換為下面的標準二次格式,但我不確定如何正確形成這種方法的矩陣。

如何形成矩陣以正確使用cvoxpt以找到具有最大夏普比率的投資組合?我也願意接受其他技術來計算有約束的切線投資組合。

下面我有一個工作函式,可以找到有效的投資組合權重 $ W $ 當通過所需的目標返回時。它用於cvxopt處理表單的優化:

import pandas as pd
import numpy as np
import cvxopt as opt

def compute_ep(target_ret, exp_ret_vec, cov_mat, min_allocations, max_allocations):
   """
   computes efficient portfolio with min variance for given target return 

   """
   # number of assets
   n = len(exp_ret_vec)

   one_vec = np.ones(n)

   # objective
   # minimize (0.5)x^TPx _ q^Tx
   P = opt.matrix(cov_mat.values) # covariance matrix
   q = opt.matrix(np.zeros(n)) # zero

   # constraints Gx <= h
   # >= target return, >= min allocations, <= max allocations
   G = opt.matrix(np.vstack((-exp_ret_vec,-np.identity(n), np.identity(n))))  

   h = opt.matrix(np.hstack((-target_ret,-min_allocations, max_allocations)))

   # constraints Ax = b
   A = opt.matrix(np.ones(n)).T
   b = opt.matrix(1.0) # sum(w) = 1; not market-netural

   # convex optimization
   opt.solvers.options['show_progress'] = False
   sol = opt.solvers.qp(P, q, G, h, A, b)

   weights = pd.Series(sol['x'], index = cov_mat.index)

   w = pd.DataFrame(weights, columns=['weight'])

   return(w)

從第一個問題到第二個問題需要對輸入數據進行兩次轉換:

  • 這 $ \hat{\mu} $ 通過減去標量找到 $ r_f $ 從所有 $ \mu $ 向量分量:$$ \hat{\mu}=\mu-r_f=(\mu_1-r_f,\mu_2-r_f,\cdots,\mu_N-r_f)^T $$

換句話說 $ \mu $ 是回報和 $ \hat\mu $ 是“超額收益”。

  • 這 $ \hat{A} $ 矩陣是通過減去 $ b $ 來自每一列的列向量 $ A $ 矩陣,即 $ \hat{a}{ij}=a{ij}-b_i $
  • 這 $ Q $ 與問題 1 相比,問題 2 中的矩陣(共變異數矩陣)沒有變化

一旦你解決了問題 2,你就有了最優的 $ y $ . 你可以找到最佳的 $ x $ 通過做問題1 $ x=\frac{y}{1^T y} $ . 這使得 x 分量加起來為 1(根據需要),即使 y 分量不加。

高溫高壓

(我不太了解 R 和 cvxopt 來編寫程式碼,但它應該是直截了當的)。

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