diff options
Diffstat (limited to 'python/test_option.py')
| -rw-r--r-- | python/test_option.py | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/python/test_option.py b/python/test_option.py new file mode 100644 index 00000000..7f53d959 --- /dev/null +++ b/python/test_option.py @@ -0,0 +1,98 @@ +from pyisda.curve import YieldCurve, BadDay, SpreadCurve +from pyisda.utils import build_yc +from pyisda.cdsone import upfront_charge +from pyisda.legs import ContingentLeg, FeeLeg +from quantlib.settings import Settings +from quantlib.time.api import ( + Date, today, Period, Years, WeekendsOnly, Quarterly, CDS, Actual360, + ModifiedFollowing ) +from quantlib.quotes import SimpleQuote +from quantlib.termstructures.credit.api import SpreadCdsHelper +from quantlib.pricingengines.credit.isda_cds_engine import IsdaCdsEngine +import datetime +import array +import math +import numpy as np +import pandas as pd +from db import dbengine +from yieldcurve import YC + +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') + return df + +def test_sc(df): + tenors = [Period(3, Years), Period(5, Years), Period(7, Years), Period(10, Years)] + quotes = [SimpleQuote()]*3 + helpers = [SpreadCdsHelper(q, t, 1, WeekendsOnly(), Quarterly, + ModifiedFollowing, CDS, Actual360(), 0.4, + lastperiod = Actual360(True)) + for q, t in zip(quotes, tenors)] + pdc = PiecewiseCreditDefaultCurve( + for r in df.itertuples(index=False, name = None): + quotes[0].value = v[1] + quotes[1].value = v[2] + quotes[2].value = v[3] + quotes[3].value = v[4] + + +def FEP(sc, recovery): + pass + +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) + + dc = YC() + isda_engine = "po" + value_date = trade_date + yc = build_yc(trade_date, True) + spread = 0.007 + spread = array.array('d', [spread]) + value_date = datetime.date(2016, 7, 29) + step_in_date = trade_date + datetime.timedelta(days=1) + sc = SpreadCurve(trade_date, yc, start_date, step_in_date, + value_date, [term_date], spread, 0.4, True) + sc_data = sc.inspect()['data'] + hazard_rate = math.log(1 + sc_data[0][1]) + expiration_date = datetime.date(2016, 9, 21) + fee_leg = FeeLeg(start_date, term_date, True, 1, 1) + default_leg = ContingentLeg(start_date, term_date, 1) + fee_leg_expiry = FeeLeg(start_date, expiration_date, True, 1, 1) + default_leg_expiry = ContingentLeg(start_date, expiration_date, 1) + + fee_leg_pv = fee_leg.pv(trade_date, step_in_date, trade_date, + yc, sc, True) + default_leg_pv = default_leg.pv(trade_date, step_in_date, trade_date, + yc, sc, 0.4) + V1 = default_leg_pv - fee_leg_pv + + fee_leg_expiry_pv = fee_leg_expiry.pv(trade_date, step_in_date, trade_date, + yc, sc, True) + default_leg_expiry_pv = default_leg_expiry.pv(trade_date, step_in_date, trade_date, + yc, sc, 0.4) + V2 = default_leg_expiry_pv - fee_leg_expiry_pv + + forward_annuity = fee_leg.pv(trade_date, expiration_date+datetime.timedelta(days=1), trade_date, + yc, sc, True) + exercise_settlement = datetime.date(2016, 9, 25) + print((0.007-0.01) * forward_annuity) + + forward_price = forward_annuity*(0.007-0.01) / ( + yc.discount_factor(exercise_settlement)*math.exp(-hazard_rate * (expiration_date-trade_date).days/365 + )) + print(fee_leg.pv(trade_date, step_in_date, trade_date, + yc, sc, True)) + + print(fee_leg.pv(trade_date, expiration_date + datetime.timedelta(days=1), trade_date, + yc, sc, True)) |
