설명
상한/하한이 가변적인 간단한 포트폴리오 유형 문제 원근 이완의 힘을 과시하고, 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;
디스플레이 담당자;