|
From: Amine I. <ami...@gm...> - 2020-07-13 09:56:50
|
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 <http://www.sipc.org/> / FINRA <http://www.finra.org/>. For important disclosures, click here <https://www.exosfinancial.com/disclosures>. > _______________________________________________ > QuantLib-users mailing list > Qua...@li... > https://lists.sourceforge.net/lists/listinfo/quantlib-users |