Documentation

This is machine translation

Translated by Microsoft
Mouseover text to see original. Click the button below to return to the English verison of the page.

Note: This page has been translated by MathWorks. Please click here
To view all translated materals including this page, select Japan from the country navigator on the bottom of this page.

floorvolstrip

Strip floorlet volatilities from flat floor volatilities

Syntax

[FloorletVols,FloorletPaymentDates,FloorStrikes] = floorvolstrip(ZeroCurve,FloorSettle,FloorMaturity,FloorVolatility)
[FloorletVols,FloorletPaymentDates,FloorStrikes] = floorvolstrip(___,Name,Value)

Description

example

[FloorletVols,FloorletPaymentDates,FloorStrikes] = floorvolstrip(ZeroCurve,FloorSettle,FloorMaturity,FloorVolatility) strips floorlet volatilities from the flat floor volatilities by using the bootstrapping method. The floor volatilities are interpolated on each floorlet payment date before stripping the floorlet volatilities.

example

[FloorletVols,FloorletPaymentDates,FloorStrikes] = floorvolstrip(___,Name,Value) adds optional name-value pair arguments. The floor volatilities are interpolated on each floorlet payment date before stripping the floorlet volatilities.

Examples

collapse all

Compute the zero curve for discounting and projecting forward rates.

ValuationDate = datenum('10-Aug-2015');
ZeroRates = [0.12 0.24 0.40 0.73 1.09 1.62]/100;             
CurveDates = datemnth(ValuationDate, [0.25 0.5 1 2 3 5]*12);
ZeroCurve = IRDataCurve('Zero',ValuationDate,CurveDates,ZeroRates)
ZeroCurve = 
			 Type: Zero
		   Settle: 736186 (10-Aug-2015)
	  Compounding: 2
			Basis: 0 (actual/actual)
	 InterpMethod: linear
			Dates: [6x1 double]
			 Data: [6x1 double]

Define the ATM floor volatility data.

FloorSettle = datenum('12-Aug-2015');
FloorMaturity = datenum({'12-Aug-2016';'14-Aug-2017';'13-Aug-2018';...
    '12-Aug-2019',;'12-Aug-2020'});
FloorVolatility = [0.31;0.39;0.43;0.42;0.40];

Strip floorlet volatilities from ATM floors.

[FloorletVols, FloorletPaymentDates, ATMFloorStrikes] = floorvolstrip(ZeroCurve,...
    FloorSettle, FloorMaturity, FloorVolatility);

PaymentDates = cellstr(datestr(FloorletPaymentDates));
format;
table(PaymentDates, FloorletVols, ATMFloorStrikes)
ans=9x3 table null
    PaymentDates     FloorletVols    ATMFloorStrikes
    _____________    ____________    _______________

    '12-Aug-2016'       0.31         0.0056551      
    '13-Feb-2017'     0.3646         0.0073508      
    '14-Aug-2017'    0.41948         0.0090028      
    '12-Feb-2018'    0.43152          0.010827      
    '13-Aug-2018'    0.46351          0.012617      
    '12-Feb-2019'    0.40407          0.013862      
    '12-Aug-2019'    0.39863          0.015105      
    '12-Feb-2020'     0.3674          0.016369      
    '12-Aug-2020'    0.35371           0.01762      

Compute the zero curve for discounting and projecting forward rates.

ValuationDate = datenum('10-Jun-2015');
ZeroRates = [0.02 0.10 0.28 0.75 1.15 1.80]/100;
CurveDates = datemnth(ValuationDate, [0.25 0.5 1 2 3 5]*12);
ZeroCurve = IRDataCurve('Zero',ValuationDate,CurveDates,ZeroRates)
ZeroCurve = 
			 Type: Zero
		   Settle: 736125 (10-Jun-2015)
	  Compounding: 2
			Basis: 0 (actual/actual)
	 InterpMethod: linear
			Dates: [6x1 double]
			 Data: [6x1 double]

Define the floor volatility data.

FloorSettle = datenum('12-Jun-2015');
FloorMaturity = datenum({'13-Jun-2016';'12-Jun-2017';'12-Jun-2018';...
    '12-Jun-2019';'12-Jun-2020'});
FloorVolatility = [0.41;0.43;0.43;0.41;0.38];
FloorStrike = 0.015;

Strip floorlet volatilities from floors with the same strike.

[FloorletVols, FloorletPaymentDates, FloorStrikes] = floorvolstrip(ZeroCurve, ...
    FloorSettle, FloorMaturity, FloorVolatility, 'Strike', FloorStrike);

