Exam questions

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]: