=110/(1+0.1005)
P0 P0
[1] 99.95457
(Question)
만기 2년, 액면이자율 10% (연 1회 지급), 액면가 100 인 수의상환채권 callable bond 를 생각하자. 이 채권의 상환액 call price 는 100, 상환기간은 1년부터 (이자지급 이후) 만기까지 이다. 즉, 채권발행자 (기채자, 채무자) 는 상환기간 동안 원하는 때 100으로 채권을 상환할 수 있다. 1년이 지난 시점에서 만기수익률을 10.05% 라 가정하자.
채권의 가격 \(P_0\) 를 구하시오.
시중금리변화에 따라 이 만기수익률이 즉각적으로 10bp 상승할 때의 가격 \(P_+\) 를 구하시오.
그리고 만기수익률이 즉각적으로 10bp 하락할 때의 가격 \(P_−\) 를 구하시오.
채권발행자는 채권의 가치가 100을 넘어서면 상환할 인센티브가 있음을 고려하라. 이들 세 값을 바탕으로 우리는 수의상환채권에 대하여 유효한 듀레이션을 \(-\frac{1}{P_0}\times\frac{P_+-P_-}{20bp}\)로 구할 수 있다. 소수점 네째자리까지 리포트하시오.
(Answer)
1년이 지난 시점에서 수의상환채권의 잔여현금흐름은 만기 일시납 110이며, YTM은 10.05%이므로 가격 \(P_0\)는 약 99.9546입니다.
=110/(1+0.1005)
P0 P0
[1] 99.95457
만기수익률이 10bp씩 즉각적으로 움직일 때, 수의상환부를 고려하지 않은 채권가격은 아래와 같습니다.
=110/(1+0.1005+0.001)
P0_up=110/(1+0.1005-0.001)
P0_downc(P0_up,P0_down)
[1] 99.86382 100.04548
그러나, 수의상환채권의 가격은 call price를 초과할 수 없으므로 \(P_+=99.8638,\;P_-=100\)입니다.
위 가격으로부터 산출한 잔존만기 1년의 수의상환채권의 듀레이션은 약 0.6812입니다.
\[D_{callable}-\frac{1}{P_0}\times\frac{P_+-P_-}{20bp}=0.6812\]
=(-1/P0)*(P0_up-100)/0.002
durationround(duration,4)
[1] 0.6812
(Question)
hw2.xlsx 에는 Treasury par yield (% 값) 가 일부 주어져 있다. 이것은 2024년 3월 21일 기준 US Treasury Par Yield Curve 이다.
선형보간법을 이용하여 빈 곳을 채우고, 1년에 2회 이자를 지급하는 기준으로 하여 spot rate 을 구하시오. 단, 0.5년 과 1년 채권은 무이표 채권이다. 제출할 때에는 % 로 소수점 둘째 자리까지 보이시오.
(Answer)
먼저, 선형보간법을 통해 기간별 Par-yield를 구하도록 하겠습니다.
library(tidyverse)
<- tibble("year"=seq(0.5,10,0.5),
par_yield "period"=c(1:20),
"paryield"=c(5.36,5.01,NA,4.62,NA,
4.42,NA,NA,NA,4.26,
NA,NA,NA,4.28,NA,
NA,NA,NA,NA,4.27))
<- par_yield %>%
par_yield mutate(interpolation=if_else(paryield %>% is.na(),
lag(paryield)+lead(paryield))/2,
(%>%
paryield)) mutate(interpolation=if_else(interpolation %>% is.na(),
lag(lag(interpolation))+lead(lead(interpolation)))/2,
(%>%
interpolation)) mutate(interpolation=if_else(interpolation %>% is.na(),
lag(interpolation)+lead(interpolation))/2,
(
interpolation))<- par_yield %>%
par_yield mutate(interpolation=if_else(interpolation %>% is.na(),
20-period)*par_yield$interpolation[14]
((+(period-14)*par_yield$interpolation[20])/6,
interpolation))
%>% as.data.frame() par_yield
year period paryield interpolation
1 0.5 1 5.36 5.360000
2 1.0 2 5.01 5.010000
3 1.5 3 NA 4.815000
4 2.0 4 4.62 4.620000
5 2.5 5 NA 4.520000
6 3.0 6 4.42 4.420000
7 3.5 7 NA 4.380000
8 4.0 8 NA 4.340000
9 4.5 9 NA 4.300000
10 5.0 10 4.26 4.260000
11 5.5 11 NA 4.265000
12 6.0 12 NA 4.270000
13 6.5 13 NA 4.275000
14 7.0 14 4.28 4.280000
15 7.5 15 NA 4.278333
16 8.0 16 NA 4.276667
17 8.5 17 NA 4.275000
18 9.0 18 NA 4.273333
19 9.5 19 NA 4.271667
20 10.0 20 4.27 4.270000
다음으로, Par-yield와 6개월/1년 spot rate를 통해 기간별 spot rate를 boot-strapping 방식으로 산출하도록 하겠습니다.
Par-yield는 채권의 현재가격을 액면가격으로 만들어주는 coupon-rate입니다. 즉, 액면가 100의 채권이 연간 par-yield만큼 쿠폰을 semi-annually 지급한다면 다음과 같이 쓸 수 있습니다.
\[100=\sum_{k=1}^{n-1}\frac{Par/2}{(1+Spot_k/2)^k}+\frac{100+Par/2}{(1+Spot_n/2)^n}\]
\[\Rightarrow \frac{1}{(1+Spot_n/2)^n}=\frac{1}{100+Par/2}(100-\sum_{k=1}^{n-1}\frac{Par/2}{(1+Spot_k/2)^k})\]
\[\Rightarrow Spot_n=((\frac{100+Par/2}{100-Sum\;of\;Coupon\;PV})^{\frac{1}{n}}-1)\times 2\]
위 수식을 R을 이용해서 산출하고, 소수점 둘째자리까지 반올림한 결과는 아래와 같습니다.
<- par_yield %>%
spot select(year,period,interpolation) %>%
mutate(coupon=interpolation/2,
spot=if_else(period<=2,interpolation,NA)) %>%
mutate(dc=1/(1+spot/100/2)^period) %>%
mutate(cum_dc=cumsum(dc)) %>%
mutate(sum_pvc=coupon*(cum_dc-dc))
for (i in 3:20){
$sum_pvc[i] <- spot$coupon[i]*spot$cum_dc[i-1]
spot$dc[i] <- (100-spot$sum_pvc[i])/(100+spot$coupon[i])
spot$spot[i] <- {{(1/spot$dc[i])^(1/spot$period[i])-1}*200}
spot$cum_dc[i] <- spot$cum_dc[i-1]+spot$dc[i]
spot
}<- spot %>% mutate(spot2=spot %>% round(2))
spot %>% select(year,period,interpolation,spot2) spot
# A tibble: 20 × 4
year period interpolation spot2
<dbl> <int> <dbl> <dbl>
1 0.5 1 5.36 5.36
2 1 2 5.01 5.01
3 1.5 3 4.81 4.81
4 2 4 4.62 4.61
5 2.5 5 4.52 4.51
6 3 6 4.42 4.4
7 3.5 7 4.38 4.36
8 4 8 4.34 4.32
9 4.5 9 4.3 4.28
10 5 10 4.26 4.24
11 5.5 11 4.26 4.25
12 6 12 4.27 4.25
13 6.5 13 4.28 4.26
14 7 14 4.28 4.27
15 7.5 15 4.28 4.27
16 8 16 4.28 4.26
17 8.5 17 4.27 4.26
18 9 18 4.27 4.26
19 9.5 19 4.27 4.26
20 10 20 4.27 4.26
(Question)
위의 문제에서 구한 현물이자율을 이용하여 선도이자율을 구하여라. 이 때 선도이자율은 6개월 구간마다 주어진다. 물론 0 부터 6개월까지의 선도이자율은 6개월 현물이자율과 같다. 선도이자율도 % 로 소수점 둘째 자리까지 구하시오.
(Answer)
semi-annually 현물이자율에서 6개월 선도이자율에 대한 수식은 다음과 같습니다.
\[(1+Spot_{n-1})^{n-1}(1+Forward_{n-1,n})=(1+Spot_n)^n\]
\[\Rightarrow Forward_{n-1,n}=\frac{(1+Spot_n)^n}{(1+Spot_{n-1})^{n-1}}-1\]
위 수식과 (2)의 소수점 둘째자리까지 반올림한 Spot rate를 이용하여 산출한 선도이자율은 아래와 같습니다.
<- spot %>%
forward select(year,period,spot,spot2) %>%
mutate(spot_yield=(1+spot/100/2)^period,
spot_yield2=(1+spot2/100/2)^period) %>%
mutate(forward={{spot_yield/lag(spot_yield)-1}*200} %>% round(2),
forward2={{spot_yield2/lag(spot_yield2)-1}*200} %>% round(2))
%>% select(year,period,spot,forward2) forward
# A tibble: 20 × 4
year period spot forward2
<dbl> <int> <dbl> <dbl>
1 0.5 1 5.36 NA
2 1 2 5.01 4.66
3 1.5 3 4.81 4.41
4 2 4 4.61 4.01
5 2.5 5 4.51 4.11
6 3 6 4.40 3.85
7 3.5 7 4.36 4.12
8 4 8 4.32 4.04
9 4.5 9 4.28 3.96
10 5 10 4.24 3.88
11 5.5 11 4.25 4.35
12 6 12 4.25 4.25
13 6.5 13 4.26 4.38
14 7 14 4.27 4.4
15 7.5 15 4.27 4.27
16 8 16 4.26 4.11
17 8.5 17 4.26 4.26
18 9 18 4.26 4.26
19 9.5 19 4.26 4.26
20 10 20 4.26 4.26
Forward rate를 산출할 때, Spot rate를 소수점 두번째 자리까지 반올림하지 않는다면, Spot rate의 오차는 미미하더라도 Forward rate 산출에 영향을 주게 되며, 오차는 기간이 길어질수록 커집니다.
%>% select(year,period,forward2, forward) %>% filter(year>=8) forward
# A tibble: 5 × 4
year period forward2 forward
<dbl> <int> <dbl> <dbl>
1 8 16 4.11 4.25
2 8.5 17 4.26 4.24
3 9 18 4.26 4.24
4 9.5 19 4.26 4.23
5 10 20 4.26 4.23
(Question)
챕터2 에서 우리는 선도이자율이 구간별로 주어질 수 있음을 배웠다.
Semi-annual 베이스로 현물이자율을 정의했을 때, \(r_1\) 은 1년 현물이자율, \(r_{1.5}\) 는 1년 6개월 현물이자율을 나타낸다. 그리고 6개월부터 1년까지 기간에 대한 선도이자율은 \((1+r_1/2)^2 = (1+r_{0.5}/2)(1+f_{[0.5,1]}/2)\) 를 만족한다.
현물이자율을 연속복리법으로 정의했을 떄, 1년 현물이자율을 \(r_1\) 이라 놓으면 시작점에서 1 의 투자는 \(e^r_1\) 으로 성장한다. 마찬가지로 시간 \(t\) 에 대한 현물이자율을 \(r_t\) 라 놓으면 시작점에서의 1의 투자는 \(e^{tr_t}\) 로 성장한다. 두 시점 a < b 에 대하여 연속복리법에 의한 현물이자율 \(r_a, r_b\) 가 주어져 있다. 투자자는 \((a, b)\) 구간에 적용되는 선도거래를 체결하려고 한다.
이 때 중요한 것은 선도이자율인데, 무차익원리에 의한 선도이자율 \(f(a, b)\) 를 \(a, b, r_a, r_b\) 를 이용하여 나타내시오. 물론 연속복리법을 적용한다.
(Answer)
연속복리법 하에서, \(f(a, b), a, b, r_a, r_b\) 간에는 아래와 같은 식이 성립해야 합니다.
\[e^{a\times r_a}\times e^{(b-a)\times f(a,b)}=e^{b\times r_b}\]
이를 통해 \(f(a,b)\)를 표현하면,
\[\Rightarrow e^{ar_a+(b-a)f(a,b)}=e^{br_b}\]
\[ar_a+(b-a)f(a,b)=br_b\;\Rightarrow\;f(a,b)=\frac{br_b-ar_a}{b-a}\]
(Question)
2024년 3월 15일 호가가 액면 100 당 103-22+ 로 주어진 미 국채가 있다. 이 채권의 만기는 2029년 10월 15일이고 표면금리는 6.125% 이다. 이자는 매 4월 15일, 10월 15일 지급될 때, full price를 구하시오. 소수점 여섯째자리까지 반올림하여 나타내시오.
(Answer)
미국 국채의 가격표시방법에 따라, 103-22+의 가격표시는 아래와 같습니다.
\[103-22+=103+\frac{22}{32}+\frac{1}{64}=103.703125\]
options(digits=10)
<- 103+22/32+1/64
clean_price clean_price
[1] 103.703125
해당 가격은 호가가격이므로, clean price=103.703125입니다.
경과이자(accrued interest)를 가산해야 Full price를 산출할 수 있습니다.
경과이자는 \(\frac{표면이율 \times 액면가}{2}\times \frac{경과일}{이자지급기간}\)을 통해 구할 수 있습니다.
경과일은 152일, 이자지급기간은 183일이고, 산출된 경과이자는 약 2.543716입니다.
따라서, full price = clean(quoted) price + accrued interest = 106.246841입니다.
library(lubridate)
<- ymd(20240315)-ymd(20231015)
accrued_date <- ymd(20240415)-ymd(20231015)
interest_period ={(100*0.06125)/2}*(as.integer(accrued_date)/as.integer(interest_period))
accrued_interest=round(clean_price+accrued_interest,6)
full_price
paste(accrued_date,interest_period,accrued_interest,full_price,sep=" / ")
[1] "152 / 183 / 2.54371584699454 / 106.246841"