vocus logo

方格子 vocus

QuantLib Python聊聊(四) : 關於物件OvernightIndexedCoupon

更新 發佈閱讀 18 分鐘

前言

在使用 QuantLib Python建構與定價以隔夜利率為基礎的衍生性金融商品(如 SOFR Swap、ESTR Swap)時,OvernightIndexedCoupon 是一個核心元件。本篇文章將深入解析該物件的設計概念、計算邏輯、內建的定價器(Pricer),以及實務應用上的注意事項。

raw-image

什麼是 OvernightIndexedCoupon?

OvernightIndexedCoupon 是一種以每日隔夜利率累積計息的計算利息工具,其常見應用包括:

  • SOFR、ESTR、TONA、SARON 等隔夜利率互換交易(OIS)中的浮動端現金流
  • 資金調度中的浮動利息計算

建構參數簡介

在 QuantLib Python中建構 OvernightIndexedCoupon 時,基本語法如下:

ql.OvernightIndexedCoupon(
paymentDate, # 利息支付日
nominal, # 名目本金
startDate, # 計息起日
endDate, # 計息終日
overnightIndex, # 隔夜利率指標(如 ql.Sofr())
gearing=1.0,
spread=0.0,
refPeriodStart=ql.Date(),
refPeriodEnd=ql.Date(),
dayCounter=ql.Actual360(),
telescopicValueDates=False, # 開啟效能優化與否
averagingMethod=ql.OvernightIndexedCoupon.Compound,
lookbackDays=0,
lockoutDays=0,
applyObservationShift=False
)

無需手動設定Pricer()

IborCoupon 不同,OvernightIndexedCoupon 在建構時會自動綁定對應的 Pricer,根據選定的 averaging method:

raw-image

因此,除非是要自定義Pricer,一般情況下不需要手動設定 .setPricer()

關於參數telescopicValueDates

在處理每日複利(daily compounding)的 OIS 產品(如 SOFR、FedFunds、SARON 等)時,OvernightIndexedCoupon 需要展開整個利率期間的每日值以計算複利,這在期數很長或大量 instrument 並行計算時會造成效能瓶頸。為了解決這個問題,QuantLib 提供了telescopicValueDates 參數。當設定為 True 時,QuantLib 不會逐日展開所有值,而是利用演算法僅保留必要的日期節點來進行複利計算,以提升計算速度同時保留計算精準度。

底下為QuantLib針對這一參數的描述說明:

telescopicValueDates optimizes the schedule for calculation speed, but might fail to produce correct results if the coupon ages by more than a grace period of 7 days. It is therefore recommended not to set this flag to true unless you know exactly what you are doing. The intended use is rather by the OISRateHelper which is safe, since it reinitialises the instrument each time the evaluation date changes.


計息方式:Compound vs Simple

QuantLib Python支援兩種計息邏輯:

Compounded Averaging Rate

raw-image

Simple Averaging Rate

raw-image

其中:

raw-image

QuantLib Python 範例

底下以SOFR為例,計算2025/3/4至2025/4/1這段區間的Compounded rate以及利息。首先初始SOFR interest rate index物件,以及給定每日fixing rate。

ref_date = ql.Date(4, 3, 2025)
# create SOFR Index and link to dummy term structure (flat curve)
sofr_curve = ql.FlatForward(ref_date, 0.0, ql.Actual365Fixed())
sofr_termStrcuture = ql.YieldTermStructureHandle(sofr_curve)
sofr_index = ql.Sofr(sofr_termStrcuture)
calendar = ql.UnitedStates(ql.UnitedStates.GovernmentBond)

# assuming data period is 2025/3/4 ~ 2025/3/31
start_date = ql.Date(4, 3, 2025)
end_date = ql.Date(1, 4, 2025)
# <https://www.newyorkfed.org/markets/reference-rates/sofr>
sofr_rates = [(ql.Date(31,3,2025),4.41),
(ql.Date(28,3,2025),4.34),
(ql.Date(27,3,2025),4.36),
(ql.Date(26,3,2025),4.35),
(ql.Date(25,3,2025),4.33),
(ql.Date(24,3,2025),4.31),
(ql.Date(21,3,2025),4.3),
(ql.Date(20,3,2025),4.29),
(ql.Date(19,3,2025),4.29),
(ql.Date(18,3,2025),4.31),
(ql.Date(17,3,2025),4.32),
(ql.Date(14,3,2025),4.3),
(ql.Date(13,3,2025),4.3),
(ql.Date(12,3,2025),4.31),
(ql.Date(11,3,2025),4.32),
(ql.Date(10,3,2025),4.33),
(ql.Date(7,3,2025),4.34),
(ql.Date(6,3,2025),4.35),
(ql.Date(5,3,2025),4.34),
(ql.Date(4,3,2025),4.33)]

