설명
MAD.gms: 슬롯 머신/Call 효율적인 프론티어 모델. 콘실리오, 닐슨, 제니오스. 실제 재무 최적화: GAMS 모델 라이브러리, 섹션 5.7 최종 수정 날짜: 2008년 4월.
카테고리 : 슬롯 머신 FIN 라이브러리
메인파일 : PutCall.gms 포함: Corporate.inc WorldIndices.inc Index.inc
$title 슬롯 머신/Call 효율적인 프론티어 모델
* MAD.gms: 슬롯 머신/Call 효율적인 프론티어 모델.
* Consiglio, Nielsen 및 Zenios.
* 실제 재무 최적화: GAMS 모델 라이브러리, 섹션 5.7
* 최종 수정일: 2008년 4월.
$설정하지 않은 경우 $설정 PutCallModel 설정
$include "WorldIndices.inc"
옵션 LIMROW=0,LIMCOL=0,SOLVELINK=2;
스칼라
예산 명목 투자예산
예상 부족분에 대한 Omega Bound;
예산 = 100.0;
매개변수
pr(l) 시나리오 확률
P(i,l) 최종 값
EP(i) 최종 예상 값;
pr(l) = 1.0 / 카드(l);
P(i,l) = 1 + 자산 반환(i,l);
EP(i) = SUM(l, pr(l) * P(i,l));
매개변수
TargetIndex(l) 목표 인덱스 반환;
* 시장 지수로 모델을 테스트하려면 다음 두 줄의 주석 처리를 제거하세요.
* 이 색인은 WorldIndexes.inc를 사용할 때만 일관성이 있습니다.
$include "Index.inc"
TargetIndex(l) = Index(l);
* UnConstrained 슬롯 머신/Call 모델의 원초
매개변수
하한(i)
상한(i);
긍정적인 변수
yPos(l) 양의 편차
yNeg(l) 음의 편차;
변수
x(i) 화폐 단위(비율 아님)로 자산 보유
z 목적 함수 값;
방정식
예산 제약을 정의하는 BudgetCon 방정식
ObjDef MAD에 대한 목적 함수 정의
TargetDevDef(l) 양수 및 음수 편차를 정의하는 방정식
음수 편차의 예상 값을 제한하는 PutCon 제약 조건;
BudgetCon .. SUM(i, x(i)) =E= 예산;
PutCon .. SUM(l, pr(l) * yNeg(l) ) =L= 오메가;
TargetDevDef(l).. SUM(i, ( P(i,l) - TargetIndex(l) ) * x(i) ) =E= yPos(l) - yNeg(l);
ObjDef .. z =E= SUM(l, pr(l) * yPos(l));
MODEL UnConPutCallModel '모델 PFO 5.7.1' / PutCon, TargetDevDef, ObjDef /;
* 허용되는 하락(위험)의 평균 수준을 설정합니다.
오메가 = 0.1;
LP를 사용하여 z를 최대화하는 UnConPutCallModel 해결;
* UnConstrained 슬롯 머신/Call 모델의 이중
긍정적인 변수
파이(l)
파이오메가;
방정식
DualObjDef
이중 추적 정의(i)
MeasureDef(l);
DualObjDef .. z =E= 오메가 * PiOmega;
DualTrackingDef(i).. SUM(l, (P(i,l) - TargetIndex(l)) * Pi(l)) =E= 0.0;
MeasureDef(l)..pr(l) * PiOmega - Pi(l) =G= 0;
Pi.LO(l) = pr(l);
MODEL UnConDualPutCallModel '모델 PFO 5.7.2' / DualObjDef, DualTrackingDef, MeasureDef /;
LP 사용을 최소화하는 UnConDualPutCallModel 해결;
* PiOmega.l과 Pi.l을 표시하고 각각 동일한지 확인합니다.
* TargetDevDef.m 및 PutCon.m으로
* GAMS에서는 이중 가격을 직접 제공하므로,
* 이중 모델을 명시적으로 구축하는 데 실제로 필요합니다.
PARAMETER PrimalDual(l,*) 원초 영혼과 이중 영혼을 비교합니다.
PrimalDual(l,'pi.l') = - pi.l(l);
PrimalDual(l,'TargetDevDef.m') = TargetDevDef.m(l);
PrimalDual(l,'차이') = TargetDevDef.m(l)+pi.l(l);
DISPLAY z.l,PiOmega.l,PutCon.m,PrimalDual;
* 우리는 다음을 사용하여 프론티어를 구축하는 대안적인 방법을 제안합니다.
* 루프문. 이러한 구조는 다음과 같은 용도에 적합합니다.
* GDX 유틸리티(자세한 내용은 doc 폴더에 포함된 gdxutility.pdf 참조)
옵션 SOLPRINT = 꺼짐;
세트
프론티어포인트 /P_1 * P_50/;
* 프론티어의 포인트 수
별칭(프론티어포인트, j);
매개변수
프론티어 포트폴리오(j,i) 프론티어 포트폴리오
CallValues(j,*) 호출 값
DualPrices(j,*) 이중 가격
PutCall(j,*) 슬롯 머신 및 Call 값
OmegaLevels(j) 위험 수준(Omega);
FILE 임시 파일 핸들 / temp.txt /;
* 각 포인트에 위험 수준 Omega를 할당합니다.
OmegaLevels('P_1') = 0.01;
루프(j$(ORD(j) > 1),
오메가레벨(j) = 오메가레벨(j-1) + (0.01)$(ORD(j) <= 10) + (0.025)$(ORD(j) > 10)
);
Dualprices(j,'Omega') = OmegaLevels(j);
CallValues(j,'Omega') = OmegaLevels(j);
* 일부 유동성 제약 설정
x.LO(i) = -100.0;
x.UP(i) = 100.0;
루프(j,
오메가 = Omega레벨(j);
LP를 사용하여 z를 최대화하는 UnConPutCallModel 해결;
프론티어포트폴리오(j,i) = x.L(i);
CallValues(j,'Mild Constraint') = z.L;
Dualprices(j,'Mild Constraint') = PutCon.M
);
임베디드 코드 연결:
- GAMS리더:
기호: [ 이름: FrontierPortfolios ]
- 엑셀작성기:
파일: %out%.xlsx
기호: [ 이름: FrontierPortfolios, 범위: MildPortfolios!A1 ]
endEmbeddedCode
* 엄격한 유동성 제약 설정
x.LO(i) = -20.0;
x.UP(i) = 20.0;
루프(j,
오메가 = Omega레벨(j);
LP를 사용하여 z를 최대화하는 UnConPutCallModel 해결;
프론티어포트폴리오(j,i) = x.L(i);
CallValues(j,'Tight Constraint') = z.L;
Dualprices(j,'Tight Constraint') = PutCon.M
);
임베디드 코드 연결:
- GAMS리더:
기호: [ 이름: DualPrices , 이름: CallValues , 이름: FrontierPortfolios ]
- 엑셀작성기:
파일: %out%.xlsx
기호:
- 이름: DualPrices, 범위: DualPrices!A1
- 이름: CallValues, 범위: CallValues!A1
- 이름: FrontierPortfolios, 범위: TightPortfolios!A1