alan.gms : 포트폴리오 분석을 위한 2차 프로그래밍 모델

설명

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