使用EONIA曲线进行折现和6M EURIBOR远期曲线进行定价,计算python中IR掉期的潜在未来风险敞口 1 PFE示例 2交换价格

问题描述

我想使用2条曲线来计算两个掉期的投资组合的潜在未来暴露(PFE)-EURIBOR 6M为浮动边定价,而EONIA曲线为掉期固定边折现。我使用Quantlib Python Cookbook构建了两条曲线,对于掉期定价和PFE计算器,我想使用以下示例:(https://ipythonquant.wordpress.com/2015/04/08/expected-exposure-and-pfe-simulation-with-quantlib-and-python/)。我的问题是,在此示例中,他们使用一条曲线进行折价和远期交易,这是从一种汇率计算得出的(这并不现实)。我可以构建收益曲线,但不能将两个示例放在一起以使代码正常工作。 (请帮助我,论文工作的最后期限快到了!)我对可以解决此问题的任何其他代码解决方案感兴趣。这是我的代码

! pip install QuantLib-Python

# import the used libraries
%%capture
%pylab inline --no-import-all
import math
import utils
import datetime as dt
import pandas  as pd
#utils.set_default_plot_size()
import QuantLib as ql

from QuantLib import *

today = Date(8,September,2020)
Settings.instance().evaluationDate = today

eonia = Eonia()
helpers = [ OISRateHelper(2,Period(*tenor),QuoteHandle(SimpleQuote(rate/100)),eonia)
for rate,tenor in [(-0.468,(1,Days)),(-0.470000013709068,Weeks)),(-0.473499998450279,(2,(-0.476999998092651,Months)),(-0.478000000119209,(-0.480000004172325,(3,(-0.483400002121925,(4,(-0.486249998211861,(5,(-0.488499999046326,(6,(-0.493000000715256,(7,(-0.497000008821487,(8,(-0.500199988484383,(9,(-0.504599988460541,(10,(-0.50874999165535,(11,(-0.512099981307983,(12,(-0.531000018119812,(18,(-0.541999995708465,Years)),(-0.546999990940093,(30,(-0.550999999046326,(-0.544999986886978,(-0.527999997138977,(-0.49499998986721,(-0.459999993443489,(-0.417999997735023,(-0.373999997973442,(-0.326999992132187,(-0.277999997138977,(-0.236000001430512,(-0.123999997973442,(15,(-0.0370000004768372,(20,(-0.0330000007525086,(25,(-0.0490000005811453,(-0.0710000023245811,(35,(-0.0889999493956566,(40,(-0.128000002354383,(50,Years))] ]

eonia_curve_c = PiecewiseLogCubicdiscount(0,TARGET(),helpers,Actual360())
eonia_curve_c.enableExtrapolation()

helpers = [ DepositRateHelper(QuoteHandle(SimpleQuote(-0.459/100)),Period(6,Months),3,Following,False,Actual360()) ]
euribor6m = Euribor6M()

此外,这是什么问题??

helpers += [ FrarateHelper(QuoteHandle(SimpleQuote(rate/100)),start,euribor6m)
for rate,start in [(-0.43818798661232,7),(-0.442768007516861,8),(-0.440380990505219,9),(-0.437555998563766,10),(-0.445408999919891,11),(-0.452802002429962,12),(-0.453942000865936,13),(-0.450417011976242,14),(-0.466143995523453,15),(-0.450170010328293,16),(-0.,452068001031876,17),(-0.468688994646072,18)] ]

(它说出太多无法解包的值)

discount_curve = RelinkableYieldTermStructureHandle()
discount_curve.linkTo(eonia_curve)

helpers += [ SwapRateHelper(QuoteHandle(SimpleQuote(rate/100)),Period(tenor,Years),Annual,Unadjusted,Thirty360(Thirty360.BondBasis),euribor6m,QuoteHandle(),Period(0,Days),discount_curve)for rate,tenor in [(-0.471998006105423,2),(-0.4668410122394563,3),(-0.448518991470337,4),(-0.419505000114441,5),(-0.386981993913651,6),(-0.345064997673035,(-0.301272988319397,(-0.259175002574921,(-0.206983998417854,(-0.164517998695374,(-0.123749002814293,(-0.0165138002485037,(0.0642198026180267,20),(0.0658923983573914,25),(0.0394961982965469,30),(-0.0109016001224518,40),(-0.0604206994175911,50)] ]

euribor6m_curve = PiecewiseLogCubicdiscount(2,Actual365Fixed())
euribor6m_curve.enableExtrapolation()

然后,我想将此曲线添加到以下代码中:https://ipythonquant.wordpress.com/2015/04/08/expected-exposure-and-pfe-simulation-with-quantlib-and-python/ 要替换它:

# Setup Marketdata
rate = ql.SimpleQuote(0.0536)
rate_handle = ql.QuoteHandle(rate)
dc = ql.Actual365Fixed()
yts = ql.FlatForward(today,rate_handle,dc)
yts.enableExtrapolation()
hyts = ql.RelinkableYieldTermStructureHandle(yts)
t0_curve = ql.YieldTermStructureHandle(yts)
euribor6m = ql.Euribor6M(hyts)

然后使用这些曲线对掉期进行定价。 如果您知道此问题的解决方案,请与我分享!或任何建议,我如何用两条自举曲线为互换定价。谢谢

解决方法

您实际上在这里有两个问题:

1。 PFE示例

首先,您无法为FraRateHelper提取数据的原因是其中一个元素中有一个多余的逗号。注意这里的类型使特定的元组具有3个元素而不是2个元素:

(-0.,452068001031876,17)

然后,替换下面的代码(在其中创建平坦曲线的位置):

rate = ql.SimpleQuote(0.0536)
rate_handle = ql.QuoteHandle(rate)
dc = ql.Actual365Fixed()
yts = ql.FlatForward(today,rate_handle,dc)
yts.enableExtrapolation()

有...

yts = euribor6m_curve

并且您应该很好地使用您提到的示例。

2。交换价格

现在要进行两条曲线的价格互换,其思想是对指数使用远期曲线:

euribor6m = ql.Euribor6M(hyts)

,然后是引擎的折扣曲线:

engine = ql.DiscountingSwapEngine(discount_curve)
swap.setPricingEngine(engine)
print( swap.NPV() )
print( swap.fairRate() )