이표채에 이어 채권의 기본이 되는 할인채에 대해 살펴 보겠다. 할인채의 수익률은 그 자체로 spot rate이므로 하나의 수익률로 하나의 cashflow를 할인하여 채권 가격을 산출하는 간단한 로직이다.

만기 상환만 존재하는 할인채
할인채는 만기에 원금을 상환하기로 하고 표면금리로 할인된 현재 가치로 채권이 발행된다. 예를 들어 3년 후(만기)에 10,000원을 받기로 하고 현재 할인된 9,700원으로 채권을 매입하는 것이다. 이 때, 300원이 채권의 이자가 되고 원금은 10,000원이며 300원을 3년간 나눈 것이 할인율, 즉 수익률이 되겠다.
이를 함수로 만든것이 다음과 같다.

/*-----------------------------------------------------------------------------  
 * fnSBDiscountBond : 할인채에 대한 가격 계산 함수
 *		Spot/YTM 모두 사용가능
 *		YTM의 갯수를 1개만 지정하는 경우 해당 YTM을 사용할 수 있으며,
 *		YTM의 갯수가 여러개인 경우 보간 하여 해당 YTM 사용
 *
 * 미결사항 :
 * 
 *---------------------------------------------------------------------------*/
UINT fnSBDiscountBond( DATETYPE dtPriceDay,     /* 계산일              */
                       BONDINFO *pBondInfo,   /* Bond Info Structure   */
                       CURVE  *pCurve,        /* ytm/sport curve      */
                       BONDPRICE *pBondPrice, /* Price Info Structure  */
                       INT    *error_code)
{
	DATETYPE	nextCouponDate;
	DATETYPE	prevCouponDate;
	UINT 		nTotalYear;
	UINT		nDaysToMaturity;
	DOUBLE		nBondPrice;
	DOUBLE		nDuration;
	DOUBLE		nMD;
	DOUBLE		nConvexity;
	DOUBLE		nFace;
	DOUBLE		nDiscountToday;
	UINT		nNextCouponRemDay;
	UINT		nCouponTermDay;

...
중략
...

	nDuration  = 0.0;
	nMD        = 0.0;
	nConvexity = 0.0;

	nFace = 10000.0;

	// 상환일 기준 이자지급채권과 동일하게 날짜 계산
	prevCouponDate = pBondInfo->dtDueDay;
	nTotalYear = 0.0;
	while ( fnDatetoInt( prevCouponDate ) >= fnDatetoInt( dtPriceDay ) ) {
		nextCouponDate = prevCouponDate;
		prevCouponDate = fnAddDateInt( prevCouponDate, YEAR, -1 );
		nTotalYear++;
	}

	nBondPrice = 0.0;
	nNextCouponRemDay = fnCountDate( dtPriceDay, nextCouponDate, DAY );
	nCouponTermDay    = fnCountDate( prevCouponDate, nextCouponDate, DAY ) ;
	nDiscountToday = (DOUBLE) nNextCouponRemDay / (DOUBLE) nCouponTermDay;

	/*----------------------------------------------------------------------
	 * YTM : yield가 하나일경우 그냥 사용, 여러개일경우 linear/spline 보간
	 *---------------------------------------------------------------------*/

	nDaysToMaturity = fnCountDate( dtPriceDay, pBondInfo->dtDueDay, DAY );

	if ( pCurve->nYieldCount == 1 )
	{
		pBondPrice->nYtm = pCurve->nYield[ 0 ];
	}
	else
	{
		/* 해당 잔존만기의 수익률을 선형보간 */
		pBondPrice->nYtm = fnGetRate( pCurve, nDaysToMaturity , LINEAR );
	}

        // 채권 가격을 계산하는 부분
	nBondPrice = nFace / pow( 1.0 + pBondPrice->nYtm, nTotalYear - 1 );
	nBondPrice /= ( 1.0 + pBondPrice->nYtm * nDiscountToday );

	nDuration = (DOUBLE) nDaysToMaturity / 365.0;
	nMD = Math_Round( nDuration / ( 1 + pBondPrice->nYtm ), 5 );
	nConvexity = Math_Round( nDuration, 6 )* ( Math_Round( nDuration, 6) + 1 );
	nConvexity = Math_Round( nDuration / pow( 1.0 + pBondPrice->nYtm * pBondInfo->nIntMonth / 12.0, 2 ), 5 );

nDuration, 6) + 1 ) / pow( 1.0 + pBondPrice->nYtm * pBondInfo->nIntMonth / 12.0, 2 ), 5 );

	pBondPrice->nPrice = nBondPrice;
	pBondPrice->nDuration = Math_Round( nDuration, 5 );
	pBondPrice->nMD = nMD;
	pBondPrice->nConvexity = nConvexity;

	return SUCCESS;
}

사실 별로 어려울 것도 없이 간단한 계산이다. 이표채의 여러 cashflow중 만기에 해당하는 것 한 건만 계산하면 된다.

위에서 얘기한 바와 같이 할인채는 그 자체의 수익률이 spot rate이므로 시장에서 관찰된 spot을 그대로 사용해서 채권 가격을 계산하면 되며 spot이 아닌 공시 수익률과 같은 ytm으로 수익률을 입력하는 경우 사전적으로 bootstrapping 방법 등을 통해 spot rate을 산출하면 된다.

 

 

By yaplab

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다