使用 QuantLib 为远期利率协议定价 Python

Pricing a Forward Rate Agreement using QuantLib Python

有人可以使用 QuantLib Python 帮助确定以下远期利率协议的定价吗?

3x6远期利率协议,名义金额100,000美元,FRA利率为6%,FRA结算日为3个月(90天)后,以90天USDLIBOR结算。

我的估值日期是 2020 年 6 月 30 日。

这是我的尝试:

import QuantLib as ql

startDate = ql.Date(30, 6, 2020)
ql.Settings.instance().evaluationDate = startDate

spotDates = [ql.Date(30, 6, 2020), ql.Date(31, 12, 2020), ql.Date(30, 6, 2021)]
spotRates = [0.05, 0.05, 0.05]

dayConvention = ql.Thirty360()
calendar = ql.UnitedStates()

maturityDate = calendar.advance(startDate, ql.Period('3M'))

compounding = ql.Simple
compoundingFrequency = ql.Annual

spotCurve = ql.ZeroCurve(spotDates, spotRates, dayConvention, calendar, ql.Linear(), compounding, compoundingFrequency)
spotCurve.enableExtrapolation()
spotCurveHandle = ql.YieldTermStructureHandle(spotCurve)

index = ql.USDLibor(ql.Period('3M'), spotCurveHandle)
index.addFixing(ql.Date(26, 6, 2020), 0.05)
notional = 100000
rate = 0.06

fra = ql.ForwardRateAgreement(startDate, maturityDate, ql.Position.Long, rate, notional, index, spotCurveHandle)
print('NPV:', fra.NPV())

这是我得到的答案:

NPV: 0.0

我得到的答案不正确。

首先(为了准确性)美元 FRA 的天数是 Act/360,即 ql.Actual360()。还要记住,FRA 的固定日历是基于英国日历(BBA Libor),这可能与结算日历不同(所以 7 月 4 日不是固定假期,而是结算假期)。

OP代码的主要问题是FRA开始日期与评估日期相同。一旦你知道了固定,那么FRA就有效地解决了,所以NPV 为零,现金流为零。

ForwardRateAgreement()的第一个参数是FRA的结算日期。第二个,成熟度,是结束日期。所以对于现货 3x6,开始日期是从现在起 3 分钟,到期日是从现在起 6 分钟。

将此行修改为:

dayConvention = ql.Actual360()

fra = ql.ForwardRateAgreement(calendar.advance(startDate,ql.Period(3,ql.Months)), calendar.advance(startDate,ql.Period(6,ql.Months)), ql.Position.Long, rate, notional, index, spotCurveHandle)

将为您提供现货 3x6 FRA 的日期(20 年 9 月 30 日 -> 20 年 12 月 30 日)。

输出: NPV: -262.08622386063985

注意。在 FRA 的 QuantLib 示例中,他们使用 FRA 市场利率的选择来构建 PiecewiseLogLinearDiscount 曲线来评估 FRA,而不是零曲线,我想这是导致两者之间的细微差异远期利率(以及 NPV)的轻微变化。 FRA 的隐含远期利率为 4.937%……即不是 5%,这也增加了 NPV。实际上,如果您尝试为 FRA 定价,则使用市场 FRA 报价构建曲线。