PaymentDates = cellstr(datestr(FloorletPaymentDates));
format;
table(PaymentDates, FloorletVols, FloorStrikes)
ans=9x3 table null
    PaymentDates     FloorletVols    FloorStrikes
    _____________    ____________    ____________

    '13-Jun-2016'       0.41         0.015       
    '12-Dec-2016'       0.42         0.015       
    '12-Jun-2017'    0.43433         0.015       
    '12-Dec-2017'    0.43001         0.015       
    '12-Jun-2018'       0.43         0.015       
    '12-Dec-2018'    0.39173         0.015       
    '12-Jun-2019'    0.37244         0.015       
    '12-Dec-2019'    0.32056         0.015       
    '12-Jun-2020'    0.28308         0.015       

Compute the zero curve for discounting and projecting forward rates.

ValuationDate = datenum('19-May-2015');
ZeroRates = [0.02 0.07 0.23 0.63 1.01 1.60]/100;
CurveDates = datemnth(ValuationDate, [0.25 0.5 1 2 3 5]*12);
ZeroCurve = IRDataCurve('Zero',ValuationDate,CurveDates,ZeroRates)
ZeroCurve = 
			 Type: Zero
		   Settle: 736103 (19-May-2015)
	  Compounding: 2
			Basis: 0 (actual/actual)
	 InterpMethod: linear
			Dates: [6x1 double]
			 Data: [6x1 double]

Define the floor volatility data.

FloorSettle = datenum('19-May-2015');
FloorMaturity = datenum({'19-May-2016';'19-May-2017';'21-May-2018'; ...
    '20-May-2019';'19-May-2020'});
FloorVolatility = [0.39;0.42;0.43;0.42;0.40];
FloorStrike = 0.010;

Specify the quarterly and semiannual dates.

FloorletDates = [cfdates(FloorSettle, '19-May-2016', 4)...
     cfdates('19-May-2016', '19-May-2020', 2)]'; 
FloorletDates(~isbusday(FloorletDates)) = ...
    busdate(FloorletDates(~isbusday(FloorletDates)), 'modifiedfollow');

Strip floorlet volatilities using specified FloorletDates.

[FloorletVols, FloorletPaymentDates, FloorStrikes] = floorvolstrip(ZeroCurve, ...
    FloorSettle, FloorMaturity, FloorVolatility, 'Strike', FloorStrike, ...
    'FloorletDates', FloorletDates);

PaymentDates = cellstr(datestr(FloorletPaymentDates));
format;
table(PaymentDates, FloorletVols, FloorStrikes)
ans=11x3 table
    PaymentDates     FloorletVols    FloorStrikes
    _____________    ____________    ____________

    '19-Nov-2015'       0.39         0.01        
    '19-Feb-2016'       0.39         0.01        
    '19-May-2016'       0.39         0.01        
    '21-Nov-2016'     0.4058         0.01        
    '19-May-2017'     0.4307         0.01        
    '20-Nov-2017'    0.43317         0.01        
    '21-May-2018'    0.44309         0.01        
    '19-Nov-2018'    0.40831         0.01        
    '20-May-2019'    0.39831         0.01        
    '19-Nov-2019'     0.3524         0.01        
    '19-May-2020'    0.32765         0.01        

Compute the zero curve for discounting and projecting forward rates.

ValuationDate = datenum('3-May-2016');
ZeroRates = [-0.31 -0.21 -0.15 -0.10 0.009 0.19]/100;
CurveDates = datemnth(ValuationDate, [0.25 0.5 1 2 3 5]*12);
ZeroCurve = IRDataCurve('Zero',ValuationDate,CurveDates,ZeroRates)
ZeroCurve = 

			 Type: Zero
		   Settle: 736453 (03-May-2016)
	  Compounding: 2
			Basis: 0 (actual/actual)
	 InterpMethod: linear
			Dates: [6x1 double]
			 Data: [6x1 double]

Define the floor volatility (Shifted Black) data.

FloorSettle = datenum('3-May-2016');
FloorMaturity = datenum({'3-May-2017';'3-May-2018';'3-May-2019'; ...
    '4-May-2020';'3-May-2021'});
FloorVolatility = [0.42;0.45;0.43;0.40;0.36]; % Shifted Black volatilities
Shift = 0.01; % 1 percent shift.
FloorStrike = -0.001; % -0.1 percent strike.

Strip floorlet volatilities from floors using the Shifted Black Model.

[FloorletVols, FloorletPaymentDates, FloorStrikes] = floorvolstrip(ZeroCurve, ...
FloorSettle,FloorMaturity,FloorVolatility,'Strike',FloorStrike,'Shift',Shift);