# add daily USD/SOFR fixing rate
for s_rate in sofr_rates:
sofr_index.addFixing(s_rate[0], s_rate[1]/100.0)

利用類別 OvernightIndexedCoupon直接自動計算 SOFR 的浮動利息與複利利率(compounded averaging rate):

# OvernightIndexedCoupon with compounding averaging rate method
coupon_comp = ql.OvernightIndexedCoupon(
paymentDate=end_date,
nominal=1000000.0,
startDate=start_date,
endDate=end_date,
overnightIndex=sofr_index,
gearing=1.0,
spread=0.0,
dayCounter=ql.Actual360(),
averagingMethod = ql.RateAveraging.Compound
)

# calculate compouned interest and rate
payment_amount = coupon_comp.amount()
compounded_rate = coupon_comp.rate()

print(f"SOFR Compounded Rate: {compounded_rate:.6%}")
print(f"Accrued Interest: USD {payment_amount:,.2f}")
SOFR Compounded Rate: 4.331441%
Accrued Interest: USD 3,368.90

同樣的當我們想要計算的是採用Simple averaging方法時,則我們可在物件生成時,指定averagingMethod = ql.RateAveraging.Simple即可。

# OvernightIndexedCoupon with simple averaging rate method
coupon_simple = ql.OvernightIndexedCoupon(
paymentDate=end_date,
nominal=1000000.0,
startDate=start_date,
endDate=end_date,
overnightIndex=sofr_index,
gearing=1.0,
spread=0.0,
dayCounter=ql.Actual360(),
averagingMethod = ql.RateAveraging.Simple
)

# calculate compouned interest and rate
payment_amount = coupon_simple.amount()
compounded_rate = coupon_simple.rate()

print(f"SOFR Compounded Rate: {compounded_rate:.6%}")
print(f"Accrued Interest: USD {payment_amount:,.2f}")
SOFR Compounded Rate: 4.324643%
Accrued Interest: USD 3,363.61

Lag Publication

實務上,SOFR等RFRs 具有「T+1 延遲公布」的特性,這對於實際計算 Compounded Rate和付款利息時,有顯著影響。因此市場上(特別是 ISDA、ARRC 等)發展了幾種主流的處理方式。整理如下:

RFRs延遲發布特性與處理策略

raw-image

類別 OvernightIndexedCoupon 已經可以支援:

  • Lookback Days
  • With or Without Observation Shift

假設我們要計算的SOFR浮動利息是Lookback 5天以及考慮Observation Shift時(即計息區間變為2025/2/25~2025/3/25),可以將這兩參數直接在生成OvernightIndexedCoupon給定,示範程式如下:

# add additional SOFR rates for 5 days lookback
sofr_rates_add = [(ql.Date(3,3,2025),4.33),
(ql.Date(28,2,2025),4.39),
(ql.Date(27,2,2025),4.36),
(ql.Date(26,2,2025),4.33),
(ql.Date(25,2,2025),4.33)]

for s_rate in sofr_rates_add:
sofr_index.addFixing(s_rate[0], s_rate[1]/100.0)

# define Lookback and Observation Shift
lookback_days = 5
use_observation_shift = True # else False,just Lookback, didn't shift observation dates

coupon_obs_shift = ql.OvernightIndexedCoupon(
paymentDate=end_date,
nominal=notional,
startDate=start_date,
endDate=end_date,
overnightIndex=sofr_index,
gearing=1.0,
spread=0.0,
refPeriodStart=ql.Date(),
refPeriodEnd=ql.Date(),
dayCounter=ql.Actual360(),
lookbackDays=lookback_days,
telescopicValueDates=False,
applyObservationShift=use_observation_shift
)

# output result
print(f"SOFR Compounded Rate with Lookback {lookback_days} days "
f"({'with shift' if use_observation_shift else 'no shift'}): "
f"{coupon_obs_shift.rate():.6%}")
print(f"Accrued Interest: USD {coupon_obs_shift.amount():,.2f}")
SOFR Compounded Rate with Lookback 5 days (with shift): 4.333231%
Accrued Interest: USD 3,370.29

結語

OvernightIndexedCoupon 是 QuantLib 中計算每日隔夜利息的核心元件。預設使用複利方式計息,並自動附帶對應 pricer。適合用於 SOFR、ESTR等OIS 交易的定價與風險評估。同時我們也提及在目前RFRs發佈上具有延遲一天的特性,因此真正在計算compounded averaging rate時,需考量Lookback days以及Observation shift等交易條件。


如果你覺得這篇文章有幫助,或是有什麼想法想交流,歡迎留言或私訊我,一起討論~接下來我還會陸續更新這個 QuantLib Python 的系列,對金融(財務)工程實務有興趣的朋友可以追蹤關注一下。謝謝你的閱讀!

