설명
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;