summaryrefslogtreecommitdiffstats
path: root/example.py
blob: 6df6b55d7ffd2cb580069158f5d76a101dd34aef (plain)
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
from pyisda.curve import YieldCurve, SpreadCurve
from pyisda.date import BadDay
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)