설명
주식의 작은 하위 집합을 함께 선택하는 최적화 모델 이 포트폴리오는 우리의 포트폴리오와 유사한 행동을 하도록 일부 가중치를 부여합니다. 전체 다우존스 지수.
카테고리 : 피망 슬롯 데이터 유틸리티 라이브러리
메인 파일 : pickstock.gms 포함: pickstock.gms dowjones2016.csv
$title 주식 선정 최적화
* 주식의 작은 하위 집합을 함께 선택하는 최적화 모델
* 이 포트폴리오가 우리의 포트폴리오와 유사한 동작을 갖도록 하는 일부 가중치
* 전체 다우존스 지수.
날짜를 '날짜'로 설정하세요.
기호 '주식 기호';
$onExternalInput
매개변수 가격(날짜<,symbol<) '가격';
스칼라 maxstock '선택할 최대 주식 수' / 2 /
trainingdays '훈련 일수' / 99 /;
$setNames "%피망 슬롯input%" fp fn fe
$설정되지 않은 경우 fileName $set fileName %fp%dowjones2016.csv
$call.checkErrorLevel gamstool csvread "%fileName%" gdxout=stockdata.gdx id=가격 인덱스=1,2 값=3 UseHeader=y > %system.nullfile% 2>&1
$gdxIn 재고 데이터
$로드 가격
$offExternalInput
별칭 (d, 날짜), (s, 기호);
매개변수
avgprice(symbol) '주가의 평균 가격'
무게(기호) '재고의 무게'
기여도(날짜, 기호) '일자에 주식의 기여도'
index(날짜) '다우존스 지수';
매개변수
Fund(date) '인덱스 펀드 보고서 매개변수'
error(date) '절대 오류';
td(date) '훈련일' 설정
ntd(date) '훈련이 없는 날';
* 입력 유효성 검사
set error01(날짜, 기호);
error01(날짜, 기호) = 가격(날짜, 기호) < 0;
파일 로그 / miro.log /;
로그 넣기 '-------------------------'/;
로그에 '데이터 유효성 검사'/를 입력합니다.
로그 넣기 '-------------------------'/;
if(카드(오류01),
put log '가격:: 음수 가격은 허용되지 않습니다!'/;
loop(error01(날짜, 기호),
put log / ' 기호 ' 기호.tl:4 '는 날짜에 음수 가격이 있습니다: ' date.tl:0;
);
"데이터 오류가 감지되었습니다."를 중단합니다.
);
putclose 로그;
평균 가격(들) = 합계(d, 가격(d,s))/카드(d);
가중치(기호) = avgprice(symbol)/sum(s, avgprice(s));
기여도(d,s) = 무게(s)*가격(d,s);
index(d) = 합계(s, 기여도(d,s));
변수
p(기호) '재고가 포함되어 있나요?'
w(기호) '포트폴리오의 어떤 부분'
slpos(date) '긍정적 여유'
slneg(date) '부정적인 여유 시간'
obj '객관적';
양수 변수 w, slpos, slneg;
이진변수 p;
방정식
deffit(date) '다우존스 지수에 적합'
defpick(symbol) '선택한 경우에만 재고를 사용할 수 있습니다'
defnumstock '몇몇 주식 허용'
defobj '인덱스의 절대 위반(L1 규범)';
deffit(td).. sum(s, 가격(td,s)*w(s)) =e= index(td) + slpos(td) - slneg(td);
defpick(s).. w(s) =l= p(s);
defnumstock.. sum(s, p(s)) =l= maxstock;
defobj..obj =e= sum(td, slpos(td) + slneg(td));
모델 pickStock /all/;
옵션 optCR=0.01;
td(d) = ord(d)<=훈련일수;
ntd(d) = td(d)가 아님;
mip를 사용하여 pickStock min obj를 해결합니다.
자금(d) = 합계(s, 가격(d, s)*w.l(s));
error(d) = abs(index(d)-fund(d));
fHdr '펀드 헤더' / dj '다우존스','인덱스 펀드' 설정 /
errHdr '주식 기호 헤더' / '절대 오류 열차', '절대 오류 테스트' /;
$onExternalOutput
스칼라 error_train '전체 훈련 단계의 절대 오류'
error_test '전체 테스트 단계의 절대 오류'
error_ratio '오류 테스트와 오류 열차 간의 비율'
매개변수
stock_weight(기호) '무게'
dowVSindex(date,fHdr) '다우존스 대 인덱스 펀드'
abserror(date,errHdr) '절대 오류'
테이블 dowVSindex;
테이블 오류;
싱글톤 세트
firstDayTraining(date) '훈련 기간의 첫 번째 날짜'
lastDayTraining(date) '훈련 기간의 마지막 날짜' ;
$offExternalOutput
재고_중량(s) = w.l(s);
dowVSindex(d,'dj') = index(d);
dowVSindex(d,'인덱스 펀드') = Fund(d);
abserror(td, '절대 오차 열차') = error(td);
abserror(ntd,'절대 오류 테스트') = error(ntd);
lastDayTraining(td) = td.pos=card(td);
firstDayTraining(td) = td.pos=1;
error_train = obj.l;
error_test = sum(ntd, 오류(ntd));
if(error_train > 0,
error_ratio = error_test/error_train;
그렇지 않으면
error_ratio = inf;);
* 모든 주식과 다우존스 지수를 포함한 매개변수
$onExternalOutput
매개변수 PriceMerge(date,*) '가격(주식 및 다우존스)';
$offExternalOutput
가격Merge(d,symbol) = 가격(d,symbol);
PriceMerge(d,'DowJones') = index(d);