投資組合優化

投資組合優化 - 等權算法

  • December 15, 2020

我正在嘗試編寫一種算法,該算法可以輸出要購買的股票數量,以便它等於股票投資組合中的權重。

假設我們想將 1000 美元投資於 5 支同等權重的股票——

Ticker    Price    Target Weight
AAA        $30     20%
BBB        $32     20%
CCC        $46     20%
DDD        $53     20%
EEE        $41     20%

我試圖最小化目標和實際重量之間差異的總和。有人可以為這個問題提出一些虛擬碼嗎?

您可以簡單地使用一種算法,一次選擇一隻股票。

  1. 您從每隻股票中的一隻開始。
  2. 計算投資組合中股票的權重。
  3. 選擇最低於目標權重的股票並添加一個。
  4. 如果您沒有更多資金,請停止,否則轉到 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) $ .

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