为IRS计算PFE-方案下的掉期定价问题

问题描述

我最近有一个相同的问题已解决,但我无法继续编写代码。我的最后一个问题是:Calculating the Potential Future Exposure for IR swaps in python using EONIA curve for discounting and 6M EURIBOR forward curve for pricing

我当前的问题是:由于错误,我无法在不同的模拟场景下为两个掉期的投资组合定价。最后,我要计算此投资组合的预期和未来的潜在风险。

我继续模拟路径和NPV:

volas = [ql.QuoteHandle(ql.SimpleQuote(0.0064)),ql.QuoteHandle(ql.SimpleQuote(0.0064))]
meanRev = [ql.QuoteHandle(ql.SimpleQuote(0.08))]
model = ql.Gsr(t0_curve,[today+100],volas,meanRev,16.)

process = model.stateProcess()

在建立评估网格或执行“每种情况下的掉期定价”时,都出了问题。.我的猜测是,系统无法处理我创建的Euribor 6M曲线。

# Define evaluation grid
nbr_years = 5
# date_grid = [today + ql.Period(i,ql.Weeks) for i in range(0,52 * nbr_years)]
weeks = pd.bdate_range(start=str(today),end=str(today +  ql.Period(nbr_years,ql.Years)),freq="W-Tue")## business dates 
date_grid = [ql.Date(date.day,date.month,date.year) for date in weeks]
for deal in portfolio:
date_grid += deal[1]
date_grid = np.unique(np.sort(date_grid))
time_grid = np.vectorize(lambda x: ql.ActualActual().yearFraction(today,x))(date_grid)
dt = time_grid[1:] - time_grid[:-1]
print(len(time_grid)*1000*2*29e-6)

# Random number generator
seed = 1
urng = ql.MersenneTwisterUniformRng(seed)
usrg = ql.MersenneTwisterUniformRsg(len(time_grid)-1,urng)
generator = ql.InvCumulativeMersenneTwisterGaussianRsg(usrg)

N = 1000
x = np.zeros((N,len(time_grid)))
y = np.zeros((N,len(time_grid)))
pillars = np.array([0.0,0.5,1,2,3,4,5,6,7,8,9,10])
zero_bonds = np.zeros((N,len(time_grid),12))
for j in range(12):
zero_bonds[:,j] = model.zerobond(pillars[j],0)
for n in range(0,N):
     dWs = generator.nextSequence().value()
for i in range(1,len(time_grid)):
    t0 = time_grid[i-1]
    t1 = time_grid[i]
    x[n,i] = process.expectation(t0,x[n,i-1],dt[i-1]) + dWs[i-1] * process.stdDeviation(t0,dt[i-1])

    y[n,i] = (x[n,i] - process.expectation(0,t1)) / process.stdDeviation(0,t1)
    for j in range(12):
        zero_bonds[n,i,j] = model.zerobond(t1+pillars[j],t1,y[n,i])
                                             


# plot the paths
nbr_path_to_plot = 10
for i in range(0,nbr_path_to_plot):
plt.plot(time_grid,x[i,:])     

#Swap pricing under each scenario
npv_cube = np.zeros((N,len(date_grid),len(portfolio)))
npv_cube_df = pd.DataFrame(index=np.arange(N),columns=date_grid)
for p in range(0,N):
for t in range(0,len(date_grid)):
    print(p,t)
    date = date_grid[t]
    ql.Settings.instance().setEvaluationDate(date)
    ycDates = [date,date + ql.Period(6,ql.Months)] 
    ycDates += [date + ql.Period(i,ql.Years) for i in range(1,11)]
    yc = ql.discountCurve(ycDates,zero_bonds[p,t,:],ql.Actual365Fixed())
    yc.enableExtrapolation()
    hyts.linkTo(yc)
    if euribor6m.isValidFixingDate(date):
        fixing = euribor6m.fixing(date)
        euribor6m.addFixing(date,fixing)

for i in range(len(portfolio)):
        npv_cube[p,i] = portfolio[i][0].NPV()
npv_cube_df[date_grid[t]][p] = [portfolio[i][0].NPV() for i in range(len(portfolio))] ## putting values to dataframe for export
ql.IndexManager.instance().clearHistories()
ql.Settings.instance().setEvaluationDate(today)
hyts.linkTo(yts)

我收到此错误消息:RuntimeError:99次迭代后未达到收敛;最新改进5.04917e-05,要求精度1e-12

上次@Davide Duarte的评论很有帮助,因此,如果有机会他知道这一点,我将再次感谢您的帮助!或者,如果有人知道该定价问题的解决方案,请与我分享

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)