qp1x.gms : GDX 데이터 입력이 포함된 표준 슬롯 사이트 추천 모델

설명

표준에 대한 일련의 변형 중 첫 번째
슬롯 사이트 추천 공식화. 후속 모델은 데이터를 활용합니다.
그리고 문제 구조는 다음과 같은 공식에 도달합니다.
놀라운 계산적 이점을 가지고 있습니다. 추가
정보는 다음에서 찾을 수 있습니다:

/modlib/adddocs/qp1doc.htm

소형 모델 유형 :NLP


카테고리 : 슬롯 사이트 추천 모델 라이브러리


메인 파일 : 슬롯 사이트 추천x.gms   포함: qpdata.inc

$title GDX 데이터 입력이 있는 표준 슬롯 사이트 추천 모델(QP1X,SEQ=246)

$onText
표준에 대한 일련의 변형 중 첫 번째
슬롯 사이트 추천 공식화. 후속 모델은 데이터를 활용합니다.
그리고 문제 구조는 다음과 같은 공식에 도달합니다.
놀라운 계산적 이점을 가지고 있습니다. 추가
정보는 다음에서 찾을 수 있습니다:

/modlib/adddocs/qp1doc.htm

Kalvelagen, E, GAMS를 사용한 모델 구축. 곧
de Wetering, AV, 개인 통신.

키워드: 비선형 계획법, 2차 계획법, 금융
$offText

* MIT StockMaster에서 발췌
세트
   days '95년 11월 27일부터 96년 4월 29일까지 100일'
   종목 '170개 종목'
   상단(주식,주식)
   lower(주식,주식);

별칭(주식,주식);

매개변수
   val(stocks,days) '종가'
   return(stocks,days) '일일 수익률 - 파생';

* 우리는 Posix 호환 유틸리티 테스트를 사용하여 다음 사항을 확인합니다.
* qpdata.gdx는 qpdata.inc보다 최신 버전입니다. 그렇다면 우리는 할 수 있다
* qpdata.inc 처리를 건너뜁니다. 테스트를 통해 더 많은 검사를 수행할 수 있습니다. 테스트 실행
* --간략한 개요를 보려면 도움말을 참조하세요.
*
* WINDOWS만 해당: GAMS 프로그램 테스트 내에서
* 다른 Posix 유틸리티는 자동으로 사용 가능합니다. 다른 것에서
* 환경에서는 GAMS의 gbin 하위 디렉터리를 추가해야 합니다.
* 시스템 디렉터리를 PATH에 추가합니다(Windows에만 해당).

$call = 테스트 qpdata.gdx -nt qpdata.inc
$ifE errorLevel<>0 $call =gams qpdata.inc lo=0 a=c gdx=qpdata
$ifE errorLevel<>0 $abort qpdata.gdx 생성 문제
$gdxIn qpdata
$로드 일 주식

* 종가의 실행시간 로드
Execute_load 'qpdata', val;

return(주식,일-1) = val(주식,일) - val(주식,일-1);
upper(주식,sstocks) = ord(주식) <= ord(sstocks);
lower(stocks,sstocks) = not upper(stocks,sstocks);

세트
   d(days) '선택한 날짜'
   s(stocks) '선택된 주식';

별칭(s,t);

* 주식 및 기간의 하위 집합을 설정합니다.
d(일) = ord(일) > 1 및 ord(일) < 31;
s(주식) = ord(주식) < 51;

매개변수
   평균(주식) '일일 수익률 평균'
   dev(주식,일) '편차'
   covar(stocks,sstocks) '수익률의 공분산 행렬(상위)'
   totmean '총 평균 수익률';

평균(들) = sum(d, return(s,d))/card(d);
dev(s,d) = return(s,d) - 평균(들);

* 공분산 계산
* 메모리와 시간을 절약하기 위해 상부 삼각함수만 계산합니다.
* 공분산 행렬이 대칭인 부분
covar(upper(s,t)) = sum(d, dev(s,d)*dev(t,d))/(card(d) - 1);

totmean = 합계(들, 평균(들))/(카드(들));

변수
   z '객관 변수'
   x(주식) '투자';

양수 변수 x;

방정식
   obj '목표'
   예산
   retcon '반환 제약';

obj.. z =e= sum(upper(s,t), x(s)*covar(s,t)*x(t))
            + sum(lower(s,t), x(s)*covar(t,s)*x(t));

예산.. 합계(s, x(s)) =e= 1.0;

retcon.. sum(s, 평균(들)*x(s)) =g= totmean*1.25;

모델 qp1 / 모두 /;

* 일부 솔버에는 더 많은 메모리가 필요합니다.
qp1.workFactor = 10;
z를 최소화하는 nlp를 사용하여 qp1을 해결합니다.
디스플레이 x.l;

* GDX 파일에 솔루션 덤프
Execute_unload 'qp1xsol', x = xsol;

* 용액이 올바르게 저장되었는지 확인해보세요
x.l(s) = 0;
Execute_load 'qp1xsol', x = xsol;
qp1.iterLim = 20;
z를 최소화하는 nlp를 사용하여 qp1을 해결합니다.

* 재최적화된 솔루션을 GDX 파일로 덤프합니다.
Execute_unload 'qp1xso2', x = xsol;

* 두 GDX 파일 비교
'gdxdiff qp1xsol qp1xso2 %system.redirlog%'를 실행합니다.

* diff GDX 파일 덤프
'gdxdump difffile %system.redirlog%'를 실행합니다.