부트스트랩 : 수익률 곡선을 부트스트랩합니다.

설명

Bootstrap.gms: 수익률 곡선을 부트스트랩하는 중입니다.
콘실리오, 닐슨, 제니오스.
실제 재무 최적화: 슬롯 게임 모델 라이브러리, 섹션 4.2.3
최종 수정 날짜: 2008년 4월.

카테고리 : 슬롯 게임 FIN 라이브러리


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

$title 수익률 곡선 부트스트래핑

* Bootstrap.gms: 수익률 곡선을 부트스트래핑합니다.
* Consiglio, Nielsen 및 Zenios.
* 실제 재무 최적화: 슬롯 게임 모델 라이브러리, 섹션 4.2.3
* 최종 수정일: 2008년 4월.

SET 시간 기간 /2001 * 2011/;

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

스칼라
   현재 현재 연도;

지금 = 2001;

매개변수
   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) 만기
         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);

변수
     r(t) 현물 환율
     SumOfSquareDev 제곱 편차의 합계입니다.

방정식
    ObjDef 목적 함수 정의;

ObjDef.. SumOfSquareDev =e= SUM(i, sqr(Price(i) - SUM(t, F(t,i) * exp(-r(t) * tau(t)))));

옵션 SOLVEOPT = 교체;

모델 BootstrapSimple /ObjDef/;

NLP를 사용하여 BootstrapSimple 최소화 SumOfSquareDev 해결;

파일 TermStructureHandle /"TermStructure.csv"/;

TermStructureHandle.pc = 5;

PUT TermStructureHandle;

* 제목을 쓰세요

PUT "간단한 부트스트랩"/;
PUT "시간(년)", "현물 환율", "할인 요소", "선물 금리"/;

* 결과를 계산하고 파일에 저장합니다: 현물 가격 및 할인 요소

매개변수
   선도(t) 단일기간 선도이자율
   할인(t) 할인요소;

순방향(t) = r.l(t) $ ( tau(t) = 0 ) + ((tau(t) * r.l(t) - tau(t-1) * r.l(t-1)) / (tau(t) - tau(t-1))) $ (tau(t) > 0 );
할인(t) = exp(-r.l(t) * tau(t));

루프(t$(tau(t) > 0),

     PUT tau(t),r.l(t):6:5,Discount(t):6:5,Forward(t):6:5/;

);

* 또한 각 채권의 만기수익률 y(i)를 계산합니다.
* 이는 제한된 비선형 시스템(CNS)을 해결하여 수행됩니다.

긍정적인 변수
     y(i) 채권의 만기수익률;

방정식
   YieldDef(i) 만기 수익률을 정의하는 방정식.

YieldDef(i) .. Price(i) =E= SUM(t, F(t,i) * exp(-y(i) * tau(t)));

모델 FindYTM /YieldDef/;

* 만기 수익률을 제곱 시스템으로 푼다.

CNS를 사용하여 FindYTM을 해결하세요.

매개변수
   PriceErrors(i) 가격 오류;

PriceErrors(i) = 가격(i) - SUM(t, F(t,i) * exp(-r.l(t) * tau(t)));

* 제목을 쓰세요

PUT "채권","만기수익률","가격 오류"/;

루프(나는,

     PUT i.tl,y.l(i):6:5,PriceErrors(i):6:5/;

);

* 양의 순방향 제약 조건이 있는 모델

방정식
    PosForwardCon(t) 선도율을 양수로 제한하는 방정식.

PosForwardCon(t)$(tau(t) > 0).. tau(t) * r(t) =g= tau(t-1) * r(t-1);

모델 BootstrapPosForward /ObjDef,PosForwardCon/;

NLP를 사용하여 SumOfSquareDev를 최소화하는 BootstrapPosForward 해결;

순방향(t) = r.l(t) $ ( tau(t) = 0 ) + ((tau(t) * r.l(t) - tau(t-1) * r.l(t-1)) / (tau(t) - tau(t-1))) $ (tau(t) > 0 );
할인(t) = exp(-r.l(t) * tau(t));

PUT "포지티브 포워드 부트스트랩"/;
PUT "시간(년)", "현물 환율", "할인 요소", "선물 금리"/;

루프(t$(tau(t) > 0),

     PUT tau(t),r.l(t):6:5,Discount(t):6:5,Forward(t):6:5/;

);

* 만기 수익률을 제곱 시스템으로 푼다.

CNS를 사용하여 FindYTM을 해결하세요.

PriceErrors(i) = 가격(i) - SUM(t, F(t,i) * exp(-r.l(t) * tau(t)));

* 제목을 쓰세요

PUT "채권","만기수익률","가격 오류"/;

루프(나는,

     PUT i.tl,y.l(i):6:5,PriceErrors(i):6:5/;

);

스칼라
   총 오류
   람다;

변수
   가중합제곱

긍정적인 변수
   ForwardRates(t) 단일 기간 선도 금리;

방정식
   WeightedObj재미
   ForwardDef(t) 선도 금리를 정의하는 방정식.

WeightedObjFun.. WeightedSumOfSquares =e= 람다 * SUM(i, sqr(Price(i) - SUM(t, F(t,i) * exp(-r(t) * tau(t))))) + (1-lambda) *
                                           SUM(t$(tau(t) > 0), sqr( ForwardRates(t) - ForwardRates(t-1)));

* 첫 번째 선물환율 F(0,1)은 단일 기간 현물환율과 일치한다는 점을 기억하세요.

ForwardDef(t).. ForwardRates(t) =E= r(t) $ ( tau(t) = 0 ) +
                                     ((tau(t) * r(t) - tau(t-1) * r(t-1)) / (tau(t) - tau(t-1))) $ (tau(t) > 0 );

모델 BootstrapSmooth /WeightedObjFun,ForwardDef/;

PUT "부드러운 부트스트랩"/;

FOR( 람다 = 1.0 DOWNTO 0.0 BY 0.25,

  NLP를 사용하여 Weighted SumOfSquares를 최소화하는 BootstrapSmooth 해결;

  PUT "람다","평균 오류"/;

  totalError = SUM(i, sqr(Price(i) - SUM(t, F(t,i) * exp(-r.l(t) * tau(t)))))

  PUT 람다:3:1, 총 오류:6:5/

  PUT "시간(년)", "현물 환율", "할인 요소", "선물 금리"/;

* 결과를 계산하고 파일에 저장합니다: 현물 가격 및 할인 요소
  할인(t) = exp(-r.l(t) * tau(t));

  루프(t$(tau(t) > 0),

    PUT tau(t),r.l(t):6:5,Discount(t):6:5,ForwardRates.l(t):6:5/;

  );

);

* SpotRates.inc에 현물 요금을 작성하고
* YieldRates.inc에 대한 만기수익률
* 이 데이터는 Immunization.gms에서 사용됩니다.

* 평활화 매개변수가 0.5이면
* 합리적인 기간 구조.

람다 = 0.5

NLP를 사용하여 Weighted SumOfSquares를 최소화하는 BootstrapSmooth 해결;

파일 SpotRatesHandle /"SpotRates.inc"/;

PUT SpotRatesHandle;

루프(t$(tau(t) > 0),

  PUT t.tl:0:0,",",r.l(t):6:5/;

);

PUTCLOSE SpotRatesHandle;

파일 YieldRatesHandle /"YieldRates.inc"/;

PUT YieldRatesHandle;

루프(나는,

  PUT i.tl:0:0,",",y.l(i):6:5/;

);

디스플레이 r.l,y.l;