R프로그램을 이용한 SOFR 룩백기간 적용하기

SOFR(The Secured Overnight Financing Rate)금리를 다운받아 R프로그램을 이용해서 룩백기간에 따른 금리정보 shift 하는 정도만 해보려 한다. 뉴욕연방준비은행 사이트에서 전체 sofr 금리내역을 받을 수 있으며, 여기를 클릭해서 찾아 다운로드하면 된다.

sofr 익일물 금리 파일 정리하기

SOFR금리는 일별로 고시되는 금리이며, 해당 금리를 가지고 이자기간의 평균금리를 내기 위해서는 lookback 기간을 설정해서(보통 5영업일) 시프트한 금리를 가지고 평균을 내면 된다. 그러기위한 사전 작업을 R 프로그래밍으로 데이터를 가공해보았다. effective_date는 금리가 실제 고시된 일자이고, date는 이자계산 기준일자로 생각하면 된다. 예를 들어, 1/13~1/20 사이의 sofr 익일물 평균금리를 내기 위해서는 5영업일 이전의 1/6~1/12 일자에 고시된 금리를 각각 가져다 평균을 내는 컨셉이다.

tb_sofr_rate = read_excel("~/data/sofr_rate.xlsx") %>% 
  janitor::clean_names() %>% 
  mutate(effective_date = as.Date(effective_date, format = "%m/%d/%Y"),
         rate = rate_percent / 100) %>% 
  select(effective_date, rate_type, rate) %>% 
  filter(!is.na(effective_date)) %>% 
  arrange(effective_date) %>% 
  mutate(date = lead(effective_date, 5))

고시된 금리다보니 아래 데이터를 보면 알겠지만, 영업일만 데이터가 있다.

tb_sofr_rate
# A tibble: 119 × 4
    effective_date rate_type   rate date      
    <date>         <chr>      <dbl> <date>    
  1 2022-01-03     SOFR      0.0005 2022-01-10
  2 2022-01-04     SOFR      0.0005 2022-01-11
  3 2022-01-05     SOFR      0.0005 2022-01-12
  4 2022-01-06     SOFR      0.0005 2022-01-13
  5 2022-01-07     SOFR      0.0005 2022-01-14
  6 2022-01-10     SOFR      0.0005 2022-01-18
  7 2022-01-11     SOFR      0.0005 2022-01-19
...(중략)...
110 2022-06-09     SOFR      0.0075 2022-06-16
111 2022-06-10     SOFR      0.0075 2022-06-17
112 2022-06-13     SOFR      0.0073 2022-06-21
113 2022-06-14     SOFR      0.0069 2022-06-22
114 2022-06-15     SOFR      0.007  2022-06-23
115 2022-06-16     SOFR      0.0145 NA        
116 2022-06-17     SOFR      0.0145 NA        
117 2022-06-21     SOFR      0.0145 NA        
118 2022-06-22     SOFR      0.0145 NA        
119 2022-06-23     SOFR      0.0144 NA

관측기간의 이해

sofr 평균금리 계산방식은 보통 단리 혹은 복리 방식으로 나뉘고, 추가로 with OPS 방식과 without OPS 으로 나뉜다. sofr 금리는 매일 금리가 고시되기 때문에 기간에 따른 평균금리를 몇일먼저 계산하기 위해서 금리정보를 shift 해서 가져오는 방식을 쓴다. 근데 금리정보만 몇일전 금리를 가져온다면 without OPS 이고, 금리 뿐만 아니라 이자기준일도 같이 shift 한다면 with OPS 방식이 된다. 그나마 이해하기 쉬운 without OPS 방식만 살짝 다뤄보기로 한다.

말은 안되지만 6일치 이자를 계산해본다고 가정하자. 지금 조금 어려운 케이스인데, 토/일 휴일 말고도, 미국 공휴일이 더 있는 케이스이다. 미국에서 고시되는 금리이기 때문에 우리나라 휴일만 신경써야 할게 아니라 미국 공휴일도 같이 고려해야 한다.

