Swap
Swap instrument object
Description
Create and price a Swap instrument object for one or more
Swap instruments using this workflow:
Use
fininstrumentto create aSwapinstrument object for one or more Swap instruments.Use
ratecurveto specify a curve model for theSwapinstrument object or usefinmodelto specify aHullWhite,BlackKarasinski,BlackDermanToy,CoxIngersollRoss, orLinearGaussian2Fmodel.Choose a pricing method.
When using a
ratecurve, usefinpricerto specify aDiscountpricing methodWhen using a
HullWhite,BlackKarasinski,CoxIngersollRoss, orBlackDermanToymodel , use anIRTreepricing method for one or moreSwapinstruments.When using a
HullWhite,BlackKarasinski, orLinearGaussian2Fmodel, usefinpricerto specify anIRMonteCarlopricing method for one or moreSwapinstruments.
For more information on this workflow, see Get Started with Workflows Using Object-Based Framework for Pricing Financial Instruments.
For more information on the available models and pricing methods for a
Swap instrument, see Choose Instruments, Models, and Pricers.
Creation
Syntax
Description
creates a SwapInstrument = fininstrument(InstrumentType,'Maturity',maturity_date,'LegRate',leg_rate)Swap object for one or more Swap instruments by
specifying InstrumentType and sets the properties for the
required name-value pair arguments Maturity and
LegRate.
The Swap instrument supports vanilla swaps, amortizing
swaps and forward swaps. You can use the Swap instrument
for a single currency swap but not a cross-currency swap. For more
information on a Swap instrument, see More About.
sets optional properties using
additional name-value pairs in addition to the required arguments in the
previous syntax. For example, SwapInstrument = fininstrument(___,Name,Value)SwapInstrument =
fininstrument("Swap",'Maturity',datetime(2019,1,30),'LegRate',[0.06
0.12],'LegType',["fixed","fixed"],'Basis',1,'Notional',100,'StartDate',datetime(2016,1,30),'DaycountAdjustedCashFlow',true,'BusinessDayConvention',"follow",'ProjectionCurve',ratecurve,'Name',"swap_instrument")
creates a Swap option with a maturity of January 30,
2019. You can specify multiple name-value pair arguments.
Input Arguments
Instrument type, specified as a string with the value of
"Swap", a character vector with the value of
'Swap', an
NINST-by-1 string array with
values of "Swap", or an
NINST-by-1 cell array of
character vectors with values of 'Swap'.
Data Types: char | cell | string
Name-Value Arguments
Specify required
and 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: SwapInstrument =
fininstrument("Swap",'Maturity',datetime(2019,1,30),'LegRate',[0.06
0.12],'LegType',["fixed","fixed"],'Basis',1,'Notional',100,'StartDate',datetime(2016,1,30),'DaycountAdjustedCashFlow',true,'BusinessDayConvention',"follow",'ProjectionCurve',ratecurve,'Name',"swap_instrument")
Required Swap Name-Value Pair Arguments
Swap maturity date, specified as the comma-separated pair
consisting of 'Maturity' and a scalar or an
NINST-by-1 vector using a
datetime array, string array, or date character vectors.
To support existing code, Swap also
accepts serial date numbers as inputs, but they are not recommended.
If you use date character vectors or strings, the format must be
recognizable by datetime because
the Maturity property is stored as a
datetime.
Leg rate in decimal values, specified as the comma-separated pair
consisting of 'LegRate' and a
NINST-by-2 matrix. Each
row can be defined as one of the following:
[CouponRate Spread](fixed-float)[Spread CouponRate](float-fixed)[CouponRate CouponRate](fixed-fixed)[Spread Spread](float-float)
CouponRate is the decimal annual rate.
Spread is the number of basis points in
decimals over the reference rate. The first column represents the
receiving leg, while the second column represents the paying
leg.
Data Types: double
Optional Swap Name-Value Pair Arguments
Leg type, specified as the comma-separated pair consisting of
'LegType' and a cell array of character
vectors or a string array with the supported values. The
LegType defines the interpretation of the
values entered in LegRate.
Note
When you specify a Swap instrument as
the underlying asset for a Swaption instrument while using a Normal, SABR, Black, or HullWhite pricer, the Swap
LegType must be
["fixed","float"] or
["float","fixed"]. You must also set
the ExerciseStyle name-value pair
argument of the associated Swaption instrument to
'European'.
Data Types: cell | string
Rate curve for projecting floating cash flows, specified as the
comma-separated pair consisting of
'ProjectionCurve' and a scalar
ratecurve object or an
NINST-by-1 vector of
ratecurve objects. You must create this
object using ratecurve. Use
this optional input if the forward curve is different from the
discount curve.
Data Types: object
Frequency of payments per year, specified as the comma-separated
pair consisting of 'Reset' and scalar or a
NINST-by-2 matrix if
Reset is different for each leg) with one of
the following values: 0, 1,
2, 3,
4, 6, or
12.
Data Types: double
Day count basis representing the basis for each leg, specified as
the comma-separated pair consisting of 'Basis'
and a NINST-by-1 matrix (or
NINST-by-2 matrix if
Basis is different for each leg).
0 — actual/actual
1 — 30/360 (SIA)
2 — actual/360
3 — actual/365
4 — 30/360 (PSA)
5 — 30/360 (ISDA)
6 — 30/360 (European)
7 — actual/365 (Japanese)
8 — actual/actual (ICMA)
9 — actual/360 (ICMA)
10 — actual/365 (ICMA)
11 — 30/360E (ICMA)
12 — actual/365 (ISDA)
13 — BUS/252
For more information, see Basis.
Data Types: double
Notional principal amount or principal value schedule, specified
as the comma-separated pair consisting of
'Notional' and a scalar numeric or an
NINST-by-1 numeric vector
or a timetable. Use a scalar or vector for a vanilla
Swap instrument and a timetable for an
amortizing Swap instrument.
Notional accepts a scalar for a principal
amount (or a 1-by-2 matrix if
Notional is different for each leg) or a
timetable for
principal value schedules. For schedules, the first column of the
timetable is dates and the second column is the associated notional
principal value. The date indicates the last day that the principal
value is valid.
Note
If you are creating one or more Swap
instruments and use a timetable, the timetable specification
applies to all of the Swap instruments.
Notional does not accept an
NINST-by-1 cell array
of timetables as input.
Data Types: timetable | double
Latest floating rate for float legs, specified as the
comma-separated pair consisting of
'LatestFloatingRate' and a scalar numeric or
an NINST-by-1 numeric
vector.
LatestFloatingRate is a
NINST-by-1 matrix (or
NINST-by-2 matrix if
LatestFloatingRate is different for each
leg).
Data Types: double
Lag in rate setting, specified as the comma-separated pair
consisting of 'ResetOffset' and a
NINST-by-2 matrix.
Data Types: double
Flag to adjust cash flows based on actual period day count,
specified as the comma-separated pair consisting of
'DaycountAdjustedCashFlow' and a
NINST-by-1 matrix (or
NINST-by-2 matrix if
DaycountAdjustedCashFlow is different for
each leg) of logicals with values of true or
false.
Data Types: logical
Business day conventions, specified as the comma-separated pair
consisting of 'BusinessDayConvention' and string
(or NINST-by-2 string array if
BusinessDayConvention is different for each
leg) or a character vector (or
NINST-by-2 cell array of
character vectors if BusinessDayConvention is
different for each leg). The selection for business day convention
determines how nonbusiness days are treated. Nonbusiness days are
defined as weekends plus any other date that businesses are not open
(for example, statutory holidays). Values are:
"actual"— Nonbusiness 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 nonbusiness day are assumed to be distributed on the following business day."modifiedfollow"— Cash flows that fall on a nonbusiness 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 nonbusiness day are assumed to be distributed on the previous business day."modifiedprevious"— Cash flows that fall on a nonbusiness 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 | string
Holidays used in computing business days, specified as the
comma-separated pair consisting of 'Holidays' and
dates using an NINST-by-1
vector of datetimes, cell array of date character vectors, or date
string array. For
example:
H = holidays(datetime('today'),datetime(2025,12,15)); Swap = fininstrument("Swap",'Maturity',datetime(2025,12,15),'LegRate',[0.06 20],'Holidays',H)
To support existing code, Swap also
accepts serial date numbers as inputs, but they are not recommended.
End-of-month rule flag for generating dates when
Maturity is an end-of-month date for a month
with 30 or fewer days, specified as the comma-separated pair
consisting of 'EndMonthRule' and a logical value
of true or false using a
NINST-by-1 matrix (or
NINST-by-2 matrix if
EndMonthRule is different for each leg).
If you set
EndMonthRuletofalse, the software ignores the rule, meaning that a payment date is always the same numerical day of the month.If you set
EndMonthRuletotrue, the software sets the rule on, meaning that a payment date is always the last actual day of the month.
Data Types: logical
Date swap starts, specified as the comma-separated pair consisting
of 'StartDate' and a scalar or an
NINST-by-1 vector using a
datetime array, string array, or date character vectors.
To support existing code, Swap also
accepts serial date numbers as inputs, but they are not recommended.
Use StartDate to price a forward swap, that is,
a swap that starts at a future date.
If you use date character vectors or strings, the format must be
recognizable by datetime because
the StartDate property is stored as a
datetime.
Data Types: datetime | char | string | cell
User-defined name for the instrument, specified as the
comma-separated pair consisting of 'Name' and a
scalar string or character vector or an
NINST-by-1 cell array of
character vectors or string array.
Data Types: char | cell | string
Output Arguments
Swap instrument, returned as a Swap object.
Properties
Maturity date, returned as a scalar datetime or an
NINST-by-1 vector of
datetimes.
Data Types: datetime
Leg rate, returned as a NINST-by-2
matrix of decimal values, with each row defined as one of the following:
[CouponRate Spread](fixed-float)[Spread CouponRate](float-fixed)[CouponRate CouponRate](fixed-fixed)[Spread Spread](float-float)
Data Types: double
Leg type, returned as a string array with the values
["fixed","fixed"],
["fixed","float"],
["float","fixed"], or
["float","float"].
Data Types: string
Rate curve used in projecting the future cash flows, returned as a
ratecurve object or an
NINST-by-1 vector of
ratecurve objects.
Data Types: object
Reset frequency per year for each swap, returned as a scalar or an
NINST-by-2 matrix.
Data Types: double
Day count basis, returned as an
NINST-by-1 or an
NINST-by-2 matrix.
Data Types: double
Lag in rate setting, returned as an
NINST-by-2 or an
NINST-by-2 matrix.
Data Types: double
Notional principal amount, returned as a scalar numeric or an
NINST-by-1 numeric vector or a
timetable.
Data Types: double | timetable
Rate for the next floating payment, set at the last reset date, returned
as a scalar numeric or an NINST-by-1
numeric vector or NINST-by-2
if LatestFloatingRate is different for each
leg.
Data Types: double
Flag to adjust cash flows based on actual period day count, returned as an
NINST-by-1 matrix (or an
NINST-by-2 matrix if
DaycountAdjustedCashFlow is different for each leg)
of logicals with values of true or
false.
Data Types: logical
Business day conventions, returned as a string or a
NINST-by-2 string array if
BusinessDayConvention is different for each
leg.
Data Types: char | cell | string
Holidays used in computing business days, returned as an
NINST-by-1 vector of
datetimes.
Data Types: datetime
End-of-month rule flag for generating dates when
Maturity is an end-of-month date for a month with 30
or fewer days, returned as an
NINST-by-1 matrix (or
NINST-by-2 matrix if
EndMonthRule is different for each leg.
Data Types: logical
Date swap starts, returned as a scalar datetime or an
NINST-by-1 vector of datetimes.
Data Types: datetime
User-defined name for the instrument, returned as a scalar string or an
NINST-by-1 string array.
Data Types: string
Object Functions
cashflows | Compute cash flow for FixedBond, FloatBond,
Swap, FRA, STIRFuture,
OISFuture, OvernightIndexedSwap, or
Deposit instrument |
parswaprate | Compute par swap rate for Swap and
OvernightIndexedSwap instrument |
Examples
This example shows the workflow to price a vanilla Swap instrument when you use a ratecurve and a Discount pricing method.
Create ratecurve Object
Create a ratecurve object using ratecurve for the underlying interest-rate curve for the Swap instrument.
Settle = datetime(2019,9,15); Type = 'zero'; ZeroTimes = [calmonths(6) calyears([1 2 3 4 5 7 10 20 30])]'; ZeroRates = [0.0052 0.0055 0.0061 0.0073 0.0094 0.0119 0.0168 0.0222 0.0293 0.0307]'; ZeroDates = Settle + ZeroTimes; myRC = ratecurve('zero',Settle,ZeroDates,ZeroRates)
myRC =
ratecurve with properties:
Type: "zero"
Compounding: -1
Basis: 0
Dates: [10×1 datetime]
Rates: [10×1 double]
Settle: 15-Sep-2019
InterpMethod: "linear"
ShortExtrapMethod: "next"
LongExtrapMethod: "previous"
Create Swap Instrument Object
Use fininstrument to create a vanilla Swap instrument object.
Swap = fininstrument("Swap",'Maturity',datetime(2024,9,15),'LegRate',[0.022 0.019 ],'LegType',["float","fixed"],'ProjectionCurve',myRC,'Name',"swap_instrument")
Swap =
Swap with properties:
LegRate: [0.0220 0.0190]
LegType: ["float" "fixed"]
Reset: [2 2]
Basis: [0 0]
Notional: 100
LatestFloatingRate: [NaN NaN]
ResetOffset: [0 0]
DaycountAdjustedCashFlow: [0 0]
ProjectionCurve: [1×2 ratecurve]
BusinessDayConvention: ["actual" "actual"]
Holidays: NaT
EndMonthRule: [1 1]
StartDate: NaT
Maturity: 15-Sep-2024
Name: "swap_instrument"
Create Discount Pricer Object
Use finpricer to create a Discount pricer object and use the ratecurve object for the 'DiscountCurve' name-value pair argument.
outPricer = finpricer("Discount", 'DiscountCurve',myRC)
outPricer =
Discount with properties:
DiscountCurve: [1×1 ratecurve]
Price Swap Instrument
Use price to compute the price and sensitivities for the vanilla Swap instrument.
[Price, outPR] = price(outPricer, Swap,["all"])Price = 7.2279
outPR =
priceresult with properties:
Results: [1×2 table]
PricerData: []
outPR.Results
ans=1×2 table
Price DV01
______ _________
7.2279 -0.046631
This example shows the workflow to price a Swap instrument when you use a CoxIngersollRoss model and an IRTree pricing method.
Create Swap Instrument Object
Use fininstrument to create a Swap instrument object.
Maturity = datetime(2027,1,1); LegType = ["fixed","float"]; LegRate = [0.06 0.0020]; Reset = 1; Swap = fininstrument("Swap",Maturity=Maturity,LegRate=LegRate,LegType=LegType,Reset=[Reset Reset],Name="Swap_inst")
Swap =
Swap with properties:
LegRate: [0.0600 0.0020]
LegType: ["fixed" "float"]
Reset: [1 1]
Basis: [0 0]
Notional: 100
LatestFloatingRate: [NaN NaN]
ResetOffset: [0 0]
DaycountAdjustedCashFlow: [0 0]
ProjectionCurve: [0×0 ratecurve]
BusinessDayConvention: ["actual" "actual"]
Holidays: NaT
EndMonthRule: [1 1]
StartDate: NaT
Maturity: 01-Jan-2027
Name: "Swap_inst"
Create CoxIngersollRoss Model Object
Use finmodel to create a CoxIngersollRoss model object.
alpha = 0.03;
theta = 0.02;
sigma = 0.1;
CIRModel = finmodel("CoxIngersollRoss",Sigma=sigma,Alpha=alpha,Theta=theta)CIRModel =
CoxIngersollRoss with properties:
Sigma: 0.1000
Alpha: 0.0300
Theta: 0.0200
Create ratecurve Object
Create a ratecurve object using ratecurve.
Times= [calyears([1 2 3 4 ])]';
Settle = datetime(2023,1,1);
ZRates = [0.035; 0.042147; 0.047345; 0.052707]';
ZDates = Settle + Times;
Compounding = -1;
Basis = 1;
ZeroCurve = ratecurve("zero",Settle,ZDates,ZRates,Compounding = Compounding, Basis = Basis);Create IRTree Pricer Object
Use finpricer to create an IRTree pricer object for the CoxIngersollRoss model and use the ratecurve object for the 'DiscountCurve' name-value argument.
CIRPricer = finpricer("irtree",Model=CIRModel,DiscountCurve=ZeroCurve,Maturity=ZDates(end),NumPeriods=length(ZDates))CIRPricer =
CIRTree with properties:
Tree: [1×1 struct]
TreeDates: [4×1 datetime]
Model: [1×1 finmodel.CoxIngersollRoss]
DiscountCurve: [1×1 ratecurve]
Price Swap Instrument
Use price to compute the price for the Swap instrument.
[Price,outPR] = price(CIRPricer,Swap,"all")Price = 1.6525
outPR =
priceresult with properties:
Results: [1×4 table]
PricerData: [1×1 struct]
outPR.Results
ans=1×4 table
Price Delta Gamma Vega
______ _______ ______ ___________
1.6525 -374.11 1443.2 -2.8422e-10
This example shows the workflow to price multiple vanilla Swap instruments when you use a ratecurve and a Discount pricing method.
Create ratecurve Object
Create a ratecurve object using ratecurve for the underlying interest-rate curve for the Swap instrument.
Settle = datetime(2019,9,15); Type = 'zero'; ZeroTimes = [calmonths(6) calyears([1 2 3 4 5 7 10 20 30])]'; ZeroRates = [0.0052 0.0055 0.0061 0.0073 0.0094 0.0119 0.0168 0.0222 0.0293 0.0307]'; ZeroDates = Settle + ZeroTimes; myRC = ratecurve('zero',Settle,ZeroDates,ZeroRates)
myRC =
ratecurve with properties:
Type: "zero"
Compounding: -1
Basis: 0
Dates: [10×1 datetime]
Rates: [10×1 double]
Settle: 15-Sep-2019
InterpMethod: "linear"
ShortExtrapMethod: "next"
LongExtrapMethod: "previous"
Create Swap Instrument Object
Use fininstrument to create a vanilla Swap instrument object for three Swap instruments.
Swap = fininstrument("Swap",'Maturity',datetime([2024,9,15 ; 2025,9,15 ; 2026,9,15]),'LegRate',[0.022 0.019 ],'LegType',["float","fixed"],'ProjectionCurve',myRC,'Name',"swap_instrument")
Swap=3×1 Swap array with properties:
LegRate
LegType
Reset
Basis
Notional
LatestFloatingRate
ResetOffset
DaycountAdjustedCashFlow
ProjectionCurve
BusinessDayConvention
Holidays
EndMonthRule
StartDate
Maturity
Name
Create Discount Pricer Object
Use finpricer to create a Discount pricer object and use the ratecurve object for the 'DiscountCurve' name-value pair argument.
outPricer = finpricer("Discount", 'DiscountCurve',myRC)
outPricer =
Discount with properties:
DiscountCurve: [1×1 ratecurve]
Price Swap Instruments
Use price to compute the prices and sensitivities for the vanilla Swap instruments.
[Price, outPR] = price(outPricer, Swap,["all"])Price = 3×1
7.2279
9.9725
13.0798
outPR=1×3 priceresult array with properties:
Results
PricerData
outPR.Results
ans=1×2 table
Price DV01
______ _________
7.2279 -0.046631
ans=1×2 table
Price DV01
______ _________
9.9725 -0.054393
ans=1×2 table
Price DV01
_____ _________
13.08 -0.061381
This example shows the workflow to price an amortizing Swap instrument when you use a ratecurve and a Discount pricing method.
Create ratecurve Object
Create a ratecurve object using ratecurve for the underlying interest-rate curve for the Swap instrument.
Settle = datetime(2019,1,1); Type = 'zero'; ZeroTimes = [calmonths(6) calyears([1 2 3 4 5 7 10 20 30])]'; ZeroRates = [0.0052 0.0055 0.0061 0.0073 0.0094 0.0119 0.0168 0.0222 0.0293 0.0307]'; ZeroDates = Settle + ZeroTimes; myRC = ratecurve('zero',Settle,ZeroDates,ZeroRates)
myRC =
ratecurve with properties:
Type: "zero"
Compounding: -1
Basis: 0
Dates: [10×1 datetime]
Rates: [10×1 double]
Settle: 01-Jan-2019
InterpMethod: "linear"
ShortExtrapMethod: "next"
LongExtrapMethod: "previous"
Create Swap Instrument Object
Use fininstrument to create an amortizing Swap instrument object.
Maturity = datetime(2024,1,1); ADates = datetime([2020,1,1 ; 2024,1,1]); APrincipal = [100; 85]; Notional = timetable(ADates,APrincipal); Swap = fininstrument("Swap",'Maturity',Maturity,'LegRate',[0.035,0.01],'Reset',[1 1],'Notional',Notional,'Name',"swap_instrument")
Swap =
Swap with properties:
LegRate: [0.0350 0.0100]
LegType: ["fixed" "float"]
Reset: [1 1]
Basis: [0 0]
Notional: [2×1 timetable]
LatestFloatingRate: [NaN NaN]
ResetOffset: [0 0]
DaycountAdjustedCashFlow: [0 0]
ProjectionCurve: [0×0 ratecurve]
BusinessDayConvention: ["actual" "actual"]
Holidays: NaT
EndMonthRule: [1 1]
StartDate: NaT
Maturity: 01-Jan-2024
Name: "swap_instrument"
Create Discount Pricer Object
Use finpricer to create a Discount pricer object and use the ratecurve object for the 'DiscountCurve' name-value pair argument.
outPricer = finpricer("Discount", 'DiscountCurve',myRC)
outPricer =
Discount with properties:
DiscountCurve: [1×1 ratecurve]
Price Swap Instrument
Use price to compute the price and sensitivities for the amortizing Swap instrument.
[Price, outPR] = price(outPricer, Swap,["all"])Price = 5.7183
outPR =
priceresult with properties:
Results: [1×2 table]
PricerData: []
outPR.Results
ans=1×2 table
Price DV01
______ ________
5.7183 0.044672
This example shows the workflow to price a vanilla Swap instrument when you use a HullWhite model and an IRTree pricing method.
Create ratecurve Object
Create a ratecurve object using ratecurve for the underlying interest-rate curve for the Swap instrument.
Settle = datetime(2020,1,15); Type = 'zero'; ZeroTimes = [calmonths(6) calyears([1 2 3 4 5 7 10 20 30])]'; ZeroRates = [0.0052 0.0055 0.0061 0.0073 0.0094 0.0119 0.0168 0.0222 0.0293 0.0307]'; ZeroDates = Settle + ZeroTimes; myRC = ratecurve('zero',Settle,ZeroDates,ZeroRates)
myRC =
ratecurve with properties:
Type: "zero"
Compounding: -1
Basis: 0
Dates: [10×1 datetime]
Rates: [10×1 double]
Settle: 15-Jan-2020
InterpMethod: "linear"
ShortExtrapMethod: "next"
LongExtrapMethod: "previous"
Create Swap Instrument Object
Use fininstrument to create a vanilla Swap instrument object.
LegType = ["float","fixed"]; Swap = fininstrument("Swap",'Maturity',datetime(2030,9,15),'LegRate',[0.022 0.019],'LegType',LegType,'ProjectionCurve',myRC,'Name',"swap_instrument")
Swap =
Swap with properties:
LegRate: [0.0220 0.0190]
LegType: ["float" "fixed"]
Reset: [2 2]
Basis: [0 0]
Notional: 100
LatestFloatingRate: [NaN NaN]
ResetOffset: [0 0]
DaycountAdjustedCashFlow: [0 0]
ProjectionCurve: [1×2 ratecurve]
BusinessDayConvention: ["actual" "actual"]
Holidays: NaT
EndMonthRule: [1 1]
StartDate: NaT
Maturity: 15-Sep-2030
Name: "swap_instrument"
Create HullWhite Model Object
Use finmodel to create a HullWhite model object.
HullWhiteModel = finmodel("HullWhite",'Alpha',0.032,'Sigma',0.04)
HullWhiteModel =
HullWhite with properties:
Alpha: 0.0320
Sigma: 0.0400
Compute Swap Instrument Cash Flow Dates
Use cfdates to compute the cash flows.
CFdates = cfdates(Settle, Swap.Maturity, Swap.Reset(1), Swap.Basis(1))
CFdates = 1×22 datetime
15-Mar-2020 15-Sep-2020 15-Mar-2021 15-Sep-2021 15-Mar-2022 15-Sep-2022 15-Mar-2023 15-Sep-2023 15-Mar-2024 15-Sep-2024 15-Mar-2025 15-Sep-2025 15-Mar-2026 15-Sep-2026 15-Mar-2027 15-Sep-2027 15-Mar-2028 15-Sep-2028 15-Mar-2029 15-Sep-2029 15-Mar-2030 15-Sep-2030
Create IRTree Pricer Object
Use finpricer to create an IRTree pricer object and use the ratecurve object for the 'DiscountCurve' name-value pair argument.
HWTreePricer = finpricer("IRTree",'Model',HullWhiteModel,'DiscountCurve',myRC,'TreeDates',CFdates')
HWTreePricer =
HWBKTree with properties:
Tree: [1×1 struct]
TreeDates: [22×1 datetime]
Model: [1×1 finmodel.HullWhite]
DiscountCurve: [1×1 ratecurve]
Price Swap Instrument
Use price to compute the price and sensitivities for the vanilla Swap instrument.
[Price, outPR] = price(HWTreePricer, Swap,"all")Price = 24.3727
outPR =
priceresult with properties:
Results: [1×4 table]
PricerData: [1×1 struct]
outPR.Results
ans=1×4 table
Price Delta Gamma Vega
______ ______ _______ __________
24.373 820.67 -8790.5 8.5265e-10
This example shows the workflow to price a vanilla Swap instrument when you use a HullWhite model and an IRTree pricing method and then compute the par swap rate using parswaprate.
Create ratecurve Object
Create a ratecurve object using ratecurve for the underlying interest-rate curve for the Swap instrument.
Settle = datetime(2020,1,15); Type = 'zero'; ZeroTimes = [calmonths(6) calyears([1 2 3 4 5 7 10 20 30])]'; ZeroRates = [0.0052 0.0055 0.0061 0.0073 0.0094 0.0119 0.0168 0.0222 0.0293 0.0307]'; ZeroDates = Settle + ZeroTimes; myRC = ratecurve('zero',Settle,ZeroDates,ZeroRates)
myRC =
ratecurve with properties:
Type: "zero"
Compounding: -1
Basis: 0
Dates: [10×1 datetime]
Rates: [10×1 double]
Settle: 15-Jan-2020
InterpMethod: "linear"
ShortExtrapMethod: "next"
LongExtrapMethod: "previous"
Create Swap Instrument Object
Use fininstrument to create a vanilla Swap instrument object.
LegType = ["float","fixed"]; Swap = fininstrument("Swap",'Maturity',datetime(2030,9,15),'LegRate',[0.022 0.019],'LegType',LegType,'ProjectionCurve',myRC,'Name',"swap_instrument")
Swap =
Swap with properties:
LegRate: [0.0220 0.0190]
LegType: ["float" "fixed"]
Reset: [2 2]
Basis: [0 0]
Notional: 100
LatestFloatingRate: [NaN NaN]
ResetOffset: [0 0]
DaycountAdjustedCashFlow: [0 0]
ProjectionCurve: [1×2 ratecurve]
BusinessDayConvention: ["actual" "actual"]
Holidays: NaT
EndMonthRule: [1 1]
StartDate: NaT
Maturity: 15-Sep-2030
Name: "swap_instrument"
Create HullWhite Model Object
Use finmodel to create a HullWhite model object.
HullWhiteModel = finmodel("HullWhite",'Alpha',0.032,'Sigma',0.04)
HullWhiteModel =
HullWhite with properties:
Alpha: 0.0320
Sigma: 0.0400
Compute Swap Instrument Cash Flow Dates
Use cfdates to compute the cash flows.
CFdates = cfdates(Settle, Swap.Maturity, Swap.Reset(1), Swap.Basis(1))
CFdates = 1×22 datetime
15-Mar-2020 15-Sep-2020 15-Mar-2021 15-Sep-2021 15-Mar-2022 15-Sep-2022 15-Mar-2023 15-Sep-2023 15-Mar-2024 15-Sep-2024 15-Mar-2025 15-Sep-2025 15-Mar-2026 15-Sep-2026 15-Mar-2027 15-Sep-2027 15-Mar-2028 15-Sep-2028 15-Mar-2029 15-Sep-2029 15-Mar-2030 15-Sep-2030
Create IRTree Pricer Object
Use finpricer to create an IRTree pricer object and use the ratecurve object for the 'DiscountCurve' name-value pair argument.
HWTreePricer = finpricer("IRTree",'Model',HullWhiteModel,'DiscountCurve',myRC,'TreeDates',CFdates')
HWTreePricer =
HWBKTree with properties:
Tree: [1×1 struct]
TreeDates: [22×1 datetime]
Model: [1×1 finmodel.HullWhite]
DiscountCurve: [1×1 ratecurve]
Price Swap Instrument
Use price to compute the price and sensitivities for the vanilla Swap instrument.
[Price, outPR] = price(HWTreePricer, Swap,"all")Price = 24.3727
outPR =
priceresult with properties:
Results: [1×4 table]
PricerData: [1×1 struct]
outPR.Results
ans=1×4 table
Price Delta Gamma Vega
______ ______ _______ __________
24.373 820.67 -8790.5 8.5265e-10
Compute Par Swap Rate
Use parswaprate to compute the par swap rate for the OvernightIndexedSwap instrument. The par swap rate is the rate that renders a swap value equal to zero.
outRate = parswaprate(Swap,myRC)
outRate = 0.0434
This example shows the workflow to price a vanilla Swap instrument when using a LinearGaussian2F model and an IRMonteCarlo pricing method.
Create ratecurve Object
Create a ratecurve object using ratecurve.
Settle = datetime(2020,1,15); Type = 'zero'; ZeroTimes = [calmonths(6) calyears([1 2 3 4 5 7 10 20 30])]'; ZeroRates = [0.0052 0.0055 0.0061 0.0073 0.0094 0.0119 0.0168 0.0222 0.0293 0.0307]'; ZeroDates = Settle + ZeroTimes; myRC = ratecurve('zero',Settle,ZeroDates,ZeroRates)
myRC =
ratecurve with properties:
Type: "zero"
Compounding: -1
Basis: 0
Dates: [10×1 datetime]
Rates: [10×1 double]
Settle: 15-Jan-2020
InterpMethod: "linear"
ShortExtrapMethod: "next"
LongExtrapMethod: "previous"
Create Swap Instrument Object
Use fininstrument to create a Swap instrument object.
LegType = ["float","fixed"]; Swap = fininstrument("Swap",'Maturity',datetime(2030,9,15),'LegRate',[0.022 0.019],'LegType',LegType,'ProjectionCurve',myRC,'Name',"swap_instrument")
Swap =
Swap with properties:
LegRate: [0.0220 0.0190]
LegType: ["float" "fixed"]
Reset: [2 2]
Basis: [0 0]
Notional: 100
LatestFloatingRate: [NaN NaN]
ResetOffset: [0 0]
DaycountAdjustedCashFlow: [0 0]
ProjectionCurve: [1×2 ratecurve]
BusinessDayConvention: ["actual" "actual"]
Holidays: NaT
EndMonthRule: [1 1]
StartDate: NaT
Maturity: 15-Sep-2030
Name: "swap_instrument"
Create LinearGaussian2F Model Object
Use finmodel to create a LinearGaussian2F model object.
LinearGaussian2FModel = finmodel("LinearGaussian2F",'Alpha1',0.07,'Sigma1',0.01,'Alpha2',0.5,'Sigma2',0.006,'Correlation',-0.7)
LinearGaussian2FModel =
LinearGaussian2F with properties:
Alpha1: 0.0700
Sigma1: 0.0100
Alpha2: 0.5000
Sigma2: 0.0060
Correlation: -0.7000
Create IRMonteCarlo Pricer Object
Use finpricer to create an IRMonteCarlo pricer object and use the ratecurve object for the 'DiscountCurve' name-value pair argument.
outPricer = finpricer("IRMonteCarlo",'Model',LinearGaussian2FModel,'DiscountCurve',myRC,'SimulationDates',ZeroDates)
outPricer =
G2PPMonteCarlo with properties:
NumTrials: 1000
RandomNumbers: []
DiscountCurve: [1×1 ratecurve]
SimulationDates: [15-Jul-2020 15-Jan-2021 15-Jan-2022 15-Jan-2023 15-Jan-2024 15-Jan-2025 15-Jan-2027 15-Jan-2030 15-Jan-2040 15-Jan-2050]
Model: [1×1 finmodel.LinearGaussian2F]
Price Swap Instrument
Use price to compute the price and sensitivities for the Swap instrument.
[Price,outPR] = price(outPricer,Swap,["all"])Price = 23.6657
outPR =
priceresult with properties:
Results: [1×4 table]
PricerData: [1×1 struct]
outPR.Results
ans=1×4 table
Price Delta Gamma Vega
______ ______ _______ ______
23.666 819.11 -8748.9 0 0
More About
A vanilla swap is a contract obligating two parties, typically the fixed-rate payer and the floating-rate payer, to exchange future cash flows based on a predetermined notional amount.
In a vanilla swap, one party pays a fixed interest rate, while the other pays a floating rate based on a reference rate like LIBOR. Cash flows are exchanged on predetermined dates, typically quarterly, semiannually, or annually, until the contract's specified maturity date, which can range from a few months to several years.
A swap with an amortization schedule repays part of the principal (face value) along with the coupon payments.
A swap with an amortization schedule is used to manage interest-rate risk and
serve as a cash flow management tool. For this particular type of swap, the notional
amount decreases over time. This means that interest payments decrease not only on
the floating leg but also on the fixed leg. Use the Notional
name-value pair argument to support an amortization schedule.
In a forward interest-rate swap, a fixed interest-rate loan is exchanged for a floating interest-rate loan at a future specified date.
The StartDate name-value pair argument supports the future
date for the forward swap.
Version History
Introduced in R2020aYou can price Swap instruments using a CoxIngersollRoss model object
and an IRTree pricing
method.
Although Swap 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.
See Also
Functions
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.
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- 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)