설명
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