2017-02-04 4 views
0

12 개월 (1 년) 동안 내 포트폴리오를 재조정하기 위해 Mean-variance optimization을 사용하는 코드를 작성해야합니다. 유일한 것은 각 리 밸런싱 후에 어떻게 자산 수를 늘릴 지 결정해야한다는 것입니다. 반올림 할 때, 새로운 포트폴리오 가치 (거래 비용을 뺀 이후)와 기존 포트폴리오 가치의 차이가 약 $ 3000.00의 최대 한도까지 양수인지 확인해야합니다.MATLAB : 내 벡터를 반복하고 위아래로 반올림하는 방법

예를 들어, 자산의 나의 초기 수 있었다 :

첫 번째 기간 동안 자산의 나의 새로운 재조정 수
x_int = [4500, 6000, 0, 0, 0, 500, 1550, 0, 1000, 0]; 

이었다

x_new = [2490.67, 4401.78, 1502.30, 0, 1010.45, 2803.85, 3489.77, 0, 650.98, 1001.87]; 

내 초기 포트폴리오 값이 $ 1,897,560.30

했다 첫 번째 기간 동안의 내 재조정 된 포트폴리오 가치는 1,658,923.76 달러 (모든 자산 수치를 반올림 한 후)와 2,001,876.95 달러로 나타났습니다 (모든 자산 수치를 반올림 한 후 저녁을 먹다).

x_new 값을 반복하여 각 개별 자산 수를 반올림 및 반 내림하고 내 둥근 자산이 나에게 초기 포트폴리오에서 뺄 때 새로운 포트폴리오 가치를 부여하는지 확인하십시오. 값이 내 기준을 충족합니다

고마워요!

+1

어떻게 반올림하여 큰 차이가 있습니까? 'round (2490.67) = 2491'이기 때문에이 [round'] (https://www.mathworks.com/help/matlab/ref/round.html) 함수에 대해 말하는 것이 아닙니다. –

+0

예, 반올림은 주식 가격에 따라 큰 차이를 만들 수 있습니다. 주가가 $ 250.00의 가치가 있다면 1000 또는 1001 주를 갖는 것이 중요한 가격 차이가됩니다. round 함수가 10 진수 값에 따라 반올림하기 때문에 ceil과 floor 함수를 사용했습니다. (내가 원하지 않는) –

+0

당신이 찾고있는 것이 확실하지 않습니다 : sum (round (x_new)) - sum (x_new)'? –

답변

0

일반적으로 포트폴리오를 기준에 맞게 조정하는 방법이 여러 개 있기 때문에 답변은 사용자가 선호하는 조정 유형에 따라 달라집니다. 다음 접근법은 가장 가까운 정수로 반올림하여 시작한 다음 예산을 충족해야하는 경우 일부 주식을 반대 방향으로 반올림합니다.

하자,

  1. price는 벡터 x_new과 같은 크기와 단위 주가를 나타냅니다.
  2. budget은 새 포트폴리오 값의 상한이됩니다 (예 : 이전 포트폴리오 값 + 3000 + 거래 비용).

첫째, 새로운 포트폴리오 주식을 가장 가까운 정수로 반올림하고 비용을 계산해 봅시다. 여부 cost_rnd에 따라

x_rnd = round(x_new); 
cost_rnd = x_rnd * price'; 

위 또는 budget 아래 우리는 개별 주식의 수를 조정할 것이다. cost_rnd이 예산 부족 인 경우, 반올림 한 주식의 일부를 반올림합니다. 마찬가지로 cost_rnd이 초과 예산 인 경우 일부 라운딩이 위에서 아래로 변경됩니다.

cost_rnd = x_rnd * price'; 
if (cost_rnd > budget) % exceeds budget, so we need to round a few of them down 
    x_adjust_dir = floor(x_new)-x_rnd; 
    cum_adjust_cost = cost_rnd + cumsum(x_adjust_dir .* price); 
    n_adjust = find(cum_adjust_cost < budget, 1, 'first'); 
elseif (cost_rnd < budget) % under-budget, so we should round a few of them up 
    x_adjust_dir = ceil(x_new)-x_rnd; 
    cum_adjust_cost = cost_rnd + cumsum(x_adjust_dir .* price); 
    n_adjust = find(cum_adjust_cost < budget, 1, 'last'); 
else % by some miracle the budget is exactly met 
    n_adjust = []; 
end 

x_adjust_dir의 일부 요소는 0입니다. 그들은 이미 올바른 방향으로 반올림 된 주식을 나타냅니다. 나머지 요소는 예산 초과의 경우 -1이고 예산 부족한 경우는 1입니다. cum_adjust_cost은 반올림 조정으로 인한 누적 변경입니다. n_adjust은 조정 된 비용을 예산 바로 아래에 놓는 누적 조정의 인덱스입니다.

지금 남아있는 모든 조정을 적용하는 것입니다 :

x_final = x_rnd; 
if ~isempty(n_adjust) 
    x_final(1:n_adjust) = x_final(1:n_adjust) + x_adjust_dir(1:n_adjust); 
end 

x_final이 기준을 충족 조정 된 포트폴리오입니다.

+0

안녕하세요 @aksadv, 반올림 코드 덕분에 작동합니다! 그러나 저는 새로운 포트폴리오 가치가 항상 잘못 나온 것처럼 보이는 점에서 예산 측면에 문제가 있습니다. 예 : "이전 포트폴리오 가치"= 1,000,000.00 (재조정 이전) 및 거래 비용 합계가 7,500 달러 (거래 비용은 판매 또는 구매 한 각 자산의 단가의 0.5 %) ..... 리 밸런싱 된 포트폴리오 값 (x_new 사용)은 약 1,006,988.31입니다. 재 계산 된 트랜잭션 비용과 $ 3000.00 한도를 제거하면 저의 예산을 밑으로 두게됩니다. 뭔가 잘못 됐나요 ?? –

+0

죄송합니다. 작은 실수를했습니다. 내 균형 조정 포트폴리오 가치 (x_final 사용)는 1,006,988.31입니다. –

+0

이 예에서 예산은 얼마입니까? x_final 값과 예산 사이의 격차는 무엇입니까? 예제를 공유 할 수 있습니까? – aksadv