使用目標報酬率網格計算效率前緣
如你所見,計算效率前緣的一種作法是先定義一組目標報酬率的網格,然後對於每個目標報酬率,找出在變異數最低下,其預期報酬等於該目標報酬率的投資組合。
但要如何設定一個合理的目標報酬率網格呢?你將把最大目標報酬率設為所有股票的平均報酬中的最大值。理想情況下,最小目標報酬率應該設為最小變異數投資組合的報酬率。由於你尚未知曉這個最小變異數投資組合的報酬,因此先用所有股票平均報酬的最小值來建立一個網格。
在本練習中,你會使用 for 迴圈來計算潛在投資組合的平均報酬、標準差,以及權重的網格。
本練習屬於課程
R 投資組合分析入門
練習說明
- 計算
returns的欄平均(使用colMeans()),並將結果命名為stockmu。 - 建立一個長度為 50 的序列(seq()),從無風險利率 1% 開始,到
stockmu的最大值為止,並將其命名為grid。 - 使用 rep() 建立兩個與
grid等長的空向量,用來儲存投資組合的平均報酬與標準差。將它們命名為vpm和vpsd。 - 初始化一個有 50 列、30 欄的空矩陣。將其命名為
mweights。你可以使用matrix()函式來建立。 - 建立一個 for 迴圈,從
grid的第一個值跑到最後一個值。for 迴圈中應建立一個名為opt的投資組合,使用returns,且目標報酬率為grid。 - 在每次迭代中,for 迴圈應將
opt中對應的值填入向量vpm($pm)、vpsd($ps)。 - 將投資組合權重逐列儲存在
mweights($pw)中。
動手互動練習
試著完成這個範例程式碼,體驗一下這個練習。
# Calculate each stocks mean returns
# Create a grid of target values
grid <- seq(from = ___, to = ___, length.out = ___)
# Create empty vectors to store means and deviations
vpm <- vpsd <-
# Create an empty matrix to store weights
mweights <- matrix(NA, 50, 30)
# Create your for loop
for(i in 1:length(grid)) {
opt <- portfolio.optim(x = ___, pm = ___[i])
vpm[i] <- ___$__
vpsd[i] <- ___$__
mweights[i, ] <- ___$__
}