什么是FRA
FRA(Forward rate agrreement)遠期利率協議,是一種場外衍生品。FRA在0時刻確定,在未來時刻進行交易的協議。例如FRA3,6表示雙方約定在3個月后以Rk的利率水平借款3個月。
應用場景:某公司未來3個月有融資需求,借款時間為6個月,擔心未來市場利率過高,為了控制融資成本,進入了FRA將融資成本鎖定。
估值:多頭方
( R ? R k ) ? τ ? P r i n c i p a l 1 + R f ? τ \frac{(R-R_{k})*\tau*Principal}{1+R_{f}*\tau} 1+Rf??τ(R?Rk?)?τ?Principal?
舉個例子:
一個投資者進入FRA合約,約定三個月后按照3%的固定利率借入1million,假設3個月后市場利率為1%,計算該FRA的價格。
$1,000,000(0.01 ? 0.03)(0.25) = ?$5,000
注意:該價值為在t1時刻的價值,如果求0時刻價值,需要折現到0時刻。
代碼實現
仍然用到強大的QuantLib包。
ql.ForwardRateAgreement(valueDate, maturityDate, position, strikeForward, notional, iborIndex, discountCurve=ql.YieldTermStructureHandle())
構造FRA合約需要用到幾個參數
valueDate:估值日
maturityDate:到期日
position:多頭還是空頭方
strikeForward:約定未來執行利率
notional:本金
discountCurve:折現曲線,需為xxxxhandle對象
構建一個FRA3*6,當前日期為2020年6月30日,6個月后到期,固定利率為1%,結算以90天LIBOR為基礎。
import QuantLib as ql############ FRA
# 構建幾個重要時間
todayDate = ql.Date(30, 6, 2020)
ql.Settings.instance().evaluationDate = todayDate #將評估日設定為當前日期# 設定按照美國市場的時間,因為FRA一般在1年以內,所以用act/360計息
calendar = ql.UnitedStates(ql.UnitedStates.SOFR)
dayCount = ql.Actual360()
compounding = ql.Simple
compoundingFrequency = ql.Annual# 構建折現的利率曲線
spotDates = [todayDate, calendar.advance(todayDate, ql.Period(6, ql.Months)),calendar.advance(todayDate, ql.Period(12, ql.Months))]
spotRates = [0.05, 0.05, 0.05]
curve = ql.ZeroCurve(spotDates, spotRates, dayCount, calendar, ql.Linear(), ql.Compounded, ql.Semiannual)
yts = ql.YieldTermStructureHandle(curve)
index = ql.USDLibor(ql.Period('3M'), yts)# FRA估值
maturityDate = calendar.advance(todayDate, ql.Period(6, ql.Months))
FRA = ql.ForwardRateAgreement(calendar.advance(todayDate,ql.Period(3,ql.Months)), maturityDate, ql.Position.Long,0.01, 1e6, index, yts)
print(FRA.NPV())
最終得到該FRA價值為:9786
幾個注意點:
- 構建利率曲線時定義spotDates不要自己手輸時間(比如2020年6月30日,2020年9月30日,2021年6月30日),因為輸入的日期很有可能是非交易日,會報錯。應該用advance函數。
- 構建FRA函數時第一個參數估值日并非當前時間(按照上面的圖來看,不是0時刻而是t1時刻),如果輸入的是0時刻,得到的估值就是0.