설명
담보대출 채무(CMO)는 구조 조정에 사용됩니다. 기본 모기지 담보에서 일련의 현금흐름이 발생합니다. 다양한 만기의 고품질 채권. 다음에서 혼합 정수 프로그래밍은 모기지를 재구성하는 데 사용됩니다. 6개의 일반 트랜치와 1개의 제로 트랜치로 풀링됩니다. 모델은 실험이 가능하도록 일반적인 형식으로 작성되었습니다. 다른 주기로. 다음 버전은 연간 버전입니다.
대형 모델 유형 :MIP
카테고리 : 슬롯 사이트 모델 라이브러리
메인 파일 : cmo.gms
$title 재무 최적화: 금융 공학(CMO,SEQ=114)
$onText
모기지담보대출(CMO)은 구조조정에 사용됩니다.
기본 모기지 담보에서 일련의 현금흐름이 발생합니다.
다양한 만기의 고품질 채권. 다음에서
혼합 정수 프로그래밍은 모기지를 재구성하는 데 사용됩니다.
6개의 일반 트랜치와 1개의 제로 트랜치로 풀링됩니다.
모델은 실험이 가능하도록 일반적인 형식으로 작성되었습니다.
다른 주기로. 다음 버전은 연간 버전입니다.
Dahl, H, Meeraus, A 및 Zenios, S A, 일부 재무 최적화
모델: 위험 관리. Zenios, S A, Ed, 재무 최적화.
캠브리지 대학 출판부, 뉴욕, 뉴욕, 1993.
키워드: 혼합 선형 계획법, 재무 최적화, 모기지
의무, 재정
$offText
세트
i '트랜치' / n1*n6, m /
n(i) '일반 트랜치' / n1*n6 /
m(i) 'm 트랜치' / m /
슬롯 사이트 '기간' / 0*10 /
ts(슬롯 사이트) '결제일' / 0 /
t(슬롯 사이트) '지급 기간' / 1*10 /
tl(슬롯 사이트) '마지막 결제' / 10 /
zpos(i,슬롯 사이트) '트랜쉐별 지불 가능 기간';
별칭 (i,j), (슬롯 사이트tau);
* 참고: 모든 요금은 월별 요금 x 12입니다. 집계하려면 다음을 수행해야 합니다.
* 동등한 비율을 계산합니다.
*
* (1 + r/12)**12 == (1 + r)**d
스칼라
cg '연간 담보 총액 쿠폰' / .10 /
nom '담보의 명목 가치' / 100 /
s '서비스 요금' /.005 /
psa '가격 책정 속도' / 115 /
d '주기성' / 1 /
age '담보 연령(년)'
minn '최소 일반 트랜치 수' / 3 /
minm '최소 m 트랜치 수' / 1 /;
테이블 트랜치(*,*) '트랜치 데이터(연간 이표 및 수익률)'
쿠폰 수익률 낮은 월 업 월
n1 .085 .099 1.00 1.24
n2 .085 .0999 2.00 2.44
n3 .085 .0999 3.00 3.44
n4 .0875 .1006 4.00 4.44
n5 .0875 .1009 5.00 5.65
n6 .0875 .1017 7.00 7.94
n7 .0875 .1018 10.00 10.94
n8 .0875 .1025 15.00 20.00
m .0995 .105
r .1285 ;
매개변수
po(슬롯 사이트) '선불금 없이 미결제 담보 원금'
'제로 선불 연금'
bv(슬롯 사이트) 'bvf 계산을 위한 임시 인자'
bvfac(슬롯 사이트) 'bvf 계산을 위한 임시 인수 - 회전 합계'
bvf(슬롯 사이트) '채권 가치 인자'
pe(슬롯 사이트) '예상 미결제 담보 원금'
b(슬롯 사이트) '선불 비율'
cflow(슬롯 사이트) '예상 담보 지급'
prin(슬롯 사이트) '담보로부터 원금 지급 구조화'
기름통 '프린의 합'
cd '정기 총액 쿠폰'
sd '정기 서비스 요금'
쿠폰(i) '트랑슈별 정기 쿠폰'
Yield(i) '트랑슈에 의한 정기적인 수익률'
연도 '주기적 잔여수익률'
wallo(i) '주기적으로 더 낮은 가중치 평균 수명'
walup(i) '주기적 상위 가중 평균 수명'
빅 '큰 숫자'
작은 '작은 숫자'
cmax '최대 cmo 쿠폰'
tmax '담보 만기 기간'
rev(슬롯 사이트) '역순 주소'
psum(슬롯 사이트) '슬롯 사이트까지 담보로 지불한 원금 합계'
tpsum(슬롯 사이트) '기간원금지급상품의 합'
walp(슬롯 사이트) '담보로 인한 원금 지급에 대한 월';
rev(슬롯 사이트) = 카드(슬롯 사이트) - 2*ord(슬롯 사이트) + 1;
tmax = 카드(t);
나이 = (360 - tmax*12/d)/12;
b(t) = 0.06*(psa/100)*min((ord(t) + 연령*d)/(d*2.5),1);
cd = (1 + cg/12)**(12/d) - 1;
sd = (1 + s/12)**(12/d) - 1;
yr = (1 + 트랜치("r","수율")/12)**(12/d) - 1;
쿠폰(i) = (1 + 트랜치(i,"쿠폰")/12)**(12/d) - 1;
수율(i) = (1 + 트랜치(i,"수율")/12)**(12/d) - 1;
wallo(n) = tranches(n,"low-wal")*d;
walup(n) = 트랜치(n,"up-wal")*d;
cmax = smax(i, 쿠폰(i));
a = nom*cd/(1 - power(1 + cd,-tmax));
po(슬롯 사이트) = nom*(1 - 전력(1 + cd,ord(슬롯 사이트) - 1 - tmax))/(1 - 전력(1 + cd,-tmax));
bv(tl) = 0;
루프(슬롯 사이트, bv(슬롯 사이트 + (rev(슬롯 사이트) - 1))) = (bv(슬롯 사이트 + rev(슬롯 사이트)) + (a - sd*po(슬롯 사이트 + (rev(슬롯 사이트) - 1))))/(1 + cmax));
bvf(슬롯 사이트)$po(슬롯 사이트) = min(bv(슬롯 사이트)/po(슬롯 사이트),1);
bvf(tl) = 1;
pe(ts) = 놈;
loop(t(슬롯 사이트), pe(슬롯 사이트) = pe(슬롯 사이트-1)*(1 - b(슬롯 사이트))**(1/d)*po(슬롯 사이트)/po(슬롯 사이트 - 1));
cflow(t(슬롯 사이트)) = (1 + cd - sd)*pe(슬롯 사이트-1) - pe(슬롯 사이트);
prin(t(슬롯 사이트)) = pe(슬롯 사이트-1)*bvf(슬롯 사이트-1) - pe(슬롯 사이트)*bvf(슬롯 사이트);
sump = sum(슬롯 사이트, prin(슬롯 사이트));
왈프(ts) = 0;
tpsum(ts) = 0;
psum(ts) = 0;
루프(t(슬롯 사이트),
psum(슬롯 사이트) = psum(슬롯 사이트-1) + prin(슬롯 사이트);
tpsum(슬롯 사이트) = tpsum(슬롯 사이트-1) + (ord(슬롯 사이트) - 1)*prin(슬롯 사이트);
);
Walp(t) = tpsum(t)/psum(t);
zpos(i,슬롯 사이트) = 예;
zpos(n,슬롯 사이트)$(walp(슬롯 사이트) > walup(n)) = 아니오;
옵션 연령:6, tmax:6, cd:6, sd:6, cmax:6,a:6;
나이, tmax, cd, sd, cmax, a, po, cflow, pe, bv, bvf, prin, walp, zpos를 표시합니다.
bign = sump*.7;
smalln = 배수구*.03;
변수
x(i,슬롯 사이트) '각 트랜치의 미결제 원금'
p(i,슬롯 사이트) '트랜치에 대한 원금 지급'
c(i,슬롯 사이트) '각 트랜치의 현금 흐름'
r(슬롯 사이트) '잔여지불금'
tpp(i) '시간과 원금 상환의 곱'
z(i,슬롯 사이트) '트랜치 활용 변수(1 = 사용량)'
y(i,슬롯 사이트) '상삼각 구조'
Tin(i) '구조의 트랜치'
pv 'def pv 트랜치'
pvres 'def pv 잔차'
수익 '총 수익';
양수 변수 x, c, r, y;
이진 변수 z, 주석;
방정식
obj '목적 함수'
defpv 'def pv 트랜치'
defpvres 'def pv 잔차'
pdef(i,슬롯 사이트) '원금 지급 정의'
cdef(i,슬롯 사이트) '현금흐름 회계'
은퇴1(슬롯 사이트) '정상적인 트랜치의 은퇴'
은퇴(i,슬롯 사이트) '트랜치 은퇴'
은퇴(m,슬롯 사이트) 'm 트랜치의 은퇴'
은퇴m1(m,슬롯 사이트) 'm 트랜치의 은퇴'
cbal(슬롯 사이트) '현금흐름 잔액'
tppdef(i) 'tpp의 정의'
low(n) '가중 평균 수명의 하한'
upwal(n) '가중 평균 수명의 상한'
seq1(슬롯 사이트) '시퀀싱 제약 조건 1'
seq2(i,슬롯 사이트) '시퀀싱 제약 조건 2'
ydef(i,슬롯 사이트) 'y의 정의'
tindef1(i) '정의의 트랜치'
tindef2(i) '정의의 트랜치'
mcon 'm 트랜치 수에 대한 제약'
ncon '트랜치 수 제한';
obj.. 진행 =e= sum(i, pv(i)) + pvres;
defpv(i).. pv(i) =e= sum(zpos(i,t), c(i,t)*(1 + Yield(i))**(-ord(t)));
defpvres.. pvres =e= sum(t, r(t)*(1 + yr)**(-ord(t)));
pdef(zpos(i,t(슬롯 사이트))).. p(i,슬롯 사이트) =e= x(i,슬롯 사이트-1) - x(i,슬롯 사이트);
cdef(zpos(i,t(슬롯 사이트))).. c(i,슬롯 사이트) =e= 쿠폰(i)*x(i,슬롯 사이트-1) + p(i,슬롯 사이트);
은퇴1(t(슬롯 사이트)).. sum(zpos(n,슬롯 사이트), p(n,슬롯 사이트)) =e= prin(슬롯 사이트) + sum(m, x(m,슬롯 사이트-1)*coupon(m) - c(m,슬롯 사이트));
은퇴(zpos(n,t)).. p(n,t) =l= cflow(t)*z(n,t);
은퇴m(m,t).. c(m,t) =l= cflow(t)*z(m,t);
은퇴m1(m,t).. p(m,t) =l= prin(t)*z(m,t);
cbal(t).. sum(zpos(i,t), c(i,t)) + r(t) =e= cflow(t);
tppdef(n).. tpp(n) =e= sum(zpos(n,t), ord(t)*p(n,t));
lowal(n).. wallo(n)*sum(ts, x(n,ts)) =l= tpp(n);
upwal(n)..walup(n)*sum(ts, x(n,ts)) =g= tpp(n);
seq1(t).. sum(zpos(i,t), z(i,t)) =e= 1;
seq2(zpos(i,t))..y(i,t) =g= y(i,t+1);
ydef(zpos(i,t)).. y(i,t) =e= y(i-1,t) + z(i,t);
tindef1(i)..sum(ts, x(i,ts)) =l=tin(i)*bign;
tindef2(i)..sum(ts, x(i,ts)) =g=tin(i)*smalln;
ncon..sum(n,tin(n)) =g= minn;
mcon..sum(m,tin(m)) =g= minm;
모델 cmo '구조화 모델' / all /;
p.lo(n,슬롯 사이트) = 0;
x.fx(i,tl) = 0;
x.fx(i,t)$(zpos(i,t+1) 아님) = 0;
z.fx(i,슬롯 사이트)$(zpos(i,슬롯 사이트) 아님) = 0;
z.fx(m,슬롯 사이트)$(sum(n, zpos(n,슬롯 사이트)) 아님) = 1;
옵션 optCr = 0.001;
매개변수
xx(슬롯 사이트i) '주체'
zs(t,i) '이진 시간 증분'
cs(t,i) '현금흐름';
밉을 사용하여 cmo의 수익 극대화 문제를 해결합니다.
xx(슬롯 사이트i) = x.l(i,슬롯 사이트);
zs(t,i) = z.l(i,t);
cs(t,i) = c.l(i,t);
zs, xx, cs, r.l을 표시합니다.
매개변수 보고서;
보고서(t,n) = z.l(n,t);
보고서("값",i) = 합계(ts, x.l(i,ts));
보고서("avl",n)$report("값",n) = tpp.l(n)/report("값",n)/d;
Report("pvalue",i) = pv.l(i);
보고서("pvalue","resid") = pvres.l;
Report("pvalue","total") = 수익.l;
보고서 표시;