2013-10-30 25 views
-1

我想在投資組合管理中嘗試遺傳算法,但我現在不知道主要功能和限制應該如何。投資組合管理中的matlab遺傳算法

我有股票價格矩陣,有權重的矢量和計算投資組合價格和投資組合回報/風險(標準差)比率的腳本。我想在MATLAB中使用遺傳算法,因此可以測試不同的wrights組合,並找到最優投資組合(最優 - 最高回報/風險(std)比率。價格

w - 與權重向量[0.333, 0.333, 0.333]

腳本,計算投資組合的表現:

d = length(prices);  
n = numel(prices); 

for j = 1:d 
    temp = 0; 
    for i = 1:n 
     temp = temp + prices(j,i) * w(i); 
    end 
    ap(j) = temp; 
end 

port_performance = rr_ratio(ap); %calculates return/risk(std) ratio. 

我需要找到權重的最佳組合,因此port_performance將具有最大值。 GA功能應該如何,所以sum(w) = 1;w >= 0的每個元素?

謝謝

+0

你可以保存自己的一些代碼行,只寫'ap = prices * w'' –

回答

1

這是一個非常開放的問題。沒有一種將遺傳算法應用於投資組合優化的完美方法。一般來說,你會做的是類似於以下內容:

  1. 隨機生成大量候選投資組合,滿足您的約束。
  2. 根據您的「健身指標」評估每個投資組合,這大概是風險/回報比率。
  3. 選擇您的投資組合的一個子集來「複製」並殺死其餘投資組合。一般來說,你可以按照性能選擇前50%。
  4. 「繁殖」一些新的投資組合。您可以通過無性繁殖(即克隆您的舊投資組合)或有性繁殖(選擇舊投資組合並以某種方式組合它們以產生新投資組合)來實現此目的。
  5. 將突變引入組合中,使用一些小的突變率(比如p = 0.01)。例如,您可以隨意移動一些權重上下,或隨機交換一些不同股票的權重。
  6. 您現在擁有新的投資組合人口,您可以重新開始。

要生成隨機組合開始與讓每個w(i) >= 0sum(w) = 1你可以只是做

>> w = rand(numPortfolios, numStocks); 
>> w = bsxfun(@rdivide, w, sum(w,2)); 

現在的w每行是一組候選組合權重。

繁殖2個組合,你可以只取平均值

>> wNew = 0.5 * (w1 + w2); 

或者你也可以選擇從每個組合隨機元素,然後重新歸一化,以保證權重之和爲1。

>> wNew = zeros(1, numStocks); 
>> x = rand(1, numStocks) < 0.5; 
>> wNew(x) = w1(x); 
>> wNew(~x) = w2(x); 
>> wNew = wNew/sum(wNew); 

你也可以考慮看看this paper