구분 정보 비고
이자계산 시작일 2022.06.16
이자계산 종료일 2022.06.21 6.22일이 이자징수일이라 가정
가산금리 0.9%

아까 만들어놓은 sofr 금리데이터로 보면, 이자기간은 6일이더라도 실제 고시된 영업일은 3일뿐인걸 알수 있다.

sofr_rate %>% 
  filter(date >= ymd("2022-06-10")) %>% 
  select(date, effective_date, rate)
# A tibble: 9 × 3
  date       effective_date   rate
  <date>     <date>          <dbl>
1 2022-06-10 2022-06-03     0.0078
2 2022-06-13 2022-06-06     0.0078
3 2022-06-14 2022-06-07     0.0077
4 2022-06-15 2022-06-08     0.0076
5 2022-06-16 2022-06-09     0.0075  # 이자계산시작일  
6 2022-06-17 2022-06-10     0.0075  
7 2022-06-21 2022-06-13     0.0073  # 이자계산종료일
8 2022-06-22 2022-06-14     0.0069
9 2022-06-23 2022-06-15     0.007

휴일상관없이 이자기간을 기준으로 고시된 금리를 매핑하면 아래와 같이 일부가 매핑이 안되게 된다.

tibble(date = seq.Date(as.Date("2022-06-16"), 
                       as.Date("2022-06-22") - 1, by = "day"),
       wday = wday(date, label = T)) %>% 
  left_join(sofr_rate, by = c("date"))

# A tibble: 6 × 5
  date       wday  effective_date rate_type    rate
  <date>     <ord> <date>         <chr>       <dbl>
1 2022-06-16 Thu   2022-06-09     SOFR       0.0075
2 2022-06-17 Fri   2022-06-10     SOFR       0.0075
3 2022-06-18 Sat   NA             NA        NA     
4 2022-06-19 Sun   NA             NA        NA     
5 2022-06-20 Mon   NA             NA        NA     
6 2022-06-21 Tue   2022-06-13     SOFR       0.0073

그래서 이런 경우, 전일 기준으로 고시된 금리인 6/10일 금리를 동일하게 적용한다.

tibble(date = seq.Date(as.Date("2022-06-16"), 
                       as.Date("2022-06-22") - 1, by = "day"),
       wday = wday(date, label = T)) %>% 
  left_join(sofr_rate, by = c("date")) %>% 
  fill(effective_date:rate)

# A tibble: 6 × 5
  date       wday  effective_date rate_type   rate
  <date>     <ord> <date>         <chr>      <dbl>
1 2022-06-16 Thu   2022-06-09     SOFR      0.0075
2 2022-06-17 Fri   2022-06-10     SOFR      0.0075
3 2022-06-18 Sat   2022-06-10     SOFR      0.0075
4 2022-06-19 Sun   2022-06-10     SOFR      0.0075
5 2022-06-20 Mon   2022-06-10     SOFR      0.0075
6 2022-06-21 Tue   2022-06-13     SOFR      0.0073

평균금리 최종결과는?

그래서 평균금리를 구하는 건 결국 공식이기 때문에, R프로그램으로도 구현할 수 있다. 여기서는 그걸 올리진 않지만, 아래보듯이 최종금리 1.64669% 로 평균금리가 계산되었다.

sofr_ccr_1 %>% 
  mutate(across(rate_day:interests_rate, num, digits = 7)) %>% 
  select(date, wday, effective_date, rate, interests_rate)
# A tibble: 6 × 5
  date       wday  effective_date   rate interests_rate
  <date>     <ord> <date>          <dbl>      <num:.7!>
1 2022-06-16 Thu   2022-06-09     0.0075      0.0165000
2 2022-06-17 Fri   2022-06-10     0.0075      0.0165001
3 2022-06-18 Sat   2022-06-10     0.0075      0.0165001
4 2022-06-19 Sun   2022-06-10     0.0075      0.0165001
5 2022-06-20 Mon   2022-06-10     0.0075      0.0165001
6 2022-06-21 Tue   2022-06-13     0.0073      0.0164669
r 

더 보면 좋을 글들