דגימת גורמי היוון מעקומת תשואה שעברה אינטרפולציה
סיכום
המסמך מראה כיצד לקבל גורמי היוון לתאריכים שבין מועדי הפירעון המצוטטים ששימשו לבניית עקומת היוון של QuantLib. לאחר בניית עקומת היוון ליניארית בחלקים במרחב הלוגריתמי מנתוני ריבית החלף, הדוגמה יוצרת רצף תאריכים עתידיים וקוראת לכל אחד מהם למתודת ההיוון של העקומה. הערכים המתקבלים יוצרים דגימה מרווחת באופן קבוע של העקומה, שאפשר להציג לצד התאריכים.
הקוד לדוגמה דוגם במרווחים של חמש שנים, אף שהשאלה מבקשת מרווחים של חצי שנה; אותה גישה מתאימה גם לבחירת תאריכים במרווחים של שישה חודשים. תשובה נוספת מבהירה את העיקר: העקומה יכולה להחזיר גורם היוון לכל תאריך מבוקש, ולכן אין צורך להגביל את הפלט לצמתים המקוריים של העקומה. הדוגמה משתמשת בנתוני החלף סינתטיים בקרונה שוודית ומפעילה אקסטרפולציה מעבר לטנור האחרון בקלט. לכן הפלט ממחיש שימוש ב-API ולא מספק ראיות שוק, וערכי האקסטרפולציה תלויים בהנחות ובהגדרות של העקומה.
רעיונות מרכזיים
- עקומת היוון שנבנתה יכולה להחזיר גורמי היוון לתאריכים שבין צמתי הפירעון שהוזנו.
- בחרו את מרווח התאריכים הרצוי וקבלו ערך מהעקומה עבור כל תאריך.
- הדוגמה דוגמת במרווחים של חמש שנים, ואפשר ליצור דגימה חצי־שנתית באמצעות שינוי תוספת התאריך.
- גורמי היוון מעבר לצומת האחרון בעקומה עשויים להסתמך על הגדרות אקסטרפולציה, ויש לפרש אותם בהתאם.
תגיות
הטקסט המלא
# QuantLib Python - Discount Factor Interpolation within curve nodes
# QuantLib Python - Discount Factor Interpolation within curve nodes
Generated a discount curve, dCurve.PiecewiseLogLinearDiscount() using input par rate for terms (.5Y, 1Y, 2Y, 3Y, 5Y, 7Y, 10Y, 15Y, 20Y, 30Y) and output discount curve matching the input term structure. Any suggestions on how to output the discount factor curve on a .5Y interval term structure up to 30Y?
## Answer by Xiarpedia (score 1)
https://quant.stackexchange.com/a/77563
Based on your question I created the following curve example:
```
import QuantLib as ql
import pandas as pd
# Set the evaluation date
ql.Settings.instance().evaluationDate = ql.Date(30, 12, 2022)
# Declare a store variable for the helpers
helpers = []
# Create the attributes of the swap
calendar = ql.Sweden()
frequency = ql.Annual
convention = ql.ModifiedFollowing
# Synthetic market data
daycount = ql.Thirty360(ql.Thirty360.BondBasis)
index = ql.IborIndex(
"MyIndex",
ql.Period("3M"),
2,
ql.SEKCurrency(),
calendar,
ql.Following,
False,
daycount,
)
tenor = ["4Y", "5Y", "6Y", "7Y", "8Y", "9Y", "10Y", "12Y", "15Y", "20Y", "25Y", "30Y"]
quotes = [
3.33,
3.2775,
3.235,
3.205,
3.1775,
3.1525,
3.1325,
3.095,
3.0275,
2.92,
2.815,
2.6925,
]
for r, m in zip(quotes, tenor):
rate = ql.QuoteHandle(ql.SimpleQuote(r / 100.0))
tenor = ql.Period(m)
helpers.append(
ql.SwapRateHelper(
rate, tenor, calendar, frequency, convention, daycount, index
)
)
curve = ql.PiecewiseLogLinearDiscount(0, calendar, helpers, ql.Actual365Fixed())
curve.enableExtrapolation()
dates, rates = zip(*curve.nodes())
```
Which leaves me at the stage you are at. We can then interpolate on a 5 year interval as following:
```
# Interpolate on a 5Y interval
nodes = []
start_date = ql.Date(30, 12, 2022)
while True:
start_date += ql.Period("5Y")
nodes.append(start_date)
if start_date > ql.Date(30, 12, 2053):
break
discount_factors = [curve.discount(d) for d in nodes]
display(pd.DataFrame(dict({"Date": nodes, "Discount Factor": discount_factors})))
```
Which results in:
| | Date | Discount Factor |
| 0 | December 30th, 2027 | 0.851205 |
| 1 | December 30th, 2032 | 0.735589 |
| 2 | December 30th, 2037 | 0.641855 |
| 3 | December 30th, 2042 | 0.567462 |
| 4 | December 30th, 2047 | 0.508218 |
| 5 | December 30th, 2052 | 0.464726 |
| 6 | December 30th, 2057 | 0.424997 |
## Answer by Luigi Ballabio (score 0)
https://quant.stackexchange.com/a/77564
You can pass any date you like to the `discount` method of the curve you built. It will return the corresponding discount factor.מוצג במלואו בציון המקור ובהתאם לרישיון שלו. רישיון: CC BY-SA 4.0 (Stack Exchange)
הסיכום נכתב בידי סוכן המחקר של Stratmill על סמך המקור; הוא אינו העתק של המקור.