|
From: philippe h. <pha...@ma...> - 2020-07-14 08:17:31
|
Perfect, thank you. Regards Philippe Hatstadt +1-203-252-0408 pha...@ma... https://www.linkedin.com/in/philippe-hatstadt > On Jul 14, 2020, at 3:17 AM, Luigi Ballabio <lui...@gm...> wrote: > > > If you create your index as: > > RelinkableHandle<YieldTermStructure> forecastHandle; > forecastHandle.linkTo(originalCurve); > ext::shared_ptr<IborIndex> index = ext::make_shared<Euribor6M>(forecastHandle) // for instance: works with any floating index > > or the equivalent in Python: > > forecastHandle = RelinkableYieldTermStructureHandle() > forecastHandle.linkTo(originalCurve) > index = Euribor6M(forecastHandle) > > then, when you link the handle to a different curve with > > forecastHandle.linkTo(newCurve); > > the index will start using the new one for forecasting. If you used the index to build a swap, the swap will start using the new curve too. > > Luigi > > >> On Tue, Jul 14, 2020 at 2:30 AM Philippe Hatstadt <phi...@ex...> wrote: >> I think I know what is wrong. I do not set the floating rate index to be generated from each Hull-White curve but from the original curve, that has positive rates. >> So the question simply is this: Is there a way to change the curve used to generate the floating index in a swap, or is the only way to re-instantiate a new swap based on an index pointing to my path-dependent curve? >> I'd rather change the index and keep the same instance of my swap, but maybe that's not possible? Stated differently, is there the equivalent of a pricing engine for the floating index forecasting? >> >> Regards >> >> Philippe >> >> >>> On Mon, Jul 13, 2020 at 5:56 AM Amine Ifri <ami...@gm...> wrote: >>> I use the C++ library and never had an issue with swap.fairRate(). It gives me positive as well as negative values depending on the term structures. >>> >>> As far as checking the CPP code, it looks correct to me. Do you mind sharing the swap details you are trying to price/simulate? >>> >>> Amine >>> >>>> On 12 Jul 2020, at 03:02, Philippe Hatstadt <phi...@ex...> wrote: >>>> >>>> I'm using a Hull-White model to generate forward paths of the short rate, from which I then build a discounting curve, from which I compute forward swap values towards Monte-carlo integration of certain path dependent swap rate linked derivatives. Here, I am looking at a 2y into 10y swaption, and for each path, I want to calculate the forward swap rate and the swap NPV. >>>> My problem is that I have a curve that has negative rates on a certain path, the 2y into 10y forward swap.fairRate() function returns like 94bp. Since all rates are negative, it's pretty clear that fairRate() should be negative, and if I use the curve's discount factors and use the good old approximation for the swap rate with the formula C/2 * Sum_i(FixedLegDiscountFactor(i))/(1-DiscountFactor(TMat)) then I get the correct -250bp forward swap rate (where i=1 to 20 corresponding to 20 forward semi-annual fixed payments). >>>> So I am wondering if the swap cash flows do not work with negative rates or else, but as it stands right now, the swap.fairRate() function doesn't work at all. I also checked that by solving for the fixed rate that would make the swap net cash-flows to be equal to zero, then I get the value returned by swap.fairRate(). This would further indicate that the latter function is correct, but that the cash flows are not. lastly, whether I select a path with positive or negative forward rates, the cf.amount() is always positive. >>>> This is the code I use to generate the cash-flows: >>>> def swap_cash_flows(swap: ql.Swap, >>>> crvh, >>>> ): >>>> output_list = [] >>>> for i, cf in enumerate(swap.leg(0)): >>>> dt = cf.date() >>>> dfact = crvh.discount(dt) >>>> output_list.append(['leg0', cf.date(), dfact, cf.amount()]) >>>> for i, cf in enumerate(swap.leg(1)): >>>> dt = cf.date() >>>> dfact = crvh.discount(dt) >>>> output_list.append(['leg1', cf.date(), dfact, cf.amount()]) >>>> df1 = pd.DataFrame(columns=['leg', 'cf_date', 'disc_fact', 'cf_amount'], data=output_list) >>>> return df1 >>>> The short-rate path corresponding to the curve handle crvh is as follows: >>>> <image.png> >>>> and lastly, this is the table of cash flows, dates and discount factors: >>>> leg cf_date disc_fact cf_amount >>>> leg0 2023-01-11 1.031727084 0.004717496 >>>> leg0 2023-07-11 1.044326706 0.004640581 >>>> leg0 2024-01-11 1.056475309 0.004717496 >>>> leg0 2024-07-11 1.067323978 0.004666219 >>>> leg0 2025-01-13 1.080208917 0.004768773 >>>> leg0 2025-07-11 1.095773345 0.004589303 >>>> leg0 2026-01-12 1.107358267 0.004743135 >>>> leg0 2026-07-13 1.119706713 0.004666219 >>>> leg0 2027-01-11 1.134937064 0.004666219 >>>> leg0 2027-07-12 1.148588556 0.004666219 >>>> leg0 2028-01-11 1.164662739 0.004691858 >>>> leg0 2028-07-11 1.184811281 0.004666219 >>>> leg0 2029-01-11 1.202933688 0.004717496 >>>> leg0 2029-07-11 1.22143445 0.004640581 >>>> leg0 2030-01-11 1.244698418 0.004717496 >>>> leg0 2030-07-11 1.268437607 0.004640581 >>>> leg0 2031-01-13 1.289269217 0.004768773 >>>> leg0 2031-07-11 1.310335034 0.004589303 >>>> leg0 2032-01-12 1.330460609 0.004743135 >>>> leg0 2032-07-12 1.351119197 0.004666219 >>>> leg1 2022-10-11 1.025077227 0.000595151 >>>> leg1 2023-01-11 1.031727084 0.000595151 >>>> leg1 2023-04-11 1.037740592 0.000582209 >>>> leg1 2023-07-11 1.044326706 0.00058868 >>>> leg1 2023-10-11 1.050712784 0.001151809 >>>> leg1 2024-01-11 1.056475309 0.001190658 >>>> leg1 2024-04-11 1.062040699 0.001177708 >>>> leg1 2024-07-11 1.067323978 0.001177708 >>>> leg1 2024-10-11 1.073341181 0.001190658 >>>> leg1 2025-01-13 1.080208917 0.001216557 >>>> leg1 2025-04-11 1.087963402 0.00113886 >>>> leg1 2025-07-11 1.095773345 0.001322081 >>>> leg1 2025-10-14 1.102080743 0.002477114 >>>> leg1 2026-01-12 1.107358267 0.002346587 >>>> leg1 2026-04-13 1.112978456 0.002372691 >>>> leg1 2026-07-13 1.119706713 0.002372691 >>>> leg1 2026-10-13 1.127732208 0.002398796 >>>> leg1 2027-01-11 1.134937064 0.002346587 >>>> leg1 2027-04-12 1.141923849 0.002372691 >>>> leg1 2027-07-12 1.148588556 0.002390753 >>>> leg1 2027-10-12 1.155929127 0.002537285 >>>> leg1 2028-01-11 1.164662739 0.002509671 >>>> leg1 2028-04-11 1.174741361 0.002509671 >>>> leg1 2028-07-11 1.184811281 0.002509671 >>>> leg1 2028-10-11 1.194083437 0.002537285 >>>> leg1 2029-01-11 1.202933688 0.002537285 >>>> leg1 2029-04-11 1.211815927 0.002482058 >>>> leg1 2029-07-11 1.22143445 0.002509671 >>>> leg1 2029-10-11 1.232822712 0.002537285 >>>> leg1 2030-01-11 1.244698418 0.002537285 >>>> leg1 2030-04-11 1.256926582 0.002482058 >>>> leg1 2030-07-11 1.268437607 0.003472659 >>>> leg1 2030-10-11 1.278474854 0.004092082 >>>> leg1 2031-01-13 1.289269217 0.004181226 >>>> leg1 2031-04-11 1.299839855 0.003914165 >>>> leg1 2031-07-11 1.310335034 0.004047153 >>>> leg1 2031-10-14 1.320633529 0.004225801 >>>> leg1 2032-01-12 1.330460609 0.004002946 >>>> leg1 2032-04-12 1.340898895 0.004047513 >>>> leg1 2032-07-12 1.351119197 0.004047513 >>>> Regards >>>> >>>> Philippe >>>> >>>> >>>> >>>> Brokerage services offered through Exos Securities LLC, member of SIPC / FINRA. For important disclosures, click here. >>>> _______________________________________________ >>>> QuantLib-users mailing list >>>> Qua...@li... >>>> https://lists.sourceforge.net/lists/listinfo/quantlib-users >>> >> >> >> >> Brokerage services offered through Exos Securities LLC, member of SIPC / FINRA. For important disclosures, click here. >> _______________________________________________ >> QuantLib-users mailing list >> Qua...@li... >> https://lists.sourceforge.net/lists/listinfo/quantlib-users |