diff options
Diffstat (limited to 'python/tests/test_upfront_cds.py')
| -rw-r--r-- | python/tests/test_upfront_cds.py | 189 |
1 files changed, 144 insertions, 45 deletions
diff --git a/python/tests/test_upfront_cds.py b/python/tests/test_upfront_cds.py index b9fd4beb..66a2f122 100644 --- a/python/tests/test_upfront_cds.py +++ b/python/tests/test_upfront_cds.py @@ -1,15 +1,37 @@ -from quantlib.time.api import (WeekendsOnly, today, Years, Months, - Period, Date, Actual365Fixed, Actual360, - Quarterly, Following, Unadjusted, Schedule, - pydate_from_qldate, Rule) +from quantlib.time.api import ( + WeekendsOnly, + today, + Years, + Months, + Period, + Date, + Actual365Fixed, + Actual360, + Quarterly, + Following, + Unadjusted, + Schedule, + pydate_from_qldate, + Rule, +) from quantlib.instruments.api import CreditDefaultSwap, Side from quantlib.pricingengines.credit.isda_cds_engine import ( - IsdaCdsEngine, ForwardsInCouponPeriod, NumericalFix, AccrualBias) -from quantlib.termstructures.default_term_structure import DefaultProbabilityTermStructure + IsdaCdsEngine, + ForwardsInCouponPeriod, + NumericalFix, + AccrualBias, +) +from quantlib.termstructures.default_term_structure import ( + DefaultProbabilityTermStructure, +) from quantlib.termstructures.credit.api import ( - UpfrontCdsHelper, SpreadCdsHelper, PiecewiseDefaultCurve, FlatHazardRate) + UpfrontCdsHelper, + SpreadCdsHelper, + PiecewiseDefaultCurve, + FlatHazardRate, +) from quantlib.settings import Settings -from yieldcurve import YC, rate_helpers, getMarkitIRData +from serenitas.analytics.yieldcurve import YC, rate_helpers, getMarkitIRData import pandas as pd from pyisda.curve import YieldCurve, SpreadCurve from pyisda.utils import build_yc @@ -20,42 +42,91 @@ import array import math import numpy as np + def snac_pv(spread, term_date, fixed_coupon=0.01, recovery=0.4, ts=YC()): settings = Settings() calendar = WeekendsOnly() - cds_helper = SpreadCdsHelper(spread, Period(57, Months), 1, calendar, - Quarterly, Following, Rule.CDS, Actual360(), recovery, ts, - lastperiod = Actual360(True)) - cds_helper.set_isda_engine_parameters(int(NumericalFix.Taylor), int(AccrualBias.HalfDayBias), - int(ForwardsInCouponPeriod.Flat)) - pdc = PiecewiseDefaultCurve("SurvivalProbability", "LogLinear", - settings.evaluation_date, [cds_helper], Actual365Fixed()) - isda_pricer = IsdaCdsEngine(pdc, recovery, ts, False, - forwards_in_coupon_period=ForwardsInCouponPeriod.Piecewise, - accrual_bias=AccrualBias.HalfDayBias) + cds_helper = SpreadCdsHelper( + spread, + Period(57, Months), + 1, + calendar, + Quarterly, + Following, + Rule.CDS, + Actual360(), + recovery, + ts, + lastperiod=Actual360(True), + ) + cds_helper.set_isda_engine_parameters( + int(NumericalFix.Taylor), + int(AccrualBias.HalfDayBias), + int(ForwardsInCouponPeriod.Flat), + ) + pdc = PiecewiseDefaultCurve( + "SurvivalProbability", + "LogLinear", + settings.evaluation_date, + [cds_helper], + Actual365Fixed(), + ) + isda_pricer = IsdaCdsEngine( + pdc, + recovery, + ts, + False, + forwards_in_coupon_period=ForwardsInCouponPeriod.Piecewise, + accrual_bias=AccrualBias.HalfDayBias, + ) protect_start = settings.evaluation_date + 1 - cds_schedule = Schedule(protect_start, term_date, Period(Quarterly), calendar, - Following, Unadjusted, Rule.CDS) - cds_trade = CreditDefaultSwap(BUYER, 100, fixed_coupon, cds_schedule, Following, Actual360(), - protection_start = protect_start, - last_period_day_counter = Actual360(True)) + cds_schedule = Schedule( + protect_start, + term_date, + Period(Quarterly), + calendar, + Following, + Unadjusted, + Rule.CDS, + ) + cds_trade = CreditDefaultSwap( + BUYER, + 100, + fixed_coupon, + cds_schedule, + Following, + Actual360(), + protection_start=protect_start, + last_period_day_counter=Actual360(True), + ) cds_trade.set_pricing_engine(isda_pricer) return cds_trade, cds_helper, isda_pricer + def jpmorgan_curves(trade_date, value_date, start_date, end_date, spread, recovery=0.4): yc = build_yc(trade_date, True) step_in_date = trade_date + datetime.timedelta(days=1) - spread = array.array('d', [spread]) - recovery = array.array('d', [recovery]) - sc = SpreadCurve(trade_date, yc, start_date, step_in_date, - value_date, [end_date], spread, recovery, True) + spread = array.array("d", [spread]) + recovery = array.array("d", [recovery]) + sc = SpreadCurve( + trade_date, + yc, + start_date, + step_in_date, + value_date, + [end_date], + spread, + recovery, + True, + ) return yc, sc -if __name__=="__main__": + +if __name__ == "__main__": settings = Settings() settings.evaluation_date = Date(21, 5, 2009) yield_helpers = rate_helpers() - ts = YC(helpers = yield_helpers) + ts = YC(helpers=yield_helpers) tenor = Period(5, Years) trade_date = datetime.date(2009, 5, 21) stepin_date = trade_date + datetime.timedelta(days=1) @@ -63,34 +134,62 @@ if __name__=="__main__": term_date = datetime.date(2019, 6, 20) start_date = datetime.date(2009, 3, 20) spread = 0.001 - yc, sc = jpmorgan_curves(trade_date, value_date, start_date, term_date, spread, recovery = 0.4) - sc_data = sc.inspect()['data'] + yc, sc = jpmorgan_curves( + trade_date, value_date, start_date, term_date, spread, recovery=0.4 + ) + sc_data = sc.inspect()["data"] hazard_rate = math.log(1 + sc_data[0][1]) contingent_leg = ContingentLeg(start_date, term_date, 10000000) fee_leg = FeeLeg(start_date, term_date, True, 10000000, 0.01) flat_curve = FlatHazardRate(0, WeekendsOnly(), hazard_rate, Actual365Fixed()) - cds_schedule = Schedule(Date.from_datetime(trade_date), Date.from_datetime(term_date), - Period(Quarterly), WeekendsOnly(), - Following, Unadjusted, CDS) - cds_trade = CreditDefaultSwap.from_upfront(BUYER, 10000000, 0., 0.01, cds_schedule, Following, Actual360(), - protection_start = Date.from_datetime(trade_date) + 1, - last_period_day_counter = Actual360(True)) - isda_pricer = IsdaCdsEngine(flat_curve, 0.4, ts, accrual_bias=AccrualBias.HalfDayBias, - forwards_in_coupon_period = ForwardsInCouponPeriod.Piecewise) - #795915.9787 + cds_schedule = Schedule( + Date.from_datetime(trade_date), + Date.from_datetime(term_date), + Period(Quarterly), + WeekendsOnly(), + Following, + Unadjusted, + CDS, + ) + cds_trade = CreditDefaultSwap.from_upfront( + BUYER, + 10000000, + 0.0, + 0.01, + cds_schedule, + Following, + Actual360(), + protection_start=Date.from_datetime(trade_date) + 1, + last_period_day_counter=Actual360(True), + ) + isda_pricer = IsdaCdsEngine( + flat_curve, + 0.4, + ts, + accrual_bias=AccrualBias.HalfDayBias, + forwards_in_coupon_period=ForwardsInCouponPeriod.Piecewise, + ) + # 795915.9787 cds_trade.set_pricing_engine(isda_pricer) - cds_trade2 = CreditDefaultSwap(BUYER, 10000000, spread, cds_schedule, Following, Actual360(), - protection_start = Date.from_datetime(trade_date) + 1, - last_period_day_counter = Actual360(True)) - #h = cds_trade2.implied_hazard_rate(0., ts) + cds_trade2 = CreditDefaultSwap( + BUYER, + 10000000, + spread, + cds_schedule, + Following, + Actual360(), + protection_start=Date.from_datetime(trade_date) + 1, + last_period_day_counter=Actual360(True), + ) + # h = cds_trade2.implied_hazard_rate(0., ts) h = 0.00168276528775 flat_curve2 = FlatHazardRate(0, WeekendsOnly(), h, Actual365Fixed()) isda_pricer2 = IsdaCdsEngine(flat_curve2, 0.4, ts) cds_trade.set_pricing_engine(isda_pricer2) print(cds_trade.fair_upfront) - #hazard_rate = 0.12649393489974806 + # hazard_rate = 0.12649393489974806 # cds_trade.set_pricing_engine(isda_pricer) # cds_trade2 = CreditDefaultSwap.from_upfront(BUYER, 10000000, 0., 0.01, cds_schedule, |
