问题描述
我最近有一个相同的问题已解决,但我无法继续编写代码。我的最后一个问题是: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 (将#修改为@)