PaymentDates = string(datestr(FloorletPaymentDates));
format;
table(PaymentDates,FloorletVols,FloorStrikes)
ans =

  9x3 table

    PaymentDates     FloorletVols    FloorStrikes
    _____________    ____________    ____________

    "03-May-2017"       0.42         -0.001      
    "03-Nov-2017"    0.44575         -0.001      
    "03-May-2018"    0.47092         -0.001      
    "05-Nov-2018"    0.41911         -0.001      
    "03-May-2019"    0.40197         -0.001      
    "04-Nov-2019"    0.36262         -0.001      
    "04-May-2020"    0.33615         -0.001      
    "03-Nov-2020"    0.27453         -0.001      
    "03-May-2021"    0.23045         -0.001      

Input Arguments

collapse all

Zero rate curve, specified using a RateSpec or IRDataCurve object containing the zero rate curve for discounting according to its day count convention. ZeroCurve is also used for computing the underlying forward rates if the optional argument ProjectionCurve is not specified. Its observation date specifies the valuation date. For more information on creating a RateSpec, see intenvset. For more information on creating an IRDataCurve object, see IRDataCurve.

Data Types: struct

Common floor settle date, specified using a serial date number or date character vector. The FloorSettle date cannot be earlier than the ZeroCurve valuation date.

Data Types: double | char

Floor maturity dates, specified using serial date numbers or date character vectors as an NFloor-by-1 vector.

Data Types: double | char

Flat floor volatilities, specified using positive decimals as a NFloor-by-1 vector.

Data Types: double

Name-Value Pair Arguments

Specify optional comma-separated pairs of Name,Value arguments. Name is the argument name and Value is the corresponding value. Name must appear inside single quotes (' '). You can specify several name and value pair arguments in any order as Name1,Value1,...,NameN,ValueN.

Example: [FloorletVols,FloorletPaymentDates,FloorStrikes] = floorvolstrip(ZeroCurve,FloorSettle,FloorMaturity,FloorVolatility,'Strike',.2)

collapse all

Floor strike rate, specified as decimals. Use Strike to specify a single strike that is equally applied to all floors.

Data Types: double

Floorlet reset and payment dates, specified as serial date numbers or date character vectors using a NFloorletDates-by-1 vector.

Use FloorletDates to manually specify all floorlet reset and payment dates. For example, some date intervals may be quarterly while others may be semiannual. All dates must be later than FloorSettle and cannot be later than the last FloorMaturity date. Dates are adjusted according to the BusDayConvention and Holidays inputs.

If FloorletDates is not specified, the default is to automatically generate periodic floorlet dates after FloorSettle based on the last FloorMaturity date as the reference date, using the following optional inputs: Reset, EndMonthRule, BusDayConvention, and Holidays

Data Types: double | char

Frequency of periodic payments per year within a floor, specified as a positive integer with values 1,2, 3, 4, 6, or 12.

Note

The input for Reset is ignored if FloorletDates is specified.

Data Types: double

End-of-month rule flag for generating floorlet dates is specified as nonnegative integer [0, 1] using a NINST-by-1 vector.

  • 0 = Ignore rule, meaning that a payment date is always the same numerical day of the month.

  • 1 = Set rule on, meaning that a payment date is always the last actual day of the month.

Data Types: logical

Business day conventions, specified by a character vector or N-by-1 cell array of character vectors of business day conventions. The selection for business day convention determines how non-business days are treated. Non-business days are defined as weekends plus any other date that businesses are not open (e.g. statutory holidays). Values are:

  • actual — Non-business days are effectively ignored. Cash flows that fall on non-business days are assumed to be distributed on the actual date.

  • follow — Cash flows that fall on a non-business day are assumed to be distributed on the following business day.

  • modifiedfollow — Cash flows that fall on a non-business day are assumed to be distributed on the following business day. However if the following business day is in a different month, the previous business day is adopted instead.

  • previous — Cash flows that fall on a non-business day are assumed to be distributed on the previous business day.

  • modifiedprevious — Cash flows that fall on a non-business day are assumed to be distributed on the previous business day. However if the previous business day is in a different month, the following business day is adopted instead.

Data Types: char | cell

Holidays used in computing business days, specified as MATLAB date numbers using an NHolidays-by-1 vector.

Data Types: double

Rate curve for computing underlying forward rates, specified as a RateSpec or IRDatCurve object. For more information on creating a RateSpec, see intenvset and for more information on creating an IRDataCurve object, see IRDataCurve.

