投資組合優化
計算具有資產分配約束的切線投資組合
我希望計算有效邊界的切線投資組合,但要考慮投資組合
min_allocations
中max_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 來編寫程式碼,但它應該是直截了當的)。