채권 가격 계산을 위해 가장 기본적으로 고려해야 하는 것이 날짜 계산 방법이다. 날짜가 중요한 이유는 채권 가격을 계산하기 위해서 가장 기본이 되는 이슈가 Cashflow, 즉 현금흐름이기 때문이다. 현금흐름이란 채권과 관련한 대금의 지급(채권가격을 사기 위하여 현금을 지불)과 이자의 수취(이자를 받음), 시간이 흐른 후에 원금 수취(채권 대금을 다시 돌려받음)하는 모든 일정 자체를 말한다.
현금을 하루 일찍 받느냐 늦게 받느냐에 따라 하루의 이자의 차이가 발생하고 이 차이가 현재 채권의 가격에 반영되므로 날짜 계산은 신속하고 정확한 계산이 필수이다.
보통 금융기관에서의 날짜 계산은 영업일 관리 등의 이유로 DBMS상에서 별도의 Calendar를 관리하며 DBMS 내에서의 함수나 연산을 통해 이루어지는 경우가 대부분이나 채권 가격 계산을 위해서는 최근래의 이자 지급일과 만기 상환일만 영업일 체크를 직접해야한다(속도를 위하여). 사실 정확한 채권 가격 계산을 위해서는 각 이자지급일의 영업일을 모두 점검하고 실제 현금지급일로 변환을 하여 계산하는 것이 가장 정확하겠으나 채권가격 계산시 관행적으로 적용하는 방식에서는 통상적으로 이자 지급일의 영업일 여부는 무시하고 계산하므로 단순 날짜 계산만 구현하면 된다.
만기 전 이자 지급일이 휴일이면 휴일의 이자를 더해서 휴일이 지난 다음에 지급하므로 미미하게나마 가치 차이가 발생할 수 있으나 만기 이전에 받는 이자의 경우 결국 전체 현금흐름상 처음부터 받기로 예정되어 있는 현금을 하루 전 후로 받는 것이므로 그 차이가 크지 않다고 생각하기 때문이다. 그러나 최근래의 이자 지급일이 휴일인 경우와 만기가 휴일인 경우는 채권 가격 자체에 영향을 미치는 요인이 될 수 있으므로 채권 가격에서 차이가 난다. (이는 채권 가격 계산 로직을 설명할 때 더 자세히 설명하도록 한다)
일자의 영업일에 따른 미세한 차이 외에도 채권 발행 조건 자체가 날짜계산을 반드시 필요로 하는 경우도 존재한다.
예를 들어 채권의 이자가 달의 말일(해당월의 마지막날)에 지급하기로 했다면 매달 말일은 달에 따라 28일, 29일, 30일, 31일 등 다양한 경우가 포함되어 있으므로 날짜 계산에 따라 채권 가격이 달라질 수 있다. 이러한 빈번한 날짜 계산을 DBMS에서 실행한다면 DBMS에 의존적이 될 것이며 유연하게 구성한다고 해도 빈번한 IO발생으로 속도저하가 발생할 수 있다.
따라서, 채권 가격 계산을 위한 날짜 계산을 위한 Calendar 계산 로직은 DBMS와는 별도로 채권 가격계산 library 내에 포함되어야 한다.
날짜 계산을 위한 기본 함수를 만드는 방법으로는
1. 날짜를 시간으로 환산하여 연산을 실시하고 다시 날짜로 환산하는 방법
2. 날짜 구조체와 날짜 연산 함수를 별도로 만들어 사용하는 방법
3. 언어에서 제공하는 날짜 관련 함수를 그대로 사용하는 방법
등으로 나눌 수 있다.
어떤 방법을 사용해도 큰 차이는 없으나 일단 2번 방법을 사용해서 구현했다. 이유는 C 언어로 구현하기에는 날짜 관련 함수가 너무 미약하고, 말일(해당월의 마지막날짜), 1일 등을 표현하기 위해 time, date structure를 계속 변환하는 것은 번거로운 편이기 때문이다.
별도의 구조체를 사용하기로 했기 때문에 구조체의 초기화(0으로 reset, year/month/day to structure), 변환(string to structure, structure to string, set to lastday),
계산(term to integer, add two structure, add integer to structure, interval as year/month/day), 체크(isLastday, isDate) 등의 함수들이 필요하다.
간단한 함수 작성을 위해 (연산 속도에는 불리하지만) 각 함수 계산시 정상적인 날짜 형식은 마지막에 체크한다. 즉, 계산 결과가 0월 13일이면 전년 12월 13일로 변환하고, 2월 30일이면 3월 1일 또는 3월 2일이 되도록 보정해주는 연산을 한다(adjust).
이 때 연산의 편의를 위해 0월은 31일, 2월은 28일까지 있도록 하였다. 윤년이 있는 경우 2월 말일을 계산하거나 2월 29일 발행인 채권의 경우 등과 같이 2월 29일이 필요한 경우 2월 말일로 변환하는 함수(set to lastday)를 적용해야 한다.