floorvolstrip
Strip floorlet volatilities from flat floor volatilities
Syntax
Description
[
        strips floorlet volatilities from the flat floor volatilities by using the bootstrapping
        method. The function interpolates the cap volatilities on each floorlet payment date before
        stripping the floorlet volatilities.FloorletVols,FloorletPaymentDates,FloorStrikes]
= floorvolstrip(ZeroCurve,FloorSettle,FloorMaturity,FloorVolatility)
[
        specifies options using one or more name-value pair arguments in addition to the input
        arguments in the previous syntax.FloorletVols,FloorletPaymentDates,FloorStrikes]
= floorvolstrip(___,Name,Value)
Examples
Compute the zero curve for discounting and projecting forward rates.
ValuationDate = datetime(2015,8,10);
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 = datetime(2015,8,12); FloorMaturity = [datetime(2016,8,12) ; datetime(2017,8,14) ; datetime(2018,8,13) ; datetime(2019,8,12) ; datetime(2020,8,12)]; 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=9×3 table
     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 = datetime(2015,6,10);
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 = datetime(2015,6,12); FloorMaturity = [datetime(2016,6,13) ; datetime(2017,6,12) ; datetime(2018,6,12) ; datetime(2019,6,12) ;datetime(2020,6,12)]; 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=9×3 table
     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 = datetime(2015,5,19);
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 = datetime(2015,5,19); FloorMaturity = [datetime(2016,5,19) ; datetime(2017,5,19) ; datetime(2018,5,21) ; datetime(2019,5,20) ; datetime(2020,5,19)]; FloorVolatility = [0.39;0.42;0.43;0.42;0.40]; FloorStrike = 0.010;
Specify the quarterly and semiannual dates.
FloorletDates = [cfdates(FloorSettle, datetime(2016,5,19), 4)... cfdates(datetime(2016,5,19),datetime(2020,5,19), 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=11×3 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 = datetime(2016,5,3);
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 = datetime(2016,5,3); FloorMaturity = [datetime(2017,5,3) ; datetime(2018,5,3) ; datetime(2019,5,3) ; datetime(2020,5,4) ; datetime(2021,5,3)]; 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=9×3 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   
Compute the zero curve for discounting and projecting forward rates.
ValuationDate = datetime(2018,5,1);
ZeroRates = [-0.31 -0.27 -0.18 -0.05 0.015 0.22]/100;
CurveDates = datemnth(ValuationDate, [0.25 0.5 1 2 3 5]*12);
ZeroCurve = IRDataCurve('Zero',ValuationDate,CurveDates,ZeroRates)ZeroCurve = Type: Zero Settle: 737181 (01-May-2018) Compounding: 2 Basis: 0 (actual/actual) InterpMethod: linear Dates: [6x1 double] Data: [6x1 double]
Define the normal floor volatility data.
FloorSettle = datetime(2018,5,1); FloorMaturity = [datetime(2019,5,1) ; datetime(2020,5,1) ; datetime(2021,5,3) ; datetime(2022,5,2) ; datetime(2023,5,1)]; FloorVolatility = [0.0065;0.0067;0.0064;0.0058;0.0055]; % Normal volatilities FloorStrike = -0.005; % -0.5 percent strike.
Strip floorlet volatilities from floors using the Normal (Bachelier) model.
[FloorletVols, FloorletPaymentDates, FloorStrikes] = floorvolstrip(ZeroCurve, ... FloorSettle,FloorMaturity,FloorVolatility,'Strike',FloorStrike,'Model','normal'); PaymentDates = string(datestr(FloorletPaymentDates)); format; table(PaymentDates,FloorletVols,FloorStrikes)
ans=9×3 table
    PaymentDates     FloorletVols    FloorStrikes
    _____________    ____________    ____________
    "01-May-2019"        0.0065         -0.005   
    "01-Nov-2019"     0.0066644         -0.005   
    "01-May-2020"     0.0068354         -0.005   
    "02-Nov-2020"      0.006266         -0.005   
    "03-May-2021"     0.0060101         -0.005   
    "01-Nov-2021"      0.004942         -0.005   
    "02-May-2022"     0.0042668         -0.005   
    "01-Nov-2022"     0.0047986         -0.005   
    "01-May-2023"     0.0044738         -0.005   
Input Arguments
Zero rate curve, specified using a ratecurve, RateSpec,
            or IRDataCurve object containing the zero rate curve for discounting
            according to its day count convention. If you do not specify the optional argument
              ProjectionCurve, the function uses ZeroCurve
            to compute the underlying forward rates as well. The observation date of the
              ZeroCurve specifies the valuation date. For more information, see
            the following: 
- To create an - ratecurveobject, see- ratecurve.
- To create a - RateSpec, see- intenvset.
- To create an - IRDataCurveobject, see- IRDataCurve.
Data Types: struct
Common floor settle date, specified as a scalar datetime, string, or date character
            vector. The FloorSettle date cannot be earlier than the
              ZeroCurve valuation date.
To support existing code, floorvolstrip also
    accepts serial date numbers as inputs, but they are not recommended.
Floor maturity dates, specified as an NFloor-by-1 vector
            using a datetime array, string array, or date character vectors.
To support existing code, floorvolstrip also
    accepts serial date numbers as inputs, but they are not recommended.
Flat floor volatilities, specified as an NFloor-by-1
            vector of positive decimals.
Data Types: double
Name-Value Arguments
Specify optional pairs of arguments as
      Name1=Value1,...,NameN=ValueN, where Name is
      the argument name and Value is the corresponding value.
      Name-value arguments must appear after other arguments, but the order of the
      pairs does not matter.
    
      Before R2021a, use commas to separate each name and value, and enclose 
      Name in quotes.
    
Example: [FloorletVols,FloorletPaymentDates,FloorStrikes]
= floorvolstrip(ZeroCurve,FloorSettle,FloorMaturity,FloorVolatility,'Strike',.2)
Floor strike rate, specified as the comma-separated pair consisting of
                'Strike' and a scalar decimal value or an
                NFloorletVols-by-1 vector. Use
                Strike as a scalar to specify a single strike that applies
              equally to all floors. Or, specify an
                NCapletVols-by-1 vector of strikes for the
              floors.
Data Types: double
Floorlet reset and payment dates, specified as the comma-separated pair consisting of
                'FloorletDates' and an
                NFloorletDates-by-1 vector using a datetime
              array, string array, or date character vectors.
To support existing code, floorvolstrip also
    accepts serial date numbers as inputs, but they are not recommended.
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.
Frequency of periodic payments per year within a floor, specified as the comma-separated pair
              consisting of 'Reset' and a positive scalar integer with values
                1,2, 3,
                4, 6, or 12.
Note
If you specify FloorletDates, the function ignores the
                input for Reset.
Data Types: double
End-of-month rule flag for generating floorlet dates, specified as the comma-separated pair
              consisting of 'EndMonthRule' and a nonnegative integer
                [0, 1].
- 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 as the comma-separated pair consisting of
                'BusinessDayConvention' and a character vector. Use this argument
              to specify how the function treats non-business days, which are days on which
              businesses are not open (such as weekends and statutory holidays).
- '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
Holidays used in computing business days, specified as the comma-separated pair
              consisting of 'Holidays' and
                NHolidays-by-1 vector of MATLAB dates.
Data Types: datetime
Rate curve for computing underlying forward rates, specified as the comma-separated pair
              consisting of 'ProjectionCurve' and a RateSpec
              object or IRDatCurve object. For more information on creating a
                RateSpec, see intenvset. For more information on
              creating an IRDataCurve object, see IRDataCurve.
Data Types: struct
Method for interpolating the floor volatilities on each floorlet maturity date
              before stripping the floorlet volatilities, specified as the comma-separated pair
              consisting of 'MaturityInterpMethod' and a character vector with
              values: 'linear', 'nearest',
                'next', 'previous',
                'spline', or 'pchip'. 
- '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
The function uses constant extrapolation to calculate volatilities falling outside the range of user-supplied data.
Data Types: char
Upper bound of implied volatility search interval, specified as the comma-separated pair
              consisting of 'Limit' and a positive scalar decimal.
Data Types: double
Implied volatility search termination tolerance, specified as the comma-separated pair
              consisting of 'Tolerance' and a positive scalar.
Data Types: double
Flag to omit the first floorlet payment in the floors, specified as the
              comma-separated pair consisting of 'OmitFirstFloorlet' and a scalar
              logical. 
If the floors are spot-starting, the first floorlet payment is omitted. If the
              floors are forward-starting, the first floorlet payment is included. Regardless of the
              status of the floors, if you set this logical to false, then the
              function includes the first floorlet payment. 
In general, “spot lag” is the delay between the fixing date and the effective date for LIBOR-like indices. "Spot lag" 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 as the comma-separated pair consisting of 'Shift' and a
              positive scalar 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
Model used for the implied volatility calculation, specified as the
              comma-separated pair consisting of 'Model' and a scalar character
              vector or string scalar with one of the following values:
- 'lognormal'- Implied Black (no shift) or Shifted Black volatility.
- 'normal'- Implied Normal (Bachelier) volatility. If you specify- 'normal',- Shiftmust be zero.
The floorvolstrip function supports three volatility
                types.
| 'Model' Value | 'Shift' Value | Volatility Type | 
|---|---|---|
| 'lognormal' | Shift=0 | Black | 
| 'lognormal' | Shift>0 | Shifted Black | 
| 'normal' | Shift=0 | Normal (Bachelier) | 
Data Types: char | string
Output Arguments
Stripped floorlet volatilities, returned as a
              NFloorletVols-by-1 vector of decimals.
Note
floorvolstrip can output NaNs for some
                caplet volatilities. You might encounter this output if no volatility matches the
                caplet price implied by the user-supplied cap data. 
Payment dates (in date numbers), returned as an
              NFloorletVols-by-1 vector of date numbers
            corresponding to FloorletVols.
Floor strikes, returned as a NFloorletVols-by-1 vector
            of strikes in decimals for floors maturing on the corresponding
              FloorletPaymentDates.
Limitations
When bootstrapping the floorlet volatilities from ATM floors, the function reuses the floorlet
      volatilities stripped from the shorter maturity floors in the longer maturity floors without
      adjusting for the difference in strike. floorvolstrip follows the
      simplified approach described in Gatarek, 2006.
More About
A floor is a contract that includes a guarantee setting the minimum interest rate to be received by the holder, based on an otherwise floating interest rate.
The payoff for a floor is:
A cap or floor is at-the-money (ATM) if its strike is equal to the forward swap rate.
The forward swap rate 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 equal to the forward swap rate. So, to be precise, the individual caplets in an ATM cap have slightly different moneyness and are only approximately ATM (Alexander, 2003).
In addition, the swap rate changes with swap maturity. Similarly, the ATM cap strike also changes with cap maturity, so the ATM cap strikes are 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 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. Chichester, UK: Wiley, 2006.
[4] Tuckman, B., and Serrat, A. Fixed Income Securities: Tools for Today’s Markets. Hoboken, NJ: Wiley, 2012.
Version History
Introduced in R2016aThe ZeroCurve input argument supports a ratecurve object.
Although floorvolstrip supports serial date numbers,
                        datetime values are recommended instead. The
                        datetime data type provides flexible date and time
                formats, storage out to nanosecond precision, and properties to account for time
                zones and daylight saving time.
To convert serial date numbers or text to datetime values, use the datetime function. For example:
t = datetime(738427.656845093,"ConvertFrom","datenum"); y = year(t)
y =
        2021
There are no plans to remove support for serial date number inputs.
MATLAB Command
You clicked a link that corresponds to this MATLAB command:
Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.
Website auswählen
Wählen Sie eine Website aus, um übersetzte Inhalte (sofern verfügbar) sowie lokale Veranstaltungen und Angebote anzuzeigen. Auf der Grundlage Ihres Standorts empfehlen wir Ihnen die folgende Auswahl: .
Sie können auch eine Website aus der folgenden Liste auswählen:
So erhalten Sie die bestmögliche Leistung auf der Website
Wählen Sie für die bestmögliche Website-Leistung die Website für China (auf Chinesisch oder Englisch). Andere landesspezifische Websites von MathWorks sind für Besuche von Ihrem Standort aus nicht optimiert.
Amerika
- América Latina (Español)
- Canada (English)
- United States (English)
Europa
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)