我的python解決方案好嗎?:具有“無賣空”約束的全球最小變異數投資組合
問題
- 我的 python 程式碼是獲得全域最小變異數投資組合問題的權重向量的答案(至少是一個接近的答案)嗎?經過一些解釋,我的程式碼如下所示。
要添加的詳細資訊
具有無賣空約束的投資組合問題的 GMV 可以描述如下:
$$ \boldsymbol{w}{G M V}=\arg \min \left{\boldsymbol{w}^\top \Sigma \boldsymbol{w} \enspace : \enspace \boldsymbol{w}^\top \mathbf{1}{N}=1, \enspace w>0\right} $$
- $ \boldsymbol{w}=\left(w_{1}, \ldots, w_{n}\right)^\top $ 是投資組合權重的向量
- $ \Sigma $ 是資產(股票)的變異數共變異數矩陣
- $ \mathbf{1}_{N} $ 是一個 $ N $ 個的維向量
如果允許賣空,問題的答案可以計算如下:
$$ \boldsymbol{w}{G M V}=\frac{\sum^{-1} \mathbf{1}{N}}{\mathbf{1}{N}^\top \Sigma^{-1} \mathbf{1}{N}} $$
- 根據問題“沒有賣空的切線投資組合權重?” 從數學堆棧交換中,我們沒有沒有賣空約束的 GMV 問題的解析解。
- 我的 python 程式碼對此的回答很簡單;將負權重設置為 $ \boldsymbol{w}_{G M V} $ 上面計算出來的為0,其餘的權重為正,使之和為1。程式碼如下所示。
cov_df = stock_data_df.cov() inverse_cov_df = np.linalg.pinv(cov_df) numerator = np.matmul(np.ones(20).T, inverse_cov_df) denominator = np.matmul(np.ones(20), (np.matmul(inverse_cov_df, np.ones(20)))) GMV_weight_vector = numerator / denominator GMV_weight_vector[GMV_weight_vector < 0] = 0 GMV_weight_vector = GMV_weight_vector/(GMV_weight_vector.sum())
- 有
stock_data_df
20 隻股票 252 天的每日回報。- 底部的最後 2 行是足以滿足“無賣空約束”的行。
- 我很想知道這兩條線是否足夠好,可以考慮在沒有賣空限制的情況下解決 GMV 投資組合問題。
免責聲明
- Pyportfolioopt 等許多 python 庫都使用 scipy.minimize 函式來解決“無賣空約束”的問題,但我不允許在作業中使用任何求解器。
很抱歉成為壞消息的承擔者,但不能保證這種方法是 MinVol 解決方案;-(
問題是多頭權重只有 MV,因此與空頭(模型認為它可以賣空以對沖)一起加權。如果你忽略短褲,那麼多頭就不會是孤立的 MV。可能存在一個只做多的投資組合,其交易量較低。當然,這並不是說您的算法不是“低音量”解決方案。
為了解決這個問題,有兩種可能的迭代方法:1)完全按照你的方式執行上面的方程。重新抽樣排除任何具有負權重的資產;並重新執行,直到沒有一個是負數。
否則:2) 對於每項資產,計算投資組合的波動性,該投資組合長該資產 1 個基點,目前投資組合的波動率為 99.99%。為混合混合的音量低於目前混合的每個資產切換;直到沒有人再做。
我不知道此類問題的任何封閉形式的解決方案;所以我想什麼樣的迭代解決方案有資格作為“求解器”在這裡沒有實際意義。
只做多的最小變異數投資組合沒有封閉式解析解。只有不受約束(允許賣空)的投資組合。見這裡。
以您描述的方式修改無約束投資組合成為約束投資組合併不等於真正的約束投資組合解決方案,必須通過凸優化(二次規劃)獲得。