參考資料

  1. Ballabio, Luigi. Implementing QuantLib. Online resource
  2. Goutham Balaraman, Luigi Ballabio. QuantLib Python Cookbook. Leanpub, 2020. https://leanpub.com/quantlibpythoncookbook
  3. https://www.newyorkfed.org/medialibrary/Microsites/arrc/files/2021/users-guide-to-sofr2021-update.pdf
  4. https://www.newyorkfed.org/markets/reference-rates/additional-information-about-reference-rates#tgcr_bgcr_sofr_calculation_methodology







留言
avatar-img
Quantivor
2會員
10內容數
在金融市場中,從外匯、利率交換、選擇權,到複雜結構型商品,每一種商品背後,都仰賴嚴謹的模型運算與穩定的計算工具。QuantLib 作為一套專為金融商品設計的開源程式庫,提供了從定價模型、利率與波動率曲線到風險分析的完整能力,讓理論走向實務。透過這裡跟大家分享如何使用QuantLib-Python這強大的工具。
Quantivor的其他內容
2025/05/04
浮動利率利息(Floating Rate Interest)往往是根據某種銀行間拆款(Interbank Bank Offering Rate, IBOR) 指標利率(如過往的USD LIBOR、TAIBOR)來決定。QuantLib 提供的 IborCoupon物件能幫助我們迅速計算出浮動利息。
Thumbnail
2025/05/04
浮動利率利息(Floating Rate Interest)往往是根據某種銀行間拆款(Interbank Bank Offering Rate, IBOR) 指標利率(如過往的USD LIBOR、TAIBOR)來決定。QuantLib 提供的 IborCoupon物件能幫助我們迅速計算出浮動利息。
Thumbnail
2025/04/27
在金融市場中,利率無所不在,從存放款利率、債券殖利率到衍生性金融商品定價,無不與「時間價值」息息相關。隨著全球轉向無風險利率(RFRs)作為新一代定價基準,如SOFR(美國)、ESTR(歐元區)、TONA(日本)等,這篇文章帶你認識這些新的利率指標與QuantLib Python中的應用。
Thumbnail
2025/04/27
在金融市場中,利率無所不在,從存放款利率、債券殖利率到衍生性金融商品定價,無不與「時間價值」息息相關。隨著全球轉向無風險利率(RFRs)作為新一代定價基準,如SOFR(美國)、ESTR(歐元區)、TONA(日本)等,這篇文章帶你認識這些新的利率指標與QuantLib Python中的應用。
Thumbnail
2025/04/27
在使用 QuantLib Python建構金融商品或是利率衍生商品現金流時,Date、Calendar 與 Schedule 是最基本且重要的元件。這些元件看似簡單,實際上在處理金融市場中的現金流日期展開邏輯扮演著重要的角色。了解這些基礎物件的運作將有助於後續對這程式庫的學習。
Thumbnail
2025/04/27
在使用 QuantLib Python建構金融商品或是利率衍生商品現金流時,Date、Calendar 與 Schedule 是最基本且重要的元件。這些元件看似簡單,實際上在處理金融市場中的現金流日期展開邏輯扮演著重要的角色。了解這些基礎物件的運作將有助於後續對這程式庫的學習。
Thumbnail
看更多
你可能也想看
Thumbnail
創作不只是個人戰,在 vocus ,也可以是一場集體冒險、組隊升級。最具代表性的創作者社群「vocus 野格團」,現在有了更強大的新夥伴加入!除了大家熟悉的「官方主題沙龍」,這次我們徵召了 8 位領域各異的「個人主題專家」,將再度嘗試創作的各種可能,和格友們激發出更多未知的火花。
Thumbnail
創作不只是個人戰,在 vocus ,也可以是一場集體冒險、組隊升級。最具代表性的創作者社群「vocus 野格團」,現在有了更強大的新夥伴加入!除了大家熟悉的「官方主題沙龍」,這次我們徵召了 8 位領域各異的「個人主題專家」,將再度嘗試創作的各種可能,和格友們激發出更多未知的火花。
Thumbnail
看完上篇 4 位新成員的靈魂拷問,是不是意猶未盡?別急,野格團新血的驚喜正接著登場!今天下篇接力的另外 4 位「個人主題專家」,戰力同樣驚人──領域從旅行美食、運動、商業投資到自我成長;這些人如何維持長跑般的創作動力?在爆紅的文章背後,又藏著哪些不為人知的洞察?5 大靈魂拷問繼續出擊
Thumbnail
看完上篇 4 位新成員的靈魂拷問,是不是意猶未盡?別急,野格團新血的驚喜正接著登場!今天下篇接力的另外 4 位「個人主題專家」,戰力同樣驚人──領域從旅行美食、運動、商業投資到自我成長;這些人如何維持長跑般的創作動力?在爆紅的文章背後,又藏著哪些不為人知的洞察?5 大靈魂拷問繼續出擊
Thumbnail
在使用 QuantLib Python建構金融商品或是利率衍生商品現金流時,Date、Calendar 與 Schedule 是最基本且重要的元件。這些元件看似簡單,實際上在處理金融市場中的現金流日期展開邏輯扮演著重要的角色。了解這些基礎物件的運作將有助於後續對這程式庫的學習。
Thumbnail
在使用 QuantLib Python建構金融商品或是利率衍生商品現金流時,Date、Calendar 與 Schedule 是最基本且重要的元件。這些元件看似簡單,實際上在處理金融市場中的現金流日期展開邏輯扮演著重要的角色。了解這些基礎物件的運作將有助於後續對這程式庫的學習。
Thumbnail
「價值投資」專欄每月分享至少 4 篇文章介紹優質公司,內容並未對證券價值進行分析,還請各位依據自身狀況作出交易決策。專欄訂閱費用每月 99元,歡迎訂閱支持我。 每年 $999 訂閱方案 價值投資 - 基本面研究 X 法人最新財測的方案|方格子 vocus 每月 $99 訂閱方案 價值投資 - 基
Thumbnail
「價值投資」專欄每月分享至少 4 篇文章介紹優質公司,內容並未對證券價值進行分析,還請各位依據自身狀況作出交易決策。專欄訂閱費用每月 99元,歡迎訂閱支持我。 每年 $999 訂閱方案 價值投資 - 基本面研究 X 法人最新財測的方案|方格子 vocus 每月 $99 訂閱方案 價值投資 - 基
Thumbnail
本週內容:(1)投資懷抱夢想並不愚蠢、(2)單筆投資0050最後會把股票賣光嗎、(3)你可以選擇慢慢變富、(4)主人遛狗的各種發想、(5)公債還得起才有價值、(6)營建股合約負債觀察與選股邏輯、(7)第八波信用管制?、(8)潛力股資訊總整理、(9)潛力股追蹤:八方雲集、材料-KY、迅得、威宏-KY
Thumbnail
本週內容:(1)投資懷抱夢想並不愚蠢、(2)單筆投資0050最後會把股票賣光嗎、(3)你可以選擇慢慢變富、(4)主人遛狗的各種發想、(5)公債還得起才有價值、(6)營建股合約負債觀察與選股邏輯、(7)第八波信用管制?、(8)潛力股資訊總整理、(9)潛力股追蹤:八方雲集、材料-KY、迅得、威宏-KY
Thumbnail
最近趁著閒暇之餘想要學習Python,上了幾堂課後,突然想活用一下Python來解決生活上的財務小問題,試了一下後還真的可行,就讓我們來看看怎麼做吧!附帶一提非常推薦LearnPyhon.com的學習資源,會一步一步的帶你學習創作自己的Code,對文組初學者來說非常的好上手。
Thumbnail
最近趁著閒暇之餘想要學習Python,上了幾堂課後,突然想活用一下Python來解決生活上的財務小問題,試了一下後還真的可行,就讓我們來看看怎麼做吧!附帶一提非常推薦LearnPyhon.com的學習資源,會一步一步的帶你學習創作自己的Code,對文組初學者來說非常的好上手。
Thumbnail
哈囉。 歡迎,來到股市收心操。
Thumbnail
哈囉。 歡迎,來到股市收心操。
Thumbnail
 大家好。很高興在這個新的部落格上面。有機會能再跟大家一起討論交易的兩三事。未來我們將在這個新的地方上面;與大家一步一步地,建立起屬於我們自己個性化的量化交易平臺;敬請期待。
Thumbnail
 大家好。很高興在這個新的部落格上面。有機會能再跟大家一起討論交易的兩三事。未來我們將在這個新的地方上面;與大家一步一步地,建立起屬於我們自己個性化的量化交易平臺;敬請期待。
Thumbnail
3分鐘學會用python計算加權指數報酬率,並且用pandas 進行條件篩選 濾掉金融海嘯時期,並篩選出漲跌幅大於1%的日期 https://youtu.be/EMfclSESgBo
Thumbnail
3分鐘學會用python計算加權指數報酬率,並且用pandas 進行條件篩選 濾掉金融海嘯時期,並篩選出漲跌幅大於1%的日期 https://youtu.be/EMfclSESgBo
Thumbnail
Python- 1.flash - render_template\ session\ Flask\ redirect\ request 2.HTML - head\ body\ from\ button\ input\ 公司會計帳 股票- 參照財報狗教你挖好股穩賺20% 獲利性分析(done
Thumbnail
Python- 1.flash - render_template\ session\ Flask\ redirect\ request 2.HTML - head\ body\ from\ button\ input\ 公司會計帳 股票- 參照財報狗教你挖好股穩賺20% 獲利性分析(done
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News