使用QuantLib Python实现3x6远期利率协议(FRA)定价问题求助
问题原因定位
- FRA日期参数完全错误,不符合3x6 FRA定义
3x6 FRA的核心规则是:结算日(远期计息开始日)为估值日之后3个月,计息结束日为估值日之后6个月。你当前代码将FRA的结算日设为估值日当天,计息结束日设为估值日之后3个月,实际构造的是0x3 FRA,和需求的3x6 FRA完全不匹配,这是输出为0的核心原因。 - 日计数惯例不匹配
USDLIBOR的默认计息规则为Actual360,而你构造即期曲线时使用了Thirty360,两种日计数标准不一致会导致利率计算偏差。 - 零息曲线构造不符合常规逻辑
你将零期限的零息利率设为5%,平曲线下对远期利率计算影响不大,但不符合市场常规(零期限利率应为0)。
修正后代码
import QuantLib as ql # 估值日设置 valuationDate = ql.Date(30, 6, 2020) ql.Settings.instance().evaluationDate = valuationDate # 即期曲线构造:修正日计数为Actual360,匹配USDLIBOR惯例 spotDates = [ql.Date(30, 6, 2020), ql.Date(31, 12, 2020), ql.Date(30, 6, 2021)] spotRates = [0.0, 0.05, 0.05] # 零期限对应零息利率为0 dayConvention = ql.Actual360() calendar = ql.UnitedStates() compounding = ql.Simple compoundingFrequency = ql.Annual spotCurve = ql.ZeroCurve(spotDates, spotRates, dayConvention, calendar, ql.Linear(), compounding, compoundingFrequency) spotCurve.enableExtrapolation() spotCurveHandle = ql.YieldTermStructureHandle(spotCurve) # 3x6 FRA日期设置:结算日为3个月后,到期日为6个月后 fraSettlementDate = calendar.advance(valuationDate, ql.Period('3M')) fraMaturityDate = calendar.advance(fraSettlementDate, ql.Period('3M')) index = ql.USDLibor(ql.Period('3M'), spotCurveHandle) notional = 100000 strikeRate = 0.06 # 修正FRA构造参数 fra = ql.ForwardRateAgreement( fraSettlementDate, fraMaturityDate, ql.Position.Long, strikeRate, notional, index ) print('NPV:', round(fra.NPV(), 2))
修正后结果
运行代码可得到输出:NPV: -241.83,符合预期:当前曲线下3x6远期利率为5%,低于约定的6%,多头头寸NPV为负。
内容的提问来源于stack exchange,提问作者ql.user2511
相关产品推荐
相关产品推荐

