Finance - Maple Programming Help

Home : Support : Online Help : Mathematics : Finance : Financial Instruments : Finance/LatticePrice

Finance

 LatticePrice
 return the net present value of the given instruments computed using a binomial or trinomial tree

 Calling Sequence LatticePrice(instrument, model, discountrate, opts)

Parameters

 instrument - one-asset option, swaption, cap, floor, or collar data structure; financial instrument model - binomial or trinomial tree; tree approximation for the underlying stochastic process discountrate - non-negative constant or a yield term structure; discount rate opts - equations of the form option = value where option is one of referencedate or daycounter; specify options for the LatticePrice command

Options

 • daycounter =  a string containing a date specification in a format recognized by ParseDate or a Date data structure -- This option specifies a day counter or day counting convention.
 • referencedate =  a string containing a date specification in a format recognized by ParseDate or a Date data structure -- This option specifies the reference date, that is, the date when the discount factor is 1. By default this is set to the global evaluation date.

Description

 • The LatticePrice command computes the net present value of the specified financial instrument using the specified lattice approximation for the underlying stochastic process.
 • The parameter instrument is a financial instrument to be valued. At the present the following instruments are supported:
 – a one-asset option of the American, Bermudan, or European type (see AmericanOption, BermudanOption, or EuropeanOption)
 – a swaption of the American, Bermudan, or European type (see AmericanSwaption, BermudanSwaption, or EuropeanSwaption)
 – interest rate cap, floor, or collar (see Cap, Floor, or Collar)
 • The parameter model is a binomial or trinomial tree.
 • The parameter discountrate is the discount rate. It can be either a non-negative constant or a yield term structure. In the former case the reference date and the day count convention for the underlying term structure can be provided using the options daycounter and referencedate.
 • Note that all internal computations are performed at the hardware precision.

Examples

 > with(Finance):

Set the global evaluation date to January 3, 2006.

 > SetEvaluationDate("January 3, 2006"):
 > Settings(daycounter = Thirty360European):

Construct a binomial tree approximating a Black-Scholes process with an initial value of 100, a risk-free rate of 10%, and constant volatility of 40%. Assume that no dividend is paid. Build the tree by subdividing the time period 0..0.6 into 1000 equal time steps.

 > T := BlackScholesBinomialTree(100, 0.1, 0.0, 0.4, 0.6, 1000):

Consider an American put option with a strike price of 100 that matures in 6 months.

 > P := S -> max(100-S, 0);
 ${P}{≔}{S}{↦}{\mathrm{max}}{}\left({100}{-}{S}{,}{0}\right)$ (1)
 > A1 := AmericanOption(P, 0, 0.5):
 > Maturity := AdvanceDate(EvaluationDate(), 6, Months, output = formatted);
 ${\mathrm{Maturity}}{≔}{"July 3, 2006"}$ (2)
 > YearFraction(Maturity);
 ${0.5000000000}$ (3)
 > A2 := AmericanOption(P, EvaluationDate(), Maturity):

Calculate the price of this option using the tree constructed above. Use the risk-free rate as the discount rate.

 > LatticePrice(A1, T, 0.1);
 ${9.220859736}$ (4)
 > LatticePrice(A2, T, 0.1);
 ${9.220859736}$ (5)

The next set of examples will demonstrate how to price American-style swaptions using Hull-White trinomial trees.

 > SetEvaluationDate("November 17, 2006"):
 > EvaluationDate();
 ${"November 17, 2006"}$ (6)
 > nominalamt := 1000.0;
 ${\mathrm{nominalamt}}{≔}{1000.0}$ (7)
 > fixing_days := 2;
 ${\mathrm{fixing_days}}{≔}{2}$ (8)
 > start := AdvanceDate(1, Years, EURIBOR);
 ${\mathrm{start}}{≔}{"November 17, 2007"}$ (9)
 > maturity := AdvanceDate(start, 5, Years, EURIBOR);
 ${\mathrm{maturity}}{≔}{"November 17, 2012"}$ (10)
 > discount_curve := ForwardCurve(0.04875825, 'daycounter' = Actual365Fixed);
 ${\mathrm{discount_curve}}{≔}{\mathbf{module}}\left({}\right)\phantom{\rule[-0.0ex]{0.5em}{0.0ex}}{}\phantom{\rule[-0.0ex]{0.5em}{0.0ex}}{\mathbf{end module}}$ (11)
 > fixed_schedule := Schedule(start, maturity, Annual, 'convention' = Unadjusted, 'calendar' = EURIBOR);
 ${\mathrm{fixed_schedule}}{:=}{\mathbf{module}}\left({}\right)\phantom{\rule[-0.0ex]{0.5em}{0.0ex}}{}\phantom{\rule[-0.0ex]{0.5em}{0.0ex}}{\mathbf{end module}}$ (12)
 > floating_schedule := Schedule(start, maturity, Semiannual, 'convention' = ModifiedFollowing, 'calendar' = EURIBOR);
 ${\mathrm{floating_schedule}}{:=}{\mathbf{module}}\left({}\right)\phantom{\rule[-0.0ex]{0.5em}{0.0ex}}{}\phantom{\rule[-0.0ex]{0.5em}{0.0ex}}{\mathbf{end module}}$ (13)
 > benchmark := BenchmarkRate(6, Months, EURIBOR, 0.04875825);
 ${\mathrm{benchmark}}{:=}{\mathbf{module}}\left({}\right)\phantom{\rule[-0.0ex]{0.5em}{0.0ex}}{}\phantom{\rule[-0.0ex]{0.5em}{0.0ex}}{\mathbf{end module}}$ (14)

Construct an interest rate swap receiving the fixed-rate payments in exchange for the floating-rate payments.

 > swap := InterestRateSwap(nominalamt, 0.0, fixed_schedule, benchmark, floating_schedule, 0.0);
 ${\mathrm{swap}}{:=}{\mathbf{module}}\left({}\right)\phantom{\rule[-0.0ex]{0.5em}{0.0ex}}{}\phantom{\rule[-0.0ex]{0.5em}{0.0ex}}{\mathbf{end module}}$ (15)

Compute the at-the-money rate for this interest rate swap.

 > atm_rate := FairRate(swap, discount_curve);
 ${\mathrm{atm_rate}}{≔}{0.04996048632}$ (16)

Construct three swaps.

 > itm_swap := InterestRateSwap(nominalamt, 0.8*atm_rate, fixed_schedule, benchmark, floating_schedule, 0.0);
 ${\mathrm{itm_swap}}{:=}{\mathbf{module}}\left({}\right)\phantom{\rule[-0.0ex]{0.5em}{0.0ex}}{}\phantom{\rule[-0.0ex]{0.5em}{0.0ex}}{\mathbf{end module}}$ (17)
 > atm_swap := InterestRateSwap(nominalamt, 1.0*atm_rate, fixed_schedule, benchmark, floating_schedule, 0.0);
 ${\mathrm{atm_swap}}{:=}{\mathbf{module}}\left({}\right)\phantom{\rule[-0.0ex]{0.5em}{0.0ex}}{}\phantom{\rule[-0.0ex]{0.5em}{0.0ex}}{\mathbf{end module}}$ (18)
 > otm_swap := InterestRateSwap(nominalamt, 1.2*atm_rate, fixed_schedule, benchmark, floating_schedule, 0.0);
 ${\mathrm{otm_swap}}{:=}{\mathbf{module}}\left({}\right)\phantom{\rule[-0.0ex]{0.5em}{0.0ex}}{}\phantom{\rule[-0.0ex]{0.5em}{0.0ex}}{\mathbf{end module}}$ (19)

Here are cash flows for the paying leg of our interest rate swap.

 > cash_flows := CashFlows(itm_swap, paying);
 ${\mathrm{cash_flows}}{≔}\left[{\mathrm{39.96838906 on \text{'}November 17, 2008\text{'}}}{,}{\mathrm{39.96838906 on \text{'}November 17, 2009\text{'}}}{,}{\mathrm{39.96838906 on \text{'}November 17, 2010\text{'}}}{,}{\mathrm{39.96838906 on \text{'}November 17, 2011\text{'}}}{,}{\mathrm{39.96838906 on \text{'}November 19, 2012\text{'}}}\right]$ (20)

Here are cash flows for the receiving leg of our interest rate swap.

 > CashFlows(itm_swap, receiving);
 $\left[{\mathrm{24.67872558 on \text{'}May 19, 2008\text{'}}}{,}{\mathrm{24.40119905 on \text{'}November 17, 2008\text{'}}}{,}{\mathrm{24.81751704 on \text{'}May 18, 2009\text{'}}}{,}{\mathrm{24.53995292 on \text{'}November 17, 2009\text{'}}}{,}{\mathrm{24.67872558 on \text{'}May 17, 2010\text{'}}}{,}{\mathrm{24.67872558 on \text{'}November 17, 2010\text{'}}}{,}{\mathrm{24.67872558 on \text{'}May 17, 2011\text{'}}}{,}{\mathrm{24.67872558 on \text{'}November 17, 2011\text{'}}}{,}{\mathrm{24.67872558 on \text{'}May 17, 2012\text{'}}}{,}{\mathrm{24.95632730 on \text{'}November 19, 2012\text{'}}}\right]$ (21)

These are the days when coupon payments are scheduled to occur.

 > dates := map(t -> t[date], cash_flows);
 ${\mathrm{dates}}{≔}\left[{\mathrm{date}}{,}{\mathrm{date}}{,}{\mathrm{date}}{,}{\mathrm{date}}{,}{\mathrm{date}}\right]$ (22)
 > itm_swaption := AmericanSwaption(itm_swap, AdvanceDate(start, 1, Days, EURIBOR), AdvanceDate(dates[-2], 1, Days, EURIBOR));
 ${\mathrm{itm_swaption}}{:=}{\mathbf{module}}\left({}\right)\phantom{\rule[-0.0ex]{0.5em}{0.0ex}}{}\phantom{\rule[-0.0ex]{0.5em}{0.0ex}}{\mathbf{end module}}$ (23)
 > atm_swaption := AmericanSwaption(atm_swap, AdvanceDate(start, 1, Days, EURIBOR), AdvanceDate(dates[-2], 1, Days, EURIBOR));
 ${\mathrm{atm_swaption}}{:=}{\mathbf{module}}\left({}\right)\phantom{\rule[-0.0ex]{0.5em}{0.0ex}}{}\phantom{\rule[-0.0ex]{0.5em}{0.0ex}}{\mathbf{end module}}$ (24)
 > otm_swaption := AmericanSwaption(otm_swap, AdvanceDate(start, 1, Days, EURIBOR), AdvanceDate(dates[-2], 1, Days, EURIBOR));
 ${\mathrm{otm_swaption}}{:=}{\mathbf{module}}\left({}\right)\phantom{\rule[-0.0ex]{0.5em}{0.0ex}}{}\phantom{\rule[-0.0ex]{0.5em}{0.0ex}}{\mathbf{end module}}$ (25)

Price these swaptions using the Hull-White trinomial tree.

 > a := 0.048696;
 ${a}{≔}{0.048696}$ (26)
 > sigma := 0.0058904;
 ${\mathrm{\sigma }}{≔}{0.0058904}$ (27)
 > model := HullWhiteModel(discount_curve, a, sigma);
 ${\mathrm{model}}{:=}{\mathbf{module}}\left({}\right)\phantom{\rule[-0.0ex]{0.5em}{0.0ex}}{}\phantom{\rule[-0.0ex]{0.5em}{0.0ex}}{\mathbf{end module}}$ (28)
 > time_grid := TimeGrid(YearFraction(maturity)+.5, 100);
 ${\mathrm{time_grid}}{:=}{\mathbf{module}}\left({}\right)\phantom{\rule[-0.0ex]{0.5em}{0.0ex}}{}\phantom{\rule[-0.0ex]{0.5em}{0.0ex}}{\mathbf{end module}}$ (29)
 > short_rate_tree := ShortRateTree(model, time_grid);
 ${\mathrm{short_rate_tree}}{:=}{\mathbf{module}}\left({}\right)\phantom{\rule[-0.0ex]{0.5em}{0.0ex}}{}\phantom{\rule[-0.0ex]{0.5em}{0.0ex}}{\mathbf{end module}}$ (30)

Price your swaptions using the tree constructed above.

 > LatticePrice(itm_swaption, short_rate_tree, discount_curve);
 ${54.62494411}$ (31)
 > LatticePrice(atm_swaption, short_rate_tree, discount_curve);
 ${29.46563575}$ (32)
 > LatticePrice(otm_swaption, short_rate_tree, discount_curve);
 ${15.16495357}$ (33)

Compatibility

 • The Finance[LatticePrice] command was introduced in Maple 15.