Data Types: struct

Method used when interpolating the floor volatilities on each floorlet maturity date before stripping the floorlet volatilities, specified using a character vector with values: linear, nearest, next, previous, spline, or pchip. The definitions of the methods are:

  • linear — Linear interpolation. The interpolated value at a query point is based on linear interpolation of the values at neighboring grid points in each respective dimension. This is the default interpolation method.

  • nearest — Nearest neighbor interpolation. The interpolated value at a query point is the value at the nearest sample grid point.

  • next — Next neighbor interpolation. The interpolated value at a query point is the value at the next sample grid point.

  • previous — Previous neighbor interpolation. The interpolated value at a query point is the value at the previous sample grid point.

  • spline — Spline interpolation using not-a-knot end conditions. The interpolated value at a query point is based on a cubic interpolation of the values at neighboring grid points in each respective dimension.

  • pchip — Shape-preserving piecewise cubic interpolation. The interpolated value at a query point is based on a shape-preserving piecewise cubic interpolation of the values at neighboring grid points.

For more information on interpolation methods, see interp1.

Note

Constant extrapolation is used for volatilities falling outside the range of user-supplied data.

Data Types: char

Upper bound of implied volatility search interval, specified as a positive scalar decimal.

Data Types: double

Implied volatility search termination tolerance, specified as a positive scalar.

Data Types: double

Flag indicating whether to omit the first floorlet payment in the floors, specified as a scalar logical. For example, the first floorlet payment is omitted in spot-starting floors, while it is included in forward-starting floors. Setting this logical to false means to always include the first floorlet.

In general, “spot lag” is the delay between the fixing date and the effective date for LIBOR-like indices. It also determines whether a floor is spot-starting or forward-starting (Corb, 2012). Floors are considered to be spot-starting if they settle within “spot lag” business days after the valuation date. Those that settle later are considered to be forward-starting. The first floorlet is omitted if floors are spot-starting, while it is included if they are forward-starting (Tuckman, 2012).

Data Types: logical

Shift in decimals for the shifted SABR model (to be used with the Shifted Black model), specified using a scalar positive decimal value. Set this parameter to a positive shift in decimals to add a positive shift to the forward rate and strike, which effectively sets a negative lower bound for the forward rate and strike. For example, a Shift value of 0.01 is equal to a 1% shift.

Data Types: double

Output Arguments

collapse all

Stripped floorlet volatilities, returned as a NFloorletVols-by-1 vector in decimals.

Note

floorvolstrip may output NaNs for some floorlet volatilities. This could be the case if no volatility matches the floorlet price implied by the user-supplied floor data.

Payment dates (in date numbers), returned as a NFloorletVols-by-1 vector corresponding to FloorletVols.

Floor strikes, returned as a NFloorletVols-by-1 vector of strikes in decimals for floors maturing on corresponding FloorletPaymentDates.

Limitations

When bootstrapping the floorlet volatilities from ATM floors, the floorlet volatilities stripped from the shorter maturity floors are reused in the longer maturity floors without adjusting for the difference in strike. floorvolstrip follows the simplified approach described in Gatarek, 2006.

More About

collapse all

ATM

A cap or floor is at-the-money (ATM) if its strike is equal to the forward swap rate.

This is the fixed rate of a swap that makes the present value of the floating leg equal to that of the fixed leg. In comparison, a caplet or floorlet is ATM if its strike is equal to the forward rate (not the forward swap rate). In general (except over a single period), the forward rate is not necessarily equal to the forward swap rate. So, to be precise, the individual caplets in an ATM cap have slightly different moneyness and are actually only approximately ATM (Alexander, 2003). In addition, note that swap rate changes with swap maturity. Similarly, the ATM cap strike also changes with cap maturity, so the ATM cap strikes need to be computed for each cap maturity before stripping the caplet volatilities. As a result, when stripping the caplet volatilities from the ATM caps with increasing maturities, the ATM strikes of the consecutive caps are different.

References

[1] Alexander, C. “Common Correlation and Calibrating the Lognormal Forward Rate Model.” Wilmott Magazine, 2003.

[2] Corb, H. “Interest Rate Swaps and Other Derivatives.” Columbia Business School Publishing, 2012.

[3] Gatarek, D.P., Bachert, and R. Maksymiuk. The LIBOR Market Model in Practice. Wiley, 2006.

[4] Tuckman, B., Serrat, A. Fixed Income Securities: Tools for Today’s Markets. Wiley Finance, 2012.

Introduced in R2016a

Was this topic helpful?