pmeanvar.gms : 가변 상한 및 하한을 갖는 평균-분산 모델

설명

상한/하한이 가변적인 간단한 포트폴리오 유형 문제
원근 이완의 힘을 과시하고,
SOCP로 만드는 방법

제공: Jeff Linderoth, 위스콘신 대학교 매디슨

소형 모델 유형 :MIQCP


카테고리 : 무료 슬롯 사이트 모델 라이브러리


메인 파일 : pmeanvar.gms   포함: mvdata.gdx

$title 가변 상한 및 하한을 갖는 평균-분산 모델(PMEANVAR,SEQ=380)

$onText
상한/하한이 가변적인 간단한 포트폴리오 유형 문제
원근 이완의 힘을 과시하고,
SOCP로 만드는 방법

제공: Jeff Linderoth, 위스콘신 대학교 매디슨

O. Gunluk 및 J. T. Linderoth, 혼합의 관점 이완
표시 변수가 있는 정수 비선형 프로그램,
수학적 프로그래밍, 시리즈 B, 104:183-206, 2010.

키워드: 혼합 정수 2차 제약 조건 프로그래밍, 포트폴리오 최적화,
          금융
$offText

i를 '자산'으로 설정합니다.

별칭(i,j);

매개변수
   Q(i,j) '공분산 행렬'
   alpha(i) '예상 수익'
   ell(i) '최소 바이인'
   u(i) '최대 바이인';

스칼라 rho '최소 수익';

$설정되지 않은 경우 isize $set isize 10
$ifE %isize%>200 $abort 최대 크기는 200입니다.

i / 1*%isize% /로 설정;

$gdxIn mvdata
$load Q 알파 엘 유 로

* Q와 Q-D의 고유값과 촐레스키 인자 생성
매개변수
   L(i,j) 'Q의 촐레스키'
   LT(j,i) 'Q의 촐레스키 전치'
   D(i) 'Q의 대각선 추출'
   R(i,j) 'Q - D'
   M(i,j) 'R의 촐레스키'
   MT(j,i) 'R의 Cholesky 전치';

ExecuteTool.checkErrorLevel 'linalg.eigenvalue i Q D';
* 기호 D는 ExecuteTool.checkErrorLevel에 의해 암시적으로 로드되었습니다. 컴파일러 명령어
* 다음 줄에서는 아마도 할당되지 않은 기호에 대한 오류를 억제합니다.
$onImplicitAssign

D(i) = D('1') - 0.001;
R(i,j) = Q(i,j) - D('1')$sameas(i,j);

ExecuteTool.checkErrorLevel 'linalg.cholesky i Q L';
옵션 LT < L;

ExecuteTool.checkErrorLevel 'linalg.cholesky i R M';
옵션 MT < M;

변수
   분산 '객관적 변수'
   x(i) '구매 금액'
   y(i) 'x^2에 대한 대체'
   z(i) '구매 지표';

양수 변수 x, y;
이진변수 z;

방정식
   분산_콘
   예산_콘
   return_con
   vlb_con(i)
   vub_con(i);

variance_con.. 분산 =e= sum((i,j), Q(i,j)*x(i)*x(j));

Budget_con..sum(i,x(i)) =e= 1;

return_con.. sum(i, alpha(i)*x(i)) =g= rho;

vlb_con(i).. x(i) =g= ell(i)*z(i);

vub_con(i).. x(i) =l= u(i)*z(i);

분산.l = 0;

옵션 optCr = 0;

모델 basic_mv / variance_con, Budget_con, return_con, vlb_con, vub_con /;

miqcp를 사용하여 분산을 최소화하는 basic_mv를 해결합니다.

매개변수 담당자;
담당자('기본','obj') = 분산.l;
담당자('기본','초') = basic_mv.resUsd;

변수
   w(i) 'w = L^Tx'
   v '목표: 두 번째 회전 원뿔 var'
   fx '사회용';

방정식
   wdef_con(i) 'w = L^Tx'
   conedef_con '2rv >= ||w||^2';

v.lo = 0;
fx.fx = 0.5;

* MOSEK에 대한 명시적 원뿔 구문
* conedef_con..fx + v =c= sum(i, w(i));

conedef_con.. 2*fx*v =g= sum(i, sqr(w(i)));

wdef_con(i).. w(i) =e= sum(j, LT(i,j)*x(i));

모델 basic_socp_mv / Budget_con, return_con, vlb_con, vub_con, conedef_con, wdef_con /;

miqcp를 사용하여 v를 최소화하는 basic_socp_mv를 해결합니다.

담당자('socp','obj') = 분산.l;
담당자('socp','secs') = basic_socp_mv.resUsd;

양수 변수 t(i) '(2t_j) z_j >= x_j^2 : 2t = y: min 2Dt';

방정식
   pobj_def '관점 목표'
   w2def_con(i) 'w = M^Tx'에 대해
   pcone_def(i) '2t_i z_i >= x_j^2'에 대해';

pobj_def.. 분산 =e= v + sum(i, 2*D(i)*t(i));

w2def_con(i).. w(i) =e= sum(j, MT(i,j)*x(j));

* MOSEK에 대한 명시적 원뿔 구문
* 변수 zz(i);
* 방정식 defzz(i);
* defzz(i)..zz(i) =e= z(i);
* pcone_def(i)..t(i) + zz(i) =c= x(i);
* 모델 p_socp_mv / pobj_def, w2def_con, pcone_def, conedef_con
* Budget_con, return_con, vlb_con, vub_con, defzz /;

pcone_def(i).. 2*t(i)*z(i) =g= sqr(x(i));

모델 p_socp_mv / pobj_def, w2def_con, pcone_def, conedef_con Budget_con, return_con, vlb_con, vub_con /;

miqcp를 사용하여 분산을 최소화하는 p_socp_mv를 해결합니다.

담당자('p_socp','obj') = 분산.l;
담당자('p_socp','secs') = p_socp_mv.resUsd;

디스플레이 담당자;