MeanVar : 평균-분산 효율적인 포트폴리오

설명

MeanVar.gms: 평균-분산 모델.
콘실리오, 닐슨, 제니오스.
실제 재무 최적화: 슬롯 모델 라이브러리, 섹션 3.2
최종 수정 날짜: 2008년 4월.

카테고리 : 슬롯 FIN 라이브러리


메인파일 : MeanVar.gms 포함: 추정.gdx

$title 평균-분산 모델.

* MeanVar.gms: 평균-분산 모델.
* Consiglio, Nielsen 및 Zenios.
* 실제 재무 최적화: 슬롯 모델 라이브러리, 섹션 3.2
* 최종 수정일: 2008년 4월.

SET 자산;

ALIAS(자산,i,j);

매개변수
         무위험비율
         기대수익률(i) 기대수익률
         VarCov(i,j) 분산-공분산 행렬 ;

* Estimate.gdx에서 평균-분산 모델을 실행하는 데 필요한 데이터를 읽습니다.

$gdxIn 추정치
$load Assets=하위 집합 RiskFreeRate=MeanRiskFreeReturn VarCov 예상 수익
$gdxIn

* 위험 태도: 0은 위험 중립, 1은 매우 위험 회피입니다.

스칼라
    람다 위험 태도;

긍정적인 변수
    x(i) 자산 보유;

변수
    PortVariance 포트폴리오 분산
    PortReturn 포트폴리오 반환
    z 목적 함수 값;

방정식
    포트폴리오 수익을 정의하는 ReturnDef 방정식
    포트폴리오 차이를 정의하는 VarDef 방정식
    정규화 제약 조건을 정의하는 NormalCon 방정식
    ObjDef 목적 함수 정의;

ReturnDef .. PortReturn =e= SUM(i, ExpectedReturns(i)*x(i));

VarDef .. PortVariance =e= SUM((i,j), x(i)*VarCov(i,j)*x(j));

NormalCon .. SUM(i, x(i)) =e= 1;

ObjDef .. z =e= (1-lambda) * PortReturn - 람다 * PortVariance;

MODEL MeanVar 'PFO 모델 3.2.3' /ReturnDef,VarDef,NormalCon,ObjDef/;

* 디스크에 파일을 정의하고 파일 핸들 FrontierHandle에 연결합니다.
* 기본적으로 파일은 현재 디렉터리에 기록됩니다.

* 디스크에 파일을 정의하고 파일 핸들 FrontierHandle에 연결합니다.
* 기본적으로 파일은 현재 디렉터리에 기록됩니다.

파일 FrontierHandle /"MeanVarianceFrontier.csv"/;

* 출력 형식을 적절하게 지정하려면 몇 가지 옵션을 추가하기만 하면 됩니다.
* 쉼표로 구분된 값(CSV) 파일을 작성해 드립니다.
* 모든 스프레드시트에서 쉽게 읽을 수 있습니다(137페이지 참조).
* 슬롯 사용자 가이드).
* 또한, 보유 포트폴리오가 잘 보이도록 페이지 너비를 확대하십시오.
* 한 줄로 맞춰보세요.

FrontierHandle.pc = 5;
FrontierHandle.pw = 1048;

* 파일 핸들 "Frontier"에 출력 스트림을 할당합니다.

PUT 프론티어핸들;

* 제목을 쓰세요

PUT "람다","z","분산","ExpReturn";

LOOP(i, PUT i.tl);

놓다 /;

FOR(람다 = 0 TO 1 BY 0.1,

   nlp를 사용하여 z를 최대화하는 MeanVar 해결;

   PUT 람다:6:5, z.l:6:5, PortVariance.l:6:5, PortReturn.l:6:5;

   LOOP(i, PUT x.l(i):6:5 );

   넣어 /;
)

* 파일 닫기

닫아라;

* GDX 유틸리티를 통해 Excel 파일로 직접 출력

SET 프론티어포인트 / PP_0 * PP_10 /

ALIAS(프론티어포인트,p);

매개변수
         RiskWeight(p) 투자자의 위험 태도 매개변수
         MinimumVariance(p) 포트폴리오 분산의 최적 수준
         포트폴리오반환(p) 포트폴리오반환
         OptimalAllocation(p,i) 최적의 자산 배분
         SolverStatus(p,*) 솔버 상태
         SummaryReport(*,*) 요약 보고서;

* 위험 가중치 람다는 [0,1] 구간 내에 있어야 합니다.

위험가중치(p) = (ORD(p)-1)/(CARD(p)-1);

DISPLAY 위험가중;

루프(p,
   람다 = 위험가중치(p);
   NLP를 사용하여 z를 최대화하는 MeanVar를 해결합니다.
   MeanVar.SOLPRINT = 2;
   최소 차이(p)= PortVariance.l;
   PortfolioReturn(p) = PortReturn.l;
   OptimalAllocation(p,i) = x.l(i);
   SolverStatus(p,'solvestat') = MeanVar.solvestat;
   SolverStatus(p,'modelstat') = MeanVar.modelstat;
   SolverStatus(p,'objective') = MeanVar.objval
);

* 결과를 행별로 저장

SummaryReport(i,p) = OptimalAllocation(p,i);
SummaryReport('Variance',p) = 최소Variance(p);
SummaryReport('Return',p) = PortfolioReturn(p);
SummaryReport('Lambda',p) = RiskWeight(p);

DISPLAY 요약보고서, 솔버상태;

* 요약 보고서를 Excel 파일에 작성
임베디드 코드 연결:
- 슬롯리더:
    기호: [  이름: 요약 보고서  ]
- 엑셀작성기:
    파일: MeanVarianceFrontier.xlsx
    기호: [  이름: SummaryReport, 범위: Sheet!A1  ]
endEmbeddedCode