波動率
波動率目標優化 - Python
我正在測試波動率目標策略
Python
。此過程涉及在每個再平衡日期解決以下優化問題$$ \min_w \left(w^T\Sigma w - \bar\sigma^2\right)^2 $$ 英石 $$ \mu^T w\ge \bar\mu $$ $$ 1^T w = 1 $$ 哪個是解決這個問題的最佳算法?
正如這個答案所建議的那樣,這篇部落格文章非常完整地實現了具有目標風險的回報最大化投資組合。下面是我為之前一個項目寫的一個簡化實現,供大家參考。請注意,在 cvxopt 中構造矩陣並不完全簡單,從 np.
引用的部落格文章使用平均歷史回報來創建回報預測,其中我下面的函式將回報向量作為輸入,因為我對前瞻性回報使用了不同的計算方法。
import cvxopt as cvx def markowitz_opt(ret_vec, covar_mat, max_risk): U,V = np.linalg.eig(covar_mat) U[U<0] = 0 Usqrt = np.sqrt(U) A = np.dot(np.diag(Usqrt), V.T) # Calculating G and h matrix G1temp = np.zeros((A.shape[0]+1, A.shape[1])) G1temp[1:, :] = -A h1temp = np.zeros((A.shape[0]+1, 1)) h1temp[0] = max_risk ret_c = len(ret_vec) for i in np.arange(ret_c): ei = np.zeros((1, ret_c)) ei[0, i] = 1 if i == 0: G2temp = [cvx.matrix(-ei)] h2temp = [cvx.matrix(np.zeros((1,1)))] else: G2temp += [cvx.matrix(-ei)] h2temp += [cvx.matrix(np.zeros((1,1)))] # Construct list of matrices Ftemp = np.ones((1, ret_c)) F = cvx.matrix(Ftemp) g = cvx.matrix(np.ones((1,1))) G = [cvx.matrix(G1temp)] + G2temp H = [cvx.matrix(h1temp)] + h2temp # Solce using QCQP cvx.solvers.options['show_progress'] = False sol = cvx.solvers.socp( -cvx.matrix(ret_vec), Gq=G, hq=H, A=F, b=g) xsol = np.array(sol['x']) return xsol, sol['status']
我假設禁止變數是常量。
顯然,二次元越接近越接近 $ \bar{\sigma}^2 $ 所以問題可以重新表述為:
$$ \min_{w,t} t $$ 英石 $$ w^T \Sigma w -t \leq \bar{\sigma} $$ $$ w^T \Sigma w +t \geq \bar{\sigma} $$ $$ \mu^T w \geq \bar{\mu} $$ $$ 1^Tw=1 $$ $$ t \geq 0 $$ 這是二次約束線性問題 (QCLP),它是二次約束二次規劃 (QCQP) 的子類,與二階錐規劃 (SOCP) 相關。
不幸的是,我不知道哪種算法效果最好,但我建議 Python 的 CVXOPT 可能有一些文件,或者由於問題的性質,我會冒險猜測順序二次程式值得一試。希望這個答案可以為您或其他人指明正確的方向。