aboutsummaryrefslogtreecommitdiffstats
path: root/python/test_option.py
blob: daa52d8168eef55c931dfdd89abbd377cd0f633e (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
from pyisda.utils import build_yc

from quantlib.settings import Settings
from quantlib.time.api import (
    Date, today, Period, Years, WeekendsOnly, Quarterly, CDS, Actual360,
    ModifiedFollowing, Actual365Fixed, Months)
from quantlib.quotes import SimpleQuote
from quantlib.termstructures.credit.api import (
    SpreadCdsHelper, Interpolator, ProbabilityTrait, PiecewiseDefaultCurve )
from quantlib.termstructures.yields.api import YieldTermStructure, DepositRateHelper
from quantlib.pricingengines.credit.isda_cds_engine import IsdaCdsEngine
import datetime
import math
import numpy as np
import pandas as pd
from pandas.tseries.offsets import BusinessDay as BDay
from db import dbengine
from yieldcurve import YC
from swaption import Index

def get_spread(index, series):
    engine = dbengine("serenitasdb")
    df = pd.read_sql("SELECT date, tenor, closespread FROM index_quotes WHERE " \
                     "index = %(index)s and series = %(series)s",
                     engine,
                     params = {"index": index, "series": series},
                     parse_dates=['date'],
                     index_col = ['date', 'tenor'])
    df = df.unstack('tenor')
    df.columns = ['spread_' + c for c in df.columns.levels[1]]
    return df[['spread_3yr', 'spread_5yr', 'spread_7yr', 'spread_10yr']]

def test_sc(df):
    settings = Settings()
    settings.evaluation_date = today()
    tenors = [Period(3, Years), Period(5, Years), Period(7, Years), Period(10, Years)]
    quotes = []
    for i in range(4):
        quotes.append(SimpleQuote())
    yts = YieldTermStructure()
    helpers = [SpreadCdsHelper(q, t, 1, WeekendsOnly(), Quarterly,
                               ModifiedFollowing, CDS, Actual360(), 0.4,
                               discount_curve = yts,
                               lastperiod = Actual360(True))
               for q, t in zip(quotes, tenors)]
    pdc = PiecewiseDefaultCurve(ProbabilityTrait.SurvivalProbability,
                                Interpolator.LogLinear,
                                0, WeekendsOnly(), helpers, Actual365Fixed())
    ts = YC()
    yts.link_to(ts)
    for r in df.itertuples(index=True, name = None):
        settings.evaluation_date = Date.from_datetime(r[0])
        ts = YC()
        yts.link_to(ts)
        for i in range(4):
            quotes[i].value = r[i+1] *1e-4
        print(pdc.dates)
        print(pdc.data)


if __name__ == "__main__":
    settings = Settings()
    trade_date = datetime.date.today()
    settings.evaluation_date = today()
    start_date = datetime.date(2016, 6, 20)
    term_date = datetime.date(2021, 6, 20)
    recovery = 0.4
    fixed_rate = 0.01
    ig26 = Index(start_date, term_date, recovery, fixed_rate)
    yc = build_yc(trade_date, True)
    exercise_date = datetime.date(2016, 10, 19)
    exercise_date_settle = pd.Timestamp(exercise_date + 3* BDay()).date()
    spread  = np.array([65, 70, 72.5, 75, 77.5, 80, 85, 90, 95, 100, 110, 120, 130, 140])
    tailprob = np.array([64.2, 51.7, 45.8, 40.2, 35, 30.4, 23.2, 18, 14.3, 11.6, 7.9, 5.6, 4.1, 3])
    cumprob = 1-tailprob/100
    hist = cumprob/spread
    hist = np.hstack((0, hist))