Contracts Library

Contract Types

Full Script

import QuantLib as ql from enum import StrEnum class DayCounts(StrEnum): Actual360="Actual360" ActualActualISDA="ActualActualISDA" ActualActualISMA="ActualActualISMA" ActualActualAFB="ActualActualAFB" Thirty360USA="Thirty360.USA" Thirty360European="Thirty360European" Thirty360Italian="Thirty360Italian" Actual365Fixed="Actual365Fixed" Actual365FixedNoLeap="Actual365FixedNoLeap" Simple="Simple" class Convention(StrEnum): Following="Following" ModifiedFollowing="ModifiedFollowing" Preceding="Preceding" Unadjusted="Unadjusted" class Frequency(StrEnum): Once="Once" Annual="Annual" Semiannual="Semiannual" Quarterly="Quarterly" Bimonthly="Bimonthly" Monthly="Monthly" NoFrequency="NoFrequency" class DateRoll(StrEnum): Backward="Backward" #ql.DateGeneration.Backward Forward="Forward" class Calendar(StrEnum): Japan="Japan" #ql.Japan() Euro="Euro" #ql.TARGET() USNyse="USNyse" #ql.UnitedStates(ql.UnitedStates.NYSE) USGovernmentBond="USGovernmentBond" #ql.UnitedStates(ql.UnitedStates.GovernmentBond) UnitedKingdom="UnitedKingdom" #ql.UnitedKingdom() def schedule(start_date, end_date, frequency, calendar, convention, dateroll): if convention == Convention.Following:convention = ql.Following elif convention == Convention.ModifiedFollowing:convention = ql.ModifiedFollowing elif convention == Convention.Preceding:convention = ql.Preceding elif convention == Convention.Unadjusted:convention = ql.Unadjusted if dateroll == DateRoll.Backward : dateroll = ql.DateGeneration.Backward elif dateroll == DateRoll.Forward : dateroll = ql.DateGeneration.Forward if calendar == Calendar.Japan:calendar = ql.Japan() elif calendar == Calendar.Euro:calendar = ql.TARGET() elif calendar == Calendar.USNyse:calendar = ql.UnitedStates(ql.UnitedStates.NYSE) elif calendar == Calendar.USGovernmentBond:calendar = ql.UnitedStates(ql.UnitedStates.GovernmentBond) elif calendar == Calendar.UnitedKingdom:calendar = ql.UnitedKingdom() if frequency == Frequency.Annual:frequency = ql.Annual elif frequency == Frequency.Bimonthly:frequency = ql.Bimonthly elif frequency == Frequency.Monthly:frequency = ql.Monthly elif frequency == Frequency.NoFrequency:frequency = ql.NoFrequency elif frequency == Frequency.Once:frequency = ql.Once elif frequency == Frequency.Quarterly:frequency = ql.Quarterly elif frequency == Frequency.Semiannual:frequency = ql.Semiannual start_date = ql.Date(int(start_date.split('-')[2]),int(start_date.split('-')[1]),int(start_date.split('-')[0])) end_date = ql.Date(int(end_date.split('-')[2]),int(end_date.split('-')[1]),int(end_date.split('-')[0])) return ql.MakeSchedule( effectiveDate=start_date, terminationDate=end_date, frequency=frequency, calendar=calendar, convention=convention, backwards=dateroll ) class DayCounts(StrEnum): Actual360="Actual360" ActualActualISDA="ActualActualISDA" ActualActualISMA="ActualActualISMA" ActualActualAFB="ActualActualAFB" Thirty360USA="Thirty360.USA" Thirty360European="Thirty360European" Thirty360Italian="Thirty360Italian" Actual365Fixed="Actual365Fixed" Actual365FixedNoLeap="Actual365FixedNoLeap" Simple="Simple" def fixed_rate_bond(settlement_days=2, face_amount=100, coupons = [0.05], day_count=DayCounts.Actual360, schedule=None ): if not isinstance(coupons, list): coupons = [coupons] if day_count == DayCounts.Actual360: day_count = ql.Actual360() elif day_count == DayCounts.ActualActualISDA: day_count = ql.ActualActual(ql.ActualActual.ISDA) elif day_count == DayCounts.ActualActualISMA: day_count = ql.ActualActual(ql.ActualActual.ISMA) elif day_count == DayCounts.ActualActualAFB: day_count = ql.ActualActual(ql.ActualActual.AFB) elif day_count == DayCounts.Thirty360USA: day_count = ql.Thirty360(ql.Thirty360.USA) elif day_count == DayCounts.Thirty360European: day_count = ql.Thirty360(ql.Thirty360.European) elif day_count == DayCounts.Thirty360Italian: day_count = ql.Thirty360(ql.Thirty360.Italian) elif day_count == DayCounts.Actual365Fixed: day_count = ql.Actual365Fixed() elif day_count == DayCounts.Actual365FixedNoLeap: day_count = ql.Actual365Fixed(ql.Actual365Fixed.NoLeap) elif day_count == DayCounts.Simple: day_count = ql.Simple() bond = ql.FixedRateBond( settlement_days, face_amount, schedule, coupons, day_count ) return bond