The following notions should be described in words: zero coupon bond price, yield (curve), simple forward rate, maturity time, short rate, caplet, cap, floorlet, floor, swap, swaption, hedging strategy, binomial model (one step), Black-Scholes Delta.

The following concepts should be described in words:

Why is the fair value of a contract calculated by the value of a hedging portfolio? Describe the economic reasoning behind.

Why is the interest rate market referred to as a large financial market? Describe traded products and their structure.

Do we need to know market returns to calculate hedging strategies in the Black-Scholes or the binomial model or are fluctuation quantities like volatility enough?

The following one step binomial tree describes the evolution of the simple forward rate over one period from $ 0 $ to $ T^* = 1$ in time: we start at $4$ percent and move other to $8$ percent or $2$ percent. The simple forward is considered with $ T = 0.5 $ and $ T^* = 1 $. The zero coupon bond price for this period is $ P(0,T^*) = 0.9 $. Describe why the price of the caplet with strike value $ 0.04 $ is given by $$ \operatorname{Cplt}(0,T,T^*) = 0.9 * 0.66 . $$ What is the numeraire (benchmark) in this setting? How would a hedge look like. Instruments are the bond $ P(.,T^*) $ whose value rises deterministically from $ 0.9 $ to $ 1.0 $, and $ P(.,T^*) F(.,T,T^*) $ whose value rises from $ 0.9*0.04 $ to $ 0.08 $ or $ 0.02 $.

In [18]:

```
import numpy as np
from itertools import product
# EUROPEAN
S0 = 0.04
u = 2.
d = 0.5
payoffE = lambda S: (S >= S0)
timesteps = 1
bin = set((0,1))
trajectories = set(product(bin, repeat = timesteps))
import pygraphviz as PG
from IPython.display import Image
binomialtreeforward = PG.AGraph(directed=True, strict=True)
binomialtreeforward.edge_attr.update(len='2.0',color='blue')
binomialtreeforward.node_attr.update(color='red')
process = {(omega,0):S0 for omega in trajectories}
#construct process by forward steps
for time in range(1,timesteps+1):
for omega in trajectories:
shelper = process[(omega,time-1)]*u**(omega[time-1])*d**(1.-omega[time-1])
process.update({(omega,time):shelper})
for time in range(1,timesteps+1):
for omega in trajectories:
binomialtreeforward.add_edge('%d, %f'% (time-1,process[(omega,time-1)]),'%d, %f'% (time,process[(omega,time)]))
def condprob(omega,omegahelper,time):
if omega[0:time]==omegahelper[0:time]:
prod = 1
for i in range(time,timesteps):
prod *= ((u-1)/(u-d))**omegahelper[time]*(((1-d)/(u-d))**(1-omegahelper[time]))
return prod
else:
return 0.0
binomialtreebackward = PG.AGraph(directed=True, strict=True)
processbackward = {(omega,timesteps):(payoffE(process[(omega,timesteps)])) for omega in trajectories}
#backwardssteps: European
for time in reversed(range(1,timesteps+1)):
for omega in trajectories:
shelper=0
for omegahelper in trajectories:
shelper += processbackward[(omegahelper,time)]*condprob(omega,omegahelper,time-1)
processbackward.update({(omega,time-1):shelper})
for time in range(1,timesteps+1):
for omega in trajectories:
binomialtreebackward.add_edge('%d, %f, %f'% (time-1,process[(omega,time-1)],processbackward[(omega,time-1)]),
'%d, %f, %f'% (time,process[(omega,time)],processbackward[(omega,time)]))
Image(binomialtreeforward.draw(format='png',prog='dot'))
```

Out[18]:

In [19]:

```
Image(binomialtreebackward.draw(format='png',prog='dot'))
```

Out[19]: