投資組合優化
投資組合優化 - 等權算法
我正在嘗試編寫一種算法,該算法可以輸出要購買的股票數量,以便它等於股票投資組合中的權重。
假設我們想將 1000 美元投資於 5 支同等權重的股票——
Ticker Price Target Weight AAA $30 20% BBB $32 20% CCC $46 20% DDD $53 20% EEE $41 20%
我試圖最小化目標和實際重量之間差異的總和。有人可以為這個問題提出一些虛擬碼嗎?
您可以簡單地使用一種算法,一次選擇一隻股票。
- 您從每隻股票中的一隻開始。
- 計算投資組合中股票的權重。
- 選擇最低於目標權重的股票並添加一個。
- 如果您沒有更多資金,請停止,否則轉到 2。
這是這個簡單算法的 Python 實現。
import numpy as np prices = np.array([30, 32, 46, 53, 21]) targets = np.array([0.2, 0.2, 0.2, 0.2, 0.2]) stocks = np.array([1, 1, 1, 1, 1]) capital = 1000 - np.sum(prices*stocks) while True: weights = prices*stocks / np.sum(prices*stocks) idx = np.argmin(weights - targets) if capital - prices[idx] < 0: break else: stocks[idx] += 1 capital -= prices[idx]
有了這個算法和我得到的條件,
$$ 6, 6, 4, 4, 5 $$股票數量。這是一個權重$$ 0.18499486, 0.19732785, 0.18910586, 0.21788284, 0.21068859 $$. 這與 Kermittfrog 的結果相同,但該算法沒有那麼花哨,並且在大型情況下可以更好地擴展。
對於非常大的情況,可以通過將其設置為:
stocks = np.ones(5, dtype=int) * ((capital/len(prices))//prices).astype('int')
請注意,此開始猜測將始終非常接近“最佳”解決方案。
正如 Kermittfrog 發現的那樣,在某些情況下,該算法不會給出正確的答案,因此,這是一種新的更穩定的算法:
import numpy as np prices = np.array([133, 100]) targets = np.array([0.5, 0.5]) capital = 1000 stocks = np.ones(len(prices), dtype=int) * ((capital/len(prices))//prices).astype('int') capital = capital - np.sum(prices*stocks) fitness = np.zeros(len(prices)) while True: for i in range(len(prices)): stocks[i] += 1 fitness[i] = np.sum((prices*stocks / np.sum(prices*stocks) - targets)**2) stocks[i] -= 1 idx = np.argmin(fitness) if capital - prices[idx] < 0: break else: stocks[idx] += 1 capital -= prices[idx]
可悲的是,上述縮放現在處於最壞的情況 $ \mathcal{O}(N^2) $ .