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
|
from pyisda.curve import YieldCurve, BadDay, SpreadCurve
import datetime
import math
from pyisda.cdsone import upfront_charge, spread_from_upfront
from pyisda.legs import FeeLeg, ContingentLeg
from pyisda.utils import build_yc
import array
if __name__ == "__main__":
# build zero coupon curve
today_date = datetime.date(2016, 7, 12)
yc = build_yc(today_date, True)
step_in_date = today_date + datetime.timedelta(days=1)
value_date = datetime.date(2016, 7, 15) # settle_date
start_date = datetime.date(2016, 6, 20)
end_date = datetime.date(2021, 6, 20)
upfront_quote = -0.03063
spread = spread_from_upfront(today_date, value_date, start_date, step_in_date,
start_date, end_date, 0.05, yc,
upfront_quote, 0.3)
#benchmark_start_date should be start_date. Not sure while there are 2 parameters
upf = upfront_charge(today_date, value_date, start_date, step_in_date,
start_date, end_date, 0.05, yc, spread, 0.3)
print(spread)
print(upf-upfront_quote)
coupon_leg = FeeLeg(start_date, end_date, True, 1000000, 0.01)
contingent_leg = ContingentLeg(start_date, end_date, 1000000)
ig_spread = 0.0070
spread = array.array('d', [ig_spread])
recovery = array.array('d', [0.4])
upfront = array.array('d', [-0.0164243])
print("build spread curve", flush=True)
sc = SpreadCurve(today_date, yc, start_date, step_in_date, value_date,
[end_date], spread, upfront, recovery, True)
sc_data = sc.inspect()['data']
rate = sc_data[0][1]
# by default the rate is stored as annually compounded
continuous_rate = math.log(1+rate)
sc2 = SpreadCurve.from_flat_hazard(today_date, continuous_rate)
coupon_leg_pv = coupon_leg.pv(today_date, step_in_date,
value_date, yc, sc, True)
coupon_leg_pv2 = coupon_leg.pv(today_date, step_in_date,
value_date, yc, sc2, True)
print("contingent leg pv", flush=True)
contingent_leg_pv = contingent_leg.pv(today_date, step_in_date,
value_date, yc, sc, 0.4)
contingent_leg_pv2 = contingent_leg.pv(today_date, step_in_date,
value_date, yc, sc2, 0.4)
print("upfront_charge", flush=True)
pv = 1000000 * upfront_charge(today_date, value_date, start_date, step_in_date,
start_date, end_date, 0.01, yc, ig_spread, 0.4)
print(pv, contingent_leg_pv-coupon_leg_pv)
|