Model Solutions to Homework Set 2
Math 456
Topics in Financial Mathematics
Prof. Wickerhauser
Read Chapters 3 and 4 of the textbook, "Binomial Models In Finance" by
John van der Hoek and Robert J. Elliott
Do the following exercises from the textbook Chapter 3.5, pp.61--64:
Exercise 3.22.
1. If F =< S(1,down) < S(1,up), there is an arbitrage:
At t=0, buy one forward contract at F for $0
At t=1, pay $F for one share and sell it for $S(1). Keep the
difference which is nonnegative in all states and positive in the
up state.
Else if S(1,down) < S(1,up) =< F, there is another arbitrage:
At t=0, sell one forward contract at F for $0.
At t=1, buy one share for $S(1) and deliver it for $F to fulfill the
forward contract. Keep the difference which is nonnegative in
all states and positive in the down state.
Conclude by the no-arbitrage axiom that S(1,down) < F < S(1,up).
2. If F =< RC(0) < RC(0)+S(0), there is an arbitrage:
At t=0, sell one call for $C(0), invest the money risklessly, and
buy one forward contract at F for $0.
At t=1, take $RC(0) out of the bank, collect one share for $F and
either deliver it, if the call is exercised, or sell it for
$S(1) and keep the proceeds. In all cases the net payoff is
nonnegative and in some cases the net payoff is positive.
Else if RC(0) < RC(0)+S(0) =< F, there is another arbitrage:
At t=0, borrow $C(0) from the bank, buy one ATM (namely K=S(0))
call for $C(0), and sell one forward contract at F for $0.
At t=1, collect $F, exercise the call for $K=$S(0) and deliver the
share to the forward contract holder, and repay the bank loan for
$RC(0). This leaves a net profit of F-(RC(0)+S(0)) which is
nonnegative in all cases and positive in some.
Conclude by the no-arbitrage axiom that RC < F < RC+S.
3. This algebra may be done partly by Macsyma as follows:
/**********************************************************/
/* Input the three given equations: */
eq1: S^2= Su*Sd;
eq2: F=pi*Su+(1-pi)*Sd;
eq3: C=(pi/R)*(Su-S);
solve(eq1,Sd); /* Solve eq1 for Sd to get Sd= S^2/Su */
solve(eq2, pi); /* Solve eq2 for pi to get pi=-(Sd-F)/(Su-Sd) */
solve(eq3, pi); /* Solve eq3 for pi to get pi=(C*R)/(Su-S) */
/* Eliminate pi and Sd by equating the last two expressions and
substituting for Sd in terms of S and Su:
*/
eq4: R*C/(Su-S)=(F-S^2/Su)/(Su-S^2/Su);
solve(eq4,Su); /* this gives Su=-(S^2+C*R*S)/(C*R-F) which is the
same as the hint Su=S*(S+C*R)/(F-C*R) */
/* Evaluate Sd=S^2/Su using this last formula for Su: */
ev(Sd=S^2/solve(eq4,Su)); /* get Sd=[S^2/Su=-((C*R-F)*S^2)/(S^2+C*R*S)] */
/* Substitute the formula for Su in the eq3 solution formula for pi */
subst(-(S^2+C*R*S)/(C*R-F), Su, solve(eq3,pi));
/* ...to get pi=(C*R)/((-S^2-C*R*S)/(C*R-F)-S) */
/**********************************************************/
These formulas may be simplified a bit to give:
S(1,up) = Su = S*(S+C*R)/(F-C*R)
S(1,down) = Sd = S*(F-C*R) / (S+C*R)
pi = (C*R*(F-CR)) / (S*(S+2*C*R+F)
NOTE: You can copy and paste formulas from the Macsyma console and the
proper *, /, and parentheses will be included.
Exercise 3.25.
We assert the call-put parity formula
C(0)-P(0) = X(0)/Ra - K/Rd,
for foreign (a) to domestic (d) exchange-rate options. Here we mean
X(t) domestic units for one foreign unit, and K is a strike price in
domestic units per foreign unit.
For a binomial model proof, use Eq.3.10, p.49, with face value F=1:
C(0) = (pi/Rd)*[u*X(0)-K]
The corresponding formula for European Put options is
P(0) = ((1-pi)/Rd)*[K-d*X(0)]
Taking the difference gives
C(0)-P(0) = (u*pi+d*(1-pi))*X(0)/Rd - (pi+1-pi)*K/Rd
= X(0)/(Rd/(u*pi+d*(1-pi)) - K/Rd
It remains to show that
Rd/(u*pi+d*(1-pi) = Ra <==> Rd/Ra = u*pi + d*(1-pi)
<==> pi = (Rd/Ra-d)/(u-d),
after solving for pi, and this last is the definition of pi in
Eq.3.35, p.63.
For a model-independent proof, construct an arbitrage in both cases of
inequality.
If C(0)-P(0) > X(0)/Ra - K/Rd, then
C(0) - P(0) - X(0)/Ra + K/Rd > 0,
so there is the following arbitrage for face value F=1 (all quantities
are in CAD, the domestic currency):
At t=0, sell one Call, buy one Put, borrow K/Rd CAD from a Canadian
bank, and deposit 1/Ra USD in a US bank (which costs X(0)/Ra CAD
at the spot exchange rate). Pocket the positive amount left over.
At t=1, withdraw 1 USD (which includes the risk-free interest) from
the US bank. If K>X(1), the call is worth 0 (by Eq.3.9, p.48) so
it will not be exercised, but you may exercise the put to sell 1
USD for K CAD and repay the Canadian bank loan. If K 0,
so there is the following arbitrage for face value F=1 (all quantities
are in CAD, the domestic currency):
At t=0, buy one Call, sell one Put, put K/Rd CAD into a Canadian
bank, and borrow 1/Ra USD from a US bank (which nets X(0)/Ra CAD
at the spot exchange rate). Pocket the positive amount left over.
At t=1, withdraw K CAD (which includes the risk-free interest) from
the Canadian bank. If KX(1), let the call lapse, convert X(1) CAD to 1
USD at the market rate, settle the US loan for 1 USD, and cash
settle the put for K-X(1) which is its value at expiry. This
zeroes out all liabilities.
In both cases there is a type 1 arbitrage, with a positive gain in all
states. Conclude that equality must hold in the call-put parity formula.
For the example data Rd=1.004267, Ra=1.004783, K=X(0)=1.2195,
X(1,up)=1.1905, and X(1,down)=1.2821, we have
u = X(1,up)/X(0) = 0.97622
d = X(1,down)/X(0) = 1.0513
p = (Rd/Ra-d)/(u-d) = 0.69024, from Eq.3.35, p.63
1-p = 0.30976
NOTE: The risk-neutral upstate probability pi is computed from the
direct factors u and d, not their reciprocals, in Eq.3.35.
To price the at-the-money options, where K=X(0), note that the Put is
worthless in the down state KX(1,up) and worth (X(1,down)-K) in the down state, so its one-step
binomial price is
C(0) = (1-p)*(X(1,down)-K)/Rd = 0.019308, or 1.9308% of F
Check the call-put parity formula in this case:
C(0)-P(0) = -6.2361e-04
X(0)/Ra-K/Rd = -6.2361e-04
in agreement, as expected.
Exercise 3.26.
1. Let pa = p = (Rd/Ra-d)/(u-d) as in Eq.3.35, p.63, and define
pj = (Rd/Rj-dj)/(uj-dj),
where uj = J(1,up)/J(0) and dj = J(1,down)/J(0).
To price the Arrow-Debreu securities, use the formula
W(0) = (p*W(1,up)+(1-p)*W(1,down))/R
For a portfolio consisting of CAD (domestic) and USD (foreign)
currency, let Wu and Wd be the up and down Arrow-Debreu securities,
respectively. From the discussion on pp.47--48, evaluate
Wu(0) = pa/Rd, Wd(0) = (1-pa)/Rd,
where pa is the "American pi" defined by pa = (Rd/Ra-da)/(u-d).
Likewise, for a portfolio consisting of CAD (domestic) and JPY
(foreign) currency, let Zu and Zd be the up and down Arrow-Debreu
securities, respectively. From the discussion on pp.47--48, evaluate
Zu(0) = pj/Rd, Zd(0) = (1-pj)/Rd,
where pj is the "Japanese pi" defined by pj = (Rd/Rj-dj)/(uj-dj).
We claim that Wu(0)=Zu(0).
If not, then at t=0: short-sell the more expensive one and buy the
cheaper one. WOLOG, say Wu(0)>Zu(0), so sell Wu short and buy Zu.
Pocket the surplus Wu(0)-Zu(0)>0.
At expiry t=1, sell the Zu(1) and cover Wu(1). In the up state they
are both worth 1 CAD; in the down state they are both worth 0 CAD, so
this leaves no uncovered liabilities and thus constitutes a type 1
arbitrage. This proves the claim from the no-arbitrage axiom.
But then pj/Rd = Zu(0) = Wu(0) = pa/Rd. Conclude that pa=pj.
2. Given that pa=pj, set Eq.3.35, p.63 for pa equal to Eq.3.35 for pj
and solve for uj = J(1,up)/J(0) in terms of the other quantities,
which are all known. This may be done by Macsyma:
/*** Macsyma command to find JPY/CAD upfactor uj=J(1,up)/J(0) */
solve((Rd/Rj-dj)/(uj-dj) = (Rd/Ra-da)/(ua-da), uj);
/* Answer is
uj = -(da*Ra*Rd-dj*Rd*Rj+(dj*Ra*Rj-Ra*Rd)*ua)/((Rd-da*Ra)*Rj)
*/
%%%%%%%%%%%%%%%%%%%%% Octave commands to evaluate uj and J(1,up)
X0 = 1.2195; % X(0), given
X1u = 1.1905; % X(1,up), given
X1d = 1.2821; % X(1,down), given
ua = X1u/X0; da = X1d/X0; % derived up, down factors for USD vs CAD
J0 = 0.011377; % J(0), given
J1d = 0.012599; % J(1,down), given
J1u = 0.011111; % J(1,up), to be estimated
dj = J1d/J0; % derived up, down factors for JPY vs CAD
% Apply the formula obtained through Macsyma
uj = -(da*Ra*Rd-dj*Rd*Rj+(dj*Ra*Rj-Ra*Rd)*ua)/((Rd-da*Ra)*Rj)
% get uj = 0.957193945478810
% Compare given and derived values of J(1,up)
J1u % given value J(1,up) = 0.011111
uj*J0 % derived value J(1,up) = 0.0108899955177124 = 0.010890
%%%%%%%%%%%%%%%%%%%%
Note: the disagreement between the given and derived values is small
but significant. I suspect that the given value is a typographical
error.
3. The exchange rate (covered) interest rate parity formula, Eq.3.12,
p.50, is
K = X(0)*Rd/Rf,
where Rd and Rf are the domestic and foreign risk-free returns for the
given period (here 30 days, or 1/12 year), and X(0) is the spot
exchange rate, or the number of domestic currency units for one
foreign unit.
The following Octave commands compute K for various combinations of
"domestic" and "foreign":
%%%%%
dt = 1/12; % 30-day, or 1/12 year, time period
rd = 0.0512; % given CAD annual risk-free interest
ra = 0.0574; % given USD annual risk-free interest
rj = 0.0065; % given JPY annual risk-free interest
Rd = 1+rd*dt % = 1.004267 as given
Ra = 1+ra*dt % = 1.004783 as given
Rj = 1+rj*dt % = 1.000542 as given
X0 = 1.2195; % X(0), given
J0 = 0.011377 % J(0), given
Kad = X0*Rd/Ra, 1/Kad, % USD/CAD = 1.21888, CAD/USD = 0.82
Kjd = J0*Rd/Rj, 1/Kjd, % JPY/CAD = 0.011419, CAD/JPY = 87.57
Kaj = (J0/X0)*Ra/Rj, 1/Kaj % JPY/USD = 0.0093688, USD/JPY = 106.74
%%%%%
NOTE: the JPY/USD forward rate uses a computed spot price of J(0)/X(0)
which is the ratio (JPY/CAD)/(USD/CAD). Any other spot price for
JPY/USD would allow a type-1 arbitrage at t=0 involving conversion
from JPY to CAD to USD, and then immediately converting back directly
from USD to JPY.
4. In this example, the CC treasurer buys a Put option into USD with
face value 10,000,000 JPY at strike price 93,688/10,000,000 USD/JPY.
At expiry (t=1), the payoff is positive if
93,688 X(1) > 10,000,000 J(1),
for then she would profit by borrowing 10,000,000 J(1) CAD, converting
to 10,000,000 JPY, exercising the Put to obtain 93,688 USD, then
converting to 93,688 X(1) CAD to pay off the loan and keeping the
difference 93,688 X(1) - 10,000,000 J(1) > 0 CAD.
Conversely, the payoff at t=1 is negative or zero if
93,688 X(1) =< 10,000,000 J(1),
for then 10,000,000 JPY must be worth at least as much as 93,688 USD
in any currency XXX, including CAD. Prove this by assuming that
10,000,000 JPY converted to XXX is worth less than 93,688 USD in XXX.
Then there is the following arbitrage: borrow enough XXX to buy
10,000,000 JPY, exercise the Put to get 93,688 USD, then convert
from USD to XXX to pay off the loan with money left over.
Conclude that the Put option payoff at expiry is
plus( 93,688 X(1) - 10,000,000 J(1) ),
as claimed.
This option may be priced at t=0 using the binomial pricing formula
and the payoff function just computed:
P(0) = [ pi*plus(93,688 X(1,up)-10,000,000 J(1,up)) +
+ (1-pi)*plus(93,688 X(1,down)-10,000,000 J(1,down)) ]/ Rd
The following Octave commands compute P(0)= 292.56
using the given values:
%%%%%
format long % display 14 significant digits
plus = @(x) max(x,0) % positive part function
rd = 0.0512; % given CAD annual risk-free interest
Rd = 1+rd/12 % = 1.004267 as given; risk free return over dt=1/12
X0 = 1.2195; % X(0), given
X1u = 1.1905; % X(1,up), given
X1d = 1.2821; % X(1,down), given
u = X1u/X0 % up factor = 0.976219762197622
d = X1d/X0 % down factor = 1.05133251332513
J1d = 0.012599; % J(1,down), given
J1u = 0.011111; % J(1,up), as given in part 2
p = (Rd/Ra-d)/(u-d) % = 0.690403659148552, from Eq.3.35, p.63
1-p % = 0.309596340851448
plus(93688*X1u-1e7*J1u) % = 425.563999999984
plus(93688*X1d-1e7*J1d) % = 0, since 93688*X1d-1e7*J1d =-5872.6152 < 0
(p*plus(93688*X1u-1e7*J1u)+(1-p)*plus(93688*X1d-1e7*J1d))/Rd % = 292.56
%%%%%
###
###
###
Do the following exercises from the textbook Chapter 4.11, pp.78--80:
NOTE: for the following, set S(0,0)=90, r=8%=0.08, T=1, N=10, dt=0.1,
and let sigma be a parameter that varies in a neighborhood of 0.20.
Exercise 4.11.
There is an error in the original problem. The price of an
in-the-money American option cannot be less than the immediate
exercise payoff, otherwise there is an obvious arbitrage. With S=$90
and K=$100, therefore, we cannot have P(0)<$10. Fix this by using
K=$90 throughout.
Use the Octave/Matlab function "americanCallPut.m" from the website at
https://www.math.wustl.edu/~victor/classes/ma456/americanCallPut.m
Call the function in the Octave console as follows, with sigma=0.148421:
[aCa,aPu] = americanCallPut(1,90,90,0.08,0,0.148421,10)
Partial output giving C(0) and P(0) is:
aCa = 9.16293 % this is aCa(1,1) = C(0)
aPu = 3.08001 % this is aPu(1,1) = P(0)
Here T=1, S=90, K=90, r=0.08, q=0, N=10, and the value sigma=0.148421
was found by searching near the initial value 0.20 until P(0)=3.08
To get P(0)=5.00, use sigma = 0.21076:
[aCa,aPu] = americanCallPut(1,90,90,0.08,0,0.21076,10)
aCa = 11.04714 % this is aCa(1,1) = C(0)
aPu = 5.00001 % this is aPu(1,1) = P(0)
The European-style Put option prices may be computed using the
Octave/Matlab function in "europeanCallPut.m" on the class website:
https://www.math.wustl.edu/~victor/classes/ma456/europeanCallPut.m
European Put prices:
For sigma=0.148421,
[eCa,ePu] = europeanCallPut(1,90,90,0.08,0,0.148421,10) % ePu(1,1) = 2.24341
[aCa,aPu] = americanCallPut(1,90,90,0.08,0,0.148421,10) % aPu(1,1) = 3.08001
so the early exercise premium is
aPu(1,1)-ePu(1,1) %%%% = 3.0801-2.24341 = 0.83661 = $0.84
For sigma=0.21076,
[eCa,ePu] = europeanCallPut(1,90,90,0.08,0,0.21076,10) % ePu(1,1) = 4.12761
[aCa,aPu] = americanCallPut(1,90,90,0.08,0,0.21076,10) % aPu(1,1) = 5.00001
so the early exercise premium is
aPu(1,1)-ePu(1,1) %%%% = 5.00001-4.12761 = 0.87240 = $0.87
Exercise 4.12.
See the file "chooserOption.m" for an Octave/Matlab function to price
the chooser option. Use the parameters given in this exercise:
T=1, T1=0.5 (choice time, confusingly called S in the exercise),
S=90 (spot price S(0), as usual), K=90, sigma=0.20, N=10. Then the
function call is:
[W, eCa1, ePu1] = chooserOption(1, 0.5, 90, 90, 0.08, 0.20, 10)
Output is the chooser option price W(0), stored in W(1,1):
W(1,1) = 12.94785
Compare with the Call and Put option prices:
eCa1(1,1) = 10.71352
ePu1(1,1) = 3.79399
Conclude that there is a premium to be paid for the chooser option
over both the Call and Put options.
Exercise 4.14.
See the file "compoundCall.m" for an Octave/Matlab function to price
compound Call options. Use the parameters given in this exercise:
T=1, T1=0.5 (choice time, confusingly called S in the exercise),
S=90 (spot price S(0), as usual), K=90, L=4.50 sigma=0.20, N=10.
Then the function call is:
[cCall, eCa2] = compoundCall(1, 0.5, 90, 90, 4.50, 0.08, 0.20, 10)
Output is the compound Call option price W(0), stored in cCall(1,1):
cCall(1,1) = 7.14474
(The Call option price matrix Call() is also returned as outupt.)
Note that the compound Call option function is very similar to the
chooser option function. Just set all Put() prices to zero and
replace Call() with Call()-L before populating
W(T1,j)=max(C(T1,j),P(T1,j).
It may be easy to reuse a spreadsheet with these changes, but in
Octave/Matlab it is easier just to write a new function.
Exercise 4.16.
See the file "binaryCallPut.m" for an Octave/Matlab function to price
binary Calls and Puts with various values of T,S,K,B,r,sigma, and N.
Note that buying one binary Call and one binary Put guarantees a
payoff of B at time T. Therefore to avoid an arbitrage, the sum of
the prices must be the present value of B:
C(0) + P(0) = B*exp(-r*T)
Solve this to get P(0) = B*exp(-r*T) -C(0), the value of the binary Put
option in terms of the binary Call option.
Exercise 4.17.
See the file "fwdstartCallPut.m" for an Octave/Matlab function to price
forward start Calls and Puts.
Apply the function with the parameters T=1, S=90, M=3, r=0.08,
sigma=0.25, and N=10 to get:
[fsCa, fsPu] = fwdstartCallPut(1, 90, 3, 0.08, 0.25, 10)
% fsCa = 10.23562 ...
% fsPu = 5.33415 ...
Algorithm (for Calls):
Compute the stock prices S(M,j), j=0,...,M, at time M.
For j=0:M, find the value CMj=Call(M,j) at time M in state j of the
vanilla European Call option with expiry N and strike price
K=S(M,j), purchased at t=0.
Initialize fsCall(n,j) of depth M with prices CMj at its bottom nodes
(n=M, states j=0:M), then compute fsCall(0,0) by backwardization.
[[Algorithm for Puts is the same, with each "Call" replaced by "Put".]]
Note that CMj is the value at time M, state j, of the forward start
Call option we are pricing. Thus the algorithm uses the binomial
pricing model for this option starting with its values at the time M
when they are known in each state.
Alternatively, CMj may be computed as the price at t=0 of an
at-the-money European Call option for a stock with initial price
S(M,j), so K=S(M,j) as well, and expiry N-M. This exposes the
relation between fsCall and fsPut:
fsCall(M,j)-fsPut(M,j) = CMj-PMj = C(0)-P(0) = S(0)-K/R0 =
= S(M,j)-S(M,j)/R0 = S(M,j)*(1-1/R0),
using the call-put parity formula of textbook section 2.5, p.27,
applied to the at-the-money options C() and P(). Here R0 is the
riskless return over the subperiod M to N for period N, which is
R0 = exp(r*(N-M)/N)
Thus the asset W=fsCall-fsPut has the same price at (M,j), j=0:M, as
the stock S times the constant factor (1-1/R0). Conclude that
fsCall(0)-fsPut(0) = W(0) = S(0)(1-1/R0)
In our example we have:
M=3; N=10; r=0.08; R0 = exp(r*(N-M)/N) % R0 = 1.0576
S0 = 90; S0*(1-1/R0) % ans = 4.9015
and also
[fsCa, fsPu] = fwdstartCallPut(1, 90, 3, 0.08, 0.25, 10);
fsCa(1,1)-fsPu(1,1) % ans = 4.9015
as claimed.