Login     Register

        Contact Us     Search

XLeratorDB/financial Documentation

SQL Server Actual/Actual ISDA accrued interest function


ACCINTACT

Updated: 31 October 2014


Use the scalar function ACCINTACT to calculate the accrued interest on a bond where the coupon amounts are calculated as the actual number of days in the coupon period divided by the number of days in the year. This means that the coupon amounts will vary from period. The number of days in the year is either 360, 365, or 366 based upon the day-count convention.
Syntax
SELECT [wct].[ACCINTACT](
  <@Settlement, datetime,>
 ,<@Maturity, datetime,>
 ,<@Rate, float,>
 ,<@Par, float,>
 ,<@Frequency, float,>
 ,<@Basis, nvarchar(4000),>)
Arguments
@Settlement
the settlement date of the security. @Settlement is an expression that returns a datetime or smalldatetime value, or a character string in date format. 
@Maturity
the maturity date of the security. @Maturity is an expression that returns a datetime or smalldatetime value, or a character string in date format. 
@Rate
the security’s annual coupon rate. @Rate is an expression of type float or of a type that can be implicitly converted to float.
@Par
the par value of the security. Any forced redemptions are subtracted from the par value on the redemption date and the adjusted balance is used in calculating the subsequent coupon interest. @Par is an expression of type float or of a type that can be implicitly converted to float.
@Frequency
the number of coupon payments per year. For annual payments, @Frequency = 1; for semi-annual, @Frequency = 2; for quarterly, @Frequency = 4; for bi-monthly, @Frequency = 6, for monthly, @Frequency = 12. @Frequency is an expression of type float or of a type that can be implicitly converted to float.
@Basis
is the type of day count to use. @Basis is an expression of the character string data type category.

@Basis
Day count basis
1, 'ACTUAL'
Actual/Actual
2, 'A360'
Actual/360
3, 'A365'
Actual/365
11, 'ACTUAL NON-EOM'
Actual/Actual non-end-of-month
12, 'A360 NON-EOM'
Actual/360 non-end-of-month
13, 'A365 NON-EOM'
Actual/365 non-end-of-month

Return Type
float
Remarks
·         If @Basis is invalid then ACCINTACT returns an error.
·         If @Frequency is invalid then ACCINTACT returns an error.
·         If @Maturity < @Settlement then NULL is returned.
·         If @Settlement is NULL, @Settlement = GETDATE().
·         If @Frequency is NULL, @Frequency = 2.
·         If @Basis is NULL, @Basis = 1.
·         If @Par is NULL then @Par = 100.
·         If @Rate is NULL then @Rate = 0.
·         If @Maturity is NULL then ACCINTACT returns NULL.
·         If @Basis = 3 or @Basis = 13 then the number of days in a year is always 365.
·         If @Basis =2 or @Basis = 12 then the number of days in a year is always 360.
·         If @Basis =1 or @Basis = 1 then the number of days in a year is determined by the actual number of days in the year of coupon period end date.
Examples
In this example we calculate the accrued interest on a bond maturing on 2034-11-01 with a coupon interest rate of 11.0% paying interest semi-annually. The bond is settling on 2014-10-29. The bond uses the actual/actual day-count convention.
SELECT
   wct.ACCINTACT(
        '2014-10-29' --@Settlement
       ,'2034-11-01' --@Maturity
       ,0.11         --@Rate
       ,100          --@Par
       ,2            --@Frequency
       ,1            --@Basis
   ) as [Accrued Interest]
This produces the following result.
Accrued Interest
----------------------
5.45479452054794
 


Let's compare this to the result returned by the
BONDINT function.
SELECT
   wct.ACCINTACT(
        '2014-10-29' --@Settlement
       ,'2034-11-01' --@Maturity
       ,0.11         --@Rate
       ,100          --@Par
       ,2            --@Frequency
       ,1            --@Basis
   ) as ACCINTACT
   ,wct.BONDINT(
        '2014-10-29' --@Settlement
       ,'2034-11-01' --@Maturity
       ,0.11         --@Rate
       ,100          --@Par
       ,2            --@Frequency
       ,1            --@Basis
       ) as BONDINT
This produces the following result.
ACCINTACT              BONDINT
---------------------- ----------------------
5.45479452054794       5.41032608695652
 


The following SQL demonstrates why the 2 calculations are different.
SELECT
 0.11 * 100 * CAST(DATEDIFF(d,k.prevcoup,'2014-10-29') as float)/wct.DAYSINYEAR(k.NextCoup) as ACCINTACT
,CAST(DATEDIFF(d,k.prevcoup,'2014-10-29') as float)/CAST(DATEDIFF(d,k.prevcoup,k.nextcoup) as float) * k.C as BONDINT
FROM
   wct.RPIFACTORS(
        '2014-10-29' --@Settlement
       ,'2034-11-01' --@Maturity
       ,0.11         --@Rate
       ,100          --@Price
       ,NULL         --@Yield
       ,100          --@Redemption
       ,2            --@Frequency
       ,1            --@Basis
       )k
This produces the following result.
ACCINTACT              BONDINT
---------------------- ----------------------
5.45479452054794       5.41032608695652
 

 

See Also

 



Copyright 2008-2024 Westclintech LLC         Privacy Policy        Terms of Service