OLCMDURATION
Updated: 30 June 2014
Use OLCMDURATION to calculate the modified duration for a bond that has an odd last coupon. Modified duration is calculated as the first derivative of the price with respect to yield multiplied by -1 divided by the dirty price of the bond.
Syntax
SELECT [wctFinancial].[wct].[OLCMDURATION](
<@Settlement, datetime,>
,<@Maturity, datetime,>
,<@LastCouponDate, datetime,>
,<@Rate, float,>
,<@Yld, float,>
,<@Redemption, 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.
@LastCouponDate
the last coupon date of the security. The period from the last coupon date until the maturity date defines the odd interest period. The quasi-maturity date is assumed to occur at a regular periodic interval as defined by @Frequency and @Basis. @LastCouponDate is an expression that returns a datetime or smalldatetime value, or a character string in date format.
@Rate
the bond’s annual coupon rate. @Rate is an expression of type float or of a type that can be implicitly converted to float.
@Yld
the yield for the maturity date passed into the function. @Yld is an expression of type float or of a type that can be implicitly converted to float.
@Redemption
the redemption value of the bond assuming a par value of 100. @Redemption 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 bimonthly @Frequency = 6; for monthly @Frequency = 12. For bonds with @Basis = 'A/364' or 9, you can enter 364 for payments made every 52 weeks, 182 for payments made every 26 weeks, 91 for payments made every 13 weeks, 28 for payments made every 4 weeks, 14 for payments made every 2 weeks, and 7 for weekly payments. @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
|
0, 'BOND'
|
US (NASD) 30/360
|
1, 'ACTUAL'
|
Actual/Actual
|
2, 'A360'
|
Actual/360
|
3, 'A365'
|
Actual/365
|
4, '30E/360 (ISDA)', '30E/360', 'ISDA', '30E/360 ISDA', 'EBOND'
|
European 30/360
|
5, '30/360', '30/360 ISDA', 'GERMAN'
|
30/360 ISDA
|
6, 'NL/ACT'
|
No Leap Year/ACT
|
7, 'NL/365'
|
No Leap Year /365
|
8, 'NL/360'
|
No Leap Year /360
|
9, 'A/364'
|
Actual/364
|
10, 'BOND NON-EOM'
|
US (NASD) 30/360 non-end-of-month
|
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
|
14, '30E/360 NON-EOM', '30E/360 ICMA NON-EOM', 'EBOND NON-EOM'
|
European 30/360 non-end-of-month
|
15, '30/360 NON-EOM', '30/360 ISDA NON-EOM', 'GERMAN NON-EOM'
|
30/360 ISDA non-end-of-month
|
16, 'NL/ACT NON-EOM'
|
No Leap Year/ACT non-end-of-month
|
17, 'NL/365 NON-EOM'
|
No Leap Year/365 non-end-of-month
|
18, 'NL/360 NON-EOM'
|
No Leap Year/360 non-end-of-month
|
19, 'A/364 NON-EOM'
|
Actual/364 non-end-of-month
|
Return Type
float
Remarks
· If @Maturity <= @Settlement 0 is returned.
· If @Settlement is NULL, @Settlement = GETDATE()
· If @Rate is NULL, @Rate = 0
· If @Yld is NULL, @Yld = 0
· If @Frequency is NULL, @Frequency = 2
· If @Basis is NULL, @Basis = 0.
· If @Frequency is any number other than 1, 2, 4, 6 or 12, or for @Basis = 'A/364' any number other than 1, 2, 4, 6, or 12 as well as 7, 14, 28, 91, 182, or 364 OLCMDURATION returns an error.
· If @Basis is invalid (see above list), OLCMDURATION returns an error.
· @Rate is entered as a decimal value; 1.0% = 0.01
· @Yld is entered as a decimal value; 1.0% = 0.01
· If @Maturity is NULL an error will be returned.
· If @IssueDate is NULL an error will be returned.
· If @LastCouponDate is NULL an error will be returned.
Examples
This is a bond with an odd short last coupon period where the settlement date in the last coupon period.
SELECT
wct.OLCMDURATION(
'2014-10-01', --@Settlement
'2014-12-15', --@Maturity
'2014-09-15', --@Last_interest
0.0225, --@Rate
0.0010, --@Yield
100, --@Redemption
2, --@Frequency
1 --@Basis
) as MDuration
This produces the following result.
MDuration
----------------------
0.207139404908496
This is a bond with an odd long last coupon period with a settlement date in the last coupon period.
SELECT
wct.OLCMDURATION(
'2014-10-01', --@Settlement
'2014-12-15', --@Maturity
'2014-03-15', --@Last_interest
0.0225, --@Rate
0.0010, --@Yield
100, --@Redemption
2, --@Frequency
1 --@Basis
) as MDuration
This produces the following result.
MDuration
----------------------
0.207139404908115
This is a bond with an odd short last coupon with a settlement date prior to the last coupon date.
SELECT
wct.OLCMDURATION(
'2014-10-01', --@Settlement
'2034-12-15', --@Maturity
'2034-09-15', --@Last_interest
0.0425, --@Rate
0.0400, --@Yield
100, --@Redemption
2, --@Frequency
1 --@Basis
) as MDuration
This produces the following result.
MDuration
----------------------
13.5818659657806
This is a bond with an odd long last coupon period with a settlement date prior to the last coupon date.
SELECT
wct.OLCMDURATION(
'2014-10-01', --@Settlement
'2034-12-15', --@Maturity
'2034-03-15', --@Last_interest
0.0425, --@Rate
0.0400, --@Yield
100, --@Redemption
2, --@Frequency
1 --@Basis
) as MDuration
This produces the following result.
MDuration
----------------------
13.583584787529
This is an example of a bond paying interest every 26 weeks.
SELECT
wct.OLCMDURATION(
'2014-10-04', --@Settlement
'2014-12-15', --@Maturity
'2014-06-01', --@Last_interest
0.1250, --@Rate
0.1100, --@Yield
100, --@Redemption
182, --@Frequency
9 --@Basis
) as MDURATION
This produces the following result.
MDURATION
----------------------
0.193590019431094
See Also