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