You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 19:18:03