问题描述
我想使用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() )