DedicationMIP : 거래 가능성 제약이 있는 헌신 모델.

설명

DedicationMIP.gms: 거래 가능성 제약이 있는 헌신 모델.
콘실리오, 닐슨, 제니오스.
실제 재무 최적화: 무료 슬롯 모델 라이브러리, 섹션 4.3.2
최종 수정일: 2008년 4월.

첫 번째 모델 - 단순한 헌신.

카테고리 : 무료 슬롯 FIN 라이브러리


메인파일 : DedicationMIP.gms 포함: BondData.inc

$title 거래 가능성 제약이 있는 헌신 모델

* DedicationMIP.gms: 거래성 제약이 있는 헌신 모델입니다.
* Consiglio, Nielsen 및 Zenios.
* 실제 재무 최적화: 무료 슬롯 모델 라이브러리, 섹션 4.3.2
* 최종 수정일: 2008년 4월.

* 첫 번째 모델 - 단순한 헌신.

SET 시간 기간 /2001 * 2011/;

별칭(시간, t, t1, t2);

스칼라
   현재 올해
   지평선 끝의 지평선;

지금 = 2001;
지평선 = CARD(t)-1;

매개변수
        tau(t) 시간(년)입니다.

* 참고: 시간은 0부터 시작됩니다.

타우(t) = ORD(t)-1;

세트
        채권 채권의 세계
    /DS-8-06, DS-8-03, DS-7-07,
     DS-7-04, DS-6-11, DS-6-09,
     DS-6-02, DS-5-05, DS-5-03, DS-4-02/;

ALIAS(채권, i);

스칼라
         스프레드 재투자율에 따라 차입금을 스프레드합니다.

매개변수
         가격(i) 채권가격
         쿠폰(i) 쿠폰
         만기(i) 만기
         부채(t) 부채의 흐름
         rf(t) 재투자율
         F(t,i) 현금흐름;

* 채권 데이터. 덴마크 시장의 가격, 쿠폰 및 만기

$include "BondData.inc"

* 데이터 복사/변환. 단위 데이터를 얻기 위해 100으로 나누는 것을 기록하고,
* 만기일에서 "지금"을 뺍니다(타우와 일치함).

가격(i) = BondData(i,"가격")/100;
Coupon(i) = BondData(i,"쿠폰")/100;
Maturity(i) = BondData(i,"Maturity") - 현재;

* t년차 채권 i의 쿠폰 적용 전 현금흐름을 계산합니다.

F(t,i) = 1$(tau(t) = 성숙도(i))
            + 쿠폰(i) $ (tau(t) <= 만기(i) AND tau(t) > 0);

* 단순화를 위해 단기 금리를 각 기간마다 0.03으로 설정했습니다.

rf(t) = 0.04;
스프레드 = 0.02;

매개변수
         부채(t) 부채
         /2002 = 80000, 2003 = 100000, 2004 = 110000, 2005 = 120000,
          2006 = 140000, 2007 = 120000, 2008 = 90000, 2009 = 50000,
          2010 = 75000, 2011 = 150000/;

긍정적인 변수
        x(i) 액면가로 구매함
        잉여금(t) 재투자된 금액
        차입(t) 차입한 금액;

변수
        v0 선행 투자;

방정식
        CashFlowCon(t) 현금 흐름 잔액을 정의하는 방정식.

CashFlowCon(t).. SUM(i, F(t,i) * x(i) ) +
                 ( v0 - SUM(i, 가격(i) * x(i)) ) $(tau(t) = 0) +
                  빌림(t) $(tau(t) < 지평선) +
                 ( ( 1 + rf(t-1) ) * 잉여(t-1) ) $(tau(t) > 0) =E=
                 잉여(t) + 부채(t) $(tau(t) > 0) +
                 ( 1 + rf(t-1) + 스프레드 ) * 차용(t-1) $(tau(t) > 0);

옵션 SOLVEOPT = 교체;

모델 헌신 /CashFlowCon/;

SOLVE LP를 사용하여 v0를 최소화하는 헌신;

DISPLAY "첫 번째 모델 결과";
DISPLAY v0.l, Borrow.l, surplus.l, x.l;

파일 DedicationHandle /"DedicationMIPPortfolios.csv"/;

DedicationHandle.pc = 5;

PUT 헌신핸들;

PUT "거래 제약 없음"/;

루프(나,

        PUT v0.l:10:3,i.tl,BondData(i,"만기"),Coupon(i),(x.l(i)*Price(i)):10:3/;

);

루프(t,

        PUT t.tl,borrow.l(t):10:3,surplus.l(t):10:3/;
);

* 두 번째 모델 - 헌신과 짝수 로트 제약.

스칼라
        LotSize 짝수-로트 요구 사항 /1000/
        고정 비용 거래당 고정 비용 /20/
        VarblCost 변동비용 /0.01/;

정수 변수
        Y(i) 구매한 로트 수를 계산하는 변수;

방정식
        EvenLot(i) 짝수 로트 요구 사항을 정의하는 방정식입니다.

EvenLot(i).. x(i) =E= LotSize*Y(i);

* Y(i)의 합리적인 상한

Y.UP(i) = ceil( SUM(t, 부채(t) ) / 가격(i) / LotSize );

모델 헌신MIPEvenLot /CashFlowCon, EvenLot/;

옵션
        OPTCR = 0
        ITERLIM = 999999
        RESLIM = 100;

MIP를 사용하여 SOLVE DedicationMIPevenLot 최소화 v0;

DISPLAY "두 번째 모델 결과";
DISPLAY x.l,Y.l,v0.l;

PUT "짝수 제약"/;

루프(나,

        PUT v0.l:10:3,i.tl,BondData(i,"만기"),Coupon(i),(x.l(i)*Price(i)):10:3/;

);

루프(티,

        PUT t.tl,borrow.l(t):10:3,surplus.l(t):10:3/;
);

* 세 번째 모델 - 헌신과 고정 및 가변 거래 비용

변수
        TotalCost 최소화할 총 비용
        TransCosts 총 거래 비용(고정 + 변동)

바이너리 변수
        Z(i) 포트폴리오에 포함된 자산에 대한 표시변수

방정식
         거래 비용을 포함한 총 비용을 정의하는 CostDef 방정식
         TransDef 방정식 거래 비용(고정 + 변동)
         UpBounds(i) 각 변수의 상한.

CostDef.. TotalCost =E= v0 + TransCosts;

TransDef.. TransCosts =E= SUM(i, FixCost * Z(i) + VarblCost * x(i));

UpBounds(i).. x(i) =L= x.UP(i) * Z(i);

모델 헌신MIPTrnCosts /CashFlowCon, CostDef, TransDef, UpBounds/;

* 투자에 대한 일부 보수적인 한계

x.UP(i) = LotSize * Y.UP(i);

SOLVE DedicationMIPTrnCosts MIP를 사용하여 총 비용 최소화;

DISPLAY "세 번째 모델 결과";
DISPLAY x.l, v0.l,TotalCost.l, TransCosts.l;

PUT "고정 및 가변 비용"/;

루프(나,

        PUT v0.l:10:3,i.tl,BondData(i,"만기"),Coupon(i),(x.l(i)*Price(i)):10:3/;

);

루프(t,

        PUT t.tl,borrow.l(t):10:3,surplus.l(t):10:3/;
);

* 네 번째 모델 - 짝수 제한을 포함한 전용 및
* 거래 비용.

모델 헌신MIPAll /CashFlowCon, EvenLot, CostDef, TransDef, UpBounds/;

SOLVE DedicationMIPAAll MIP를 사용하여 총 비용 최소화;

DISPLAY "네 번째 모델 결과";
DISPLAY x.l, v0.l,TotalCost.l, TransCosts.l;

PUT "짝수 제약 및 거래 비용"/;

루프(나,

        PUT v0.l:10:3,i.tl,BondData(i,"만기"),Coupon(i),(x.l(i)*Price(i)):10:3/;

);

루프(t,

        PUT t.tl,borrow.l(t):10:3,surplus.l(t):10:3/;
);