forked from domokane/FinancePy
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtest_FinIborCapVolCurve.py
64 lines (51 loc) · 2.18 KB
/
test_FinIborCapVolCurve.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
###############################################################################
# Copyright (C) 2018, 2019, 2020 Dominic O'Kane
###############################################################################
from financepy.market.volatility.ibor_cap_vol_curve import IborCapVolCurve
from financepy.utils.date import Date
from financepy.utils.day_count import DayCountTypes
import numpy as np
def test_FinCapVolCurve():
# Reproduces example in Table 32.1 of Hull Book
value_dt = Date(1, 1, 2020)
capVolDates = []
capletVolTenor = "1Y"
num_periods = 10
capletDt = value_dt
capVolDates.append(value_dt)
for i in range(0, num_periods):
capletDt = capletDt.add_tenor(capletVolTenor)
capVolDates.append(capletDt)
capVolatilities = [0.0, 15.50, 18.25, 17.91, 17.74, 17.27,
16.79, 16.30, 16.01, 15.76, 15.54]
capVolatilities = np.array(capVolatilities)/100.0
day_count_type = DayCountTypes.ACT_ACT_ISDA
volCurve = IborCapVolCurve(value_dt,
capVolDates,
capVolatilities,
day_count_type)
dt = Date(1, 1, 2020)
capFloorVol = volCurve.cap_vol(dt)
capFloorLetVol = volCurve.caplet_vol(dt)
assert round(capFloorVol * 100.0, 2) == 15.5
assert round(capFloorLetVol * 100.0, 2) == 15.5
dt = Date(1, 1, 2022)
capFloorVol = volCurve.cap_vol(dt)
capFloorLetVol = volCurve.caplet_vol(dt)
assert round(capFloorVol * 100.0, 2) == 18.25
assert round(capFloorLetVol * 100.0, 2) == 20.64
dt = Date(1, 1, 2024)
capFloorVol = volCurve.cap_vol(dt)
capFloorLetVol = volCurve.caplet_vol(dt)
assert round(capFloorVol * 100.0, 2) == 17.740
assert round(capFloorLetVol * 100.0, 2) == 17.22
dt = Date(1, 1, 2026)
capFloorVol = volCurve.cap_vol(dt)
capFloorLetVol = volCurve.caplet_vol(dt)
assert round(capFloorVol * 100.0, 2) == 16.790
assert round(capFloorLetVol * 100.0, 2) == 14.15
dt = Date(1, 1, 2028)
capFloorVol = volCurve.cap_vol(dt)
capFloorLetVol = volCurve.caplet_vol(dt)
assert round(capFloorVol * 100.0, 2) == 16.010
assert round(capFloorLetVol * 100.0, 2) == 13.81