summaryrefslogtreecommitdiffstats
path: root/example.py
blob: f39571e1ae2c2f9c9a09df694a7c05768fe66742 (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
from pyisda.curve import YieldCurve, BadDay, SpreadCurve
import sys
sys.path.append("/home/share/CorpCDOs/code/python")
from yieldcurve import getMarkitIRData, YC, rate_helpers
import datetime
import array
import math
from pyisda.cdsone import upfront_charge, spread_from_upfront
from pyisda.legs import FeeLeg, ContingentLeg

if __name__ == "__main__":
    # build zero coupon curve
    markit_data = getMarkitIRData()
    yield_helpers = rate_helpers(MarkitData = markit_data)
    ql_yc = YC(MarkitData=markit_data)
    today_date = datetime.date.today()
    step_in_date = today_date + datetime.timedelta(days=1)
    value_date = datetime.date(2016, 7, 13) # settle_date
    periods, rates = zip(*markit_data['deposits'])
    periods = list(periods)
    rates = list(rates)
    periods_swaps, rates_swaps = zip(*markit_data['swaps'])
    types = 'M' * len(periods) + 'S' * len(periods_swaps)
    rates = array.array('d', rates)
    periods.extend(periods_swaps)
    rates.extend(rates_swaps)

    zc = YieldCurve(today_date, types, periods, rates, 'ACT/360', '6M',
                    '3M', '30/360', 'ACT/360', BadDay.MODIFIED)
    start_date = datetime.date(2016, 6, 20)
    end_date = datetime.date(2021, 6, 20)
    upfront_quote = -0.03063
    spread = spread_from_upfront(today_date, today_date, today_date, step_in_date,
                                 start_date, end_date, 0.05, zc,
                                 upfront_quote, 0.3)
    upf = upfront_charge(today_date, today_date, today_date, step_in_date,
                         start_date, end_date, 0.05, zc, 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)
    print(contingent_leg.pay_type)

    ig_spread = 0.0072175
    spread = array.array('d', [ig_spread])

    print("build spread curve", flush=True)
    sc = SpreadCurve(today_date, zc, today_date, step_in_date,
                     value_date,
                     [end_date], spread, 0.4, 1)
    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, zc, sc, True)
    coupon_leg_pv2 = coupon_leg.pv(today_date, step_in_date,
                                   today_date, zc, sc2, True)
    print("contingent leg pv", flush=True)
    contingent_leg_pv = contingent_leg.pv(today_date, step_in_date,
                                          value_date, zc, sc, 0.4)
    contingent_leg_pv2 = contingent_leg.pv(today_date, step_in_date,
                                           today_date, zc, sc2, 0.4)
    print("upfront_charge", flush=True)
    pv = 1000000 * upfront_charge(today_date, value_date, today_date, step_in_date,
                                  start_date, end_date, 0.01, zc, ig_spread, 0.4)

    print(pv, contingent_leg_pv-coupon_leg_pv)