설명
이것은 다음 항목에 설명된 미니 평균-분산 포트폴리오 선택 문제입니다. 운영부서 Alan S. Manne의 '슬롯/MINOS: 세 가지 예' 1986년 5월 스탠포드 대학교 연구. 유가증권 수 제한을 위한 정수변수 추가 선택되었습니다. 결과 MINLP 문제는 다른 옵션으로 해결됩니다. 일부 DICOPT 기능을 보여주기 위한 설정입니다. 마지막으로 모델은 슬롯 절차적 기능을 사용한 완전한 열거로 해결됩니다.
소형 유형 모델 :MINLP nlp rminlp
카테고리 : 슬롯 모델 라이브러리
메인 파일 : alan.gms
$title 포트폴리오 분석을 위한 2차 프로그래밍 모델(ALAN,SEQ=124)
$onText
이것은 다음에서 설명한 미니 평균-분산 포트폴리오 선택 문제입니다.
운영부서 Alan S. Manne의 '슬롯/MINOS: 세 가지 예'
1986년 5월 스탠포드 대학교 연구.
유가증권 수 제한을 위한 정수변수 추가
선택되었습니다. 결과 MINLP 문제는 다른 옵션으로 해결됩니다.
일부 DICOPT 기능을 보여주기 위한 설정입니다. 마지막으로 모델은
슬롯 절차적 기능을 사용한 완전한 열거로 해결됩니다.
Manne, AS, 슬롯/MINOS: 세 가지 예. 기술. 대표, 부서
운영 연구, 스탠포드 대학교, 1986.
키워드: 혼합 정수 비선형 프로그래밍, 포트폴리오 최적화,
완전한 열거, 재정
$offText
i '증권' / 하드웨어, 소프트웨어, 연예계, t-bills /를 설정합니다.
별칭(i,j);
스칼라 목표 '목표 평균 연간 포트폴리오 수익률(%)' / 10 /;
모수 평균(i) '개별 증권의 평균 연간 수익률(%)'
/ 하드웨어 8, 소프트웨어 9, 쇼비즈 12, T-Bills 7 /;
테이블 v(i,j) '분산-공분산 배열(%-제곱 연간 수익률)'
하드웨어 소프트웨어 쇼-비즈 T-청구서
하드웨어 4 3 -1 0
소프트웨어 3 6 1 0
쇼-비즈 -1 1 10 0
조표 0 0 0 0;
변수
x(i) '자산 i에 투자된 포트폴리오의 비율'
분산 '포트폴리오의 분산';
양수 변수 x;
방정식
fsum '분수는 1.0에 추가되어야 합니다'
dmean '포트폴리오 평균 수익률 정의'
dvar '분산 정의';
fsum..sum(i, x(i)) =e= 1.0;
dmean.. sum(i, 평균(i)*x(i)) =e= 목표;
dvar.. sum(i, x(i)*sum(j,v(i,j)*x(j))) =e= 분산;
모델 포트폴리오 / fsum, dmean, dvar /;
분산을 최소화하는 nlp를 사용하여 포트폴리오를 해결합니다.
* 이제 우리 포트폴리오에는 3개의 자산만 허용됩니다.
Scalar maxassets '포트폴리오의 최대 자산' / 3 /;
이진 변수 active(i) '지시자: 1이면 자산이 포트폴리오에 있음';
방정식
setindic(i) '활성 상태가 0이면 포트폴리오에 없는 것입니다.'
maxactive '포트폴리오의 최대 자산 수를 정의합니다';
setindic(i).. x(i) =l= 활성(i);
maxactive.. sum(i, active(i)) =l= maxassets;
모델 p1 / fsum, dmean, dvar, setindic, maxactive /;
분산을 최소화하는 minlp를 사용하여 p1을 해결합니다.
* 이제 dicopt의 솔루션 옵션을 변경합니다.
파일 선택 /dicopt.opt/;
putClose opt '1 중지';
p1.opt파일 = 1;
옵션 limCol = 0, limRow = 0;
분산을 최소화하는 minlp를 사용하여 p1을 해결합니다.
if( p1.modelStat <> %modelStat.optimal%
및 p1.modelStat <> %modelStat.locallyOptimal%
및 p1.modelStat <> %modelStat.feasibleSolution%
및 p1.modelStat <> %modelStat.integerSolution%,
중단 '분산을 최소화하는 p1을 풀 수 없습니다';
);
* 완전한 열거를 수행하고 결과를 입력하는지 확인하기 위해
* 별도의 파일로 제공됩니다.
b / 0, 1 / 설정;
매개변수 boole(b) / 0 0, 1 1 /;
별칭(b,b1,b2,b3,b4);
파일 res / results.put /;
입술을 넣어;
스칼라 최소 / 1.0e10 /;
p1.solPrint = %solPrint.summary%;
p1.opt파일 = 0;
loop(i, put ' ',i.tl:4 );
'분산'을 넣어;
루프((b1,b2,b3,b4),
active.fx('하드웨어') = boole(b1);
active.fx('소프트웨어') = boole(b2);
active.fx('쇼-비즈') = boole(b3);
active.fx('t-bills') = boole(b4);
rminlp를 사용하여 분산을 최소화하는 p1을 해결합니다.
/ 부울(b1):5:0 부울(b2):5:0 부울(b3):5:0 부울(b4):5:0;
if(p1.solveStat <> %solveStat.normalCompletion%,
put ' *** failedsolvStat=' p1.solveStat:0:0 ' modelStat=', p1.modelStat:0:0;
'해석기 실패' 표시, p1.solveStat, p1.modelStat;
그렇지 않으면
if(p1.modelStat <= %modelStat.locallyOptimal% 또는 p1.modelStat = %modelStat.feasibleSolution%,
차이를 두세요.l:15:5;
if(variance.l < 최소,
'*'를 넣어;
최소 = 분산.l;
);
그렇지 않으면
'infeas 등'을 넣으십시오.
);
);
);