설명
이것은 다음 항목에 설명된 미니 평균 분산 포트폴리오 선택 문제입니다. 운영부서 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 등'을 넣으십시오.
);
);
);