I am using QLXL I compiled from QuantLib 1.2.1. I am running it on a machine with Windows 7 Ultimate & SP1. I am trying to confirm that some basic calculations make sense before generating results to use as the basis for another line of analysis. I want to thank Jean-Mattieu and Senevi for their thread, and pursue a line of inquiry on Duration and Convexity using Senevi’s sample security. In using Senevi’s terms and conditions, including the move to “Unadjusted” for BDC, I get the yield he sourced from Bloomberg (to 6 digits), without creating a new compounding convention. That said, I admire the thoroughness displayed in creating the smarter input, and wonder if/how I might be able to implement such a change with QLXL as part of a function, so I will still be able to match the market yield as the bonds I analyze get closer to maturity without having to rely on a VBA if/then. Nonetheless, I do not see the SimpleThenCompounded convention made available through the interface, so perhaps the question is moot. I get the Macaulay duration and convexity values from QLXL Senevi shows as his outputs, which do not match the Bloomberg values. It is interesting to note that the built-in Excel Macaulay duration function does match the Bloomberg values to 3 digits: B’berg Macaulay Dur’n 1.928 Excel Macaulay Dur’n 1.9275741842 QLXL Macaulay Dur’n from yld 1.9129221698 QLXL Modified Dur’n from yld 1.91003 Effective duration, from bumping the yield up + down 5 bps, recalculating the bond prices and dividing the difference in the prices by 0.1 = 1.923. While it may be that there is a problem applying the appropriate discounting factors in calculating the QuantLib duration, these outputs seem to show that the QuantLib output to be overly discounted, not under-discounted. I did some fiddling along the same line with convexity from yield. I get an effective convexity measure from the changes in QLXL Macaulay duration at the price points resulting from the yield bumping process which is not too far off from the B’berg result previously sited by Senevi: Bloomberg cvx: 0.047 “effective” cvx: 0.0471389 QLXL cvx: 4.6061 The QLXL convexity number does not tie out with the other two, but if derived from an interim QL duration result, that is not a huge surprise. I would appreciate any tips to overcome these relatively small frustrations. Would compiling QLXL 1.3 bring me closer to reliable outputs for these basic calculations? -Nick From: Senevi J Kankanamge Don [mailto:[hidden email]] Hi, Thanks for your response. We compare true yield in BBG. As you said, I had to set BusinessDayConvention paymentConvention = Unadjusted to avoid discrepancies. Ultimately we implemented a new method isSettlementLastCouponPeriod() in ql/instruments/bonds/fixedratebond.hpp which returns whether the settlement falls into the last coupon period or not. Then we did… bool bIsSettlementLastCouponPeriod = bond.isSettlementLastCouponPeriod(settlementDate); Compounding compoundingMethod = bIsSettlementLastCouponPeriod ? SimpleThenCompounded : Compounded; Real ql_clean_price = BondFunctions::cleanPrice( bond, ql_yield, bondDayCount, compoundingMethod, frequency, settlementDate); Now QuantLib yield match 100% with Bloomberg. Duration and convexity don’t match with Bloomberg. It appears that QuantLib doesn’t take the weight of present values into account in computing these two figures whereas Bloomberg does. Thanks -Senevi From: Jean-Mathieu Vermosen [[hidden email]] Hey there, Which yield are you comparing to in BBG ? Treasury yield convention doesn’t adjust payments for holidays, so make sure that BusinessDayConvention paymentConvention = ModifiedFollowing; you passed to the FixedRateBond constructor is not creating discrepancies in the cash-flow table (Just checked the code, it’s used in FixedRateLeg class for cash-flow generation). Otherwise you would prefer to compare to the true yield under the YA screen (after turning the flag to Following: ModifiedFollowing is for the swap guy). The duration/convexity figures looks quite far from there target. As far as I remember Bloomberg is not adjusting for convention across bonds of different setup (except for the frequency in some screens). Then it might requires further investigation or to contact our friends from the hep desk to check the convention behind... Best, Jean-Mathieu Vermosen On Nov 4, 2013, at 10:25 AM, Senevi J Kankanamge Don <[hidden email]> wrote: Hi, I am attempting to use QuantLib library in order to calculate yield, Macaulay duration and convexity for US Treasury Notes and Bonds. This is how the values compare in Bloomberg and QuantLib for one example where the price is 99.8984375. Bloomberg QuantLib Yield 0.302775 0.3027679582 Macaulay Duration 1.928 1.9129221698 Convexity 0.047 0.0460608896 Can you please let me know what I need to change in my code in order to get the results matching with Bloomberg? This is a snippet of my code. double ql_price = 99.8984375; Date settlementDate = Date(25, Oct, 2013); Date firstCouponDate = Date(31, Mar, 2014); Date datedDate = Date(30, Sep, 2013); Date maturityDate = Date(30, Sep, 2015); // // Parameters required to define the bond // Natural settlementDays = 0; Real faceAmount = 100; DayCounter bondDayCount = ActualActual(ActualActual::Bond); BusinessDayConvention paymentConvention = ModifiedFollowing; Real redemption = 100.0; Compounding compoundingMethod = SimpleThenCompounded; DateGeneration::Rule dateGeneration = DateGeneration::Forward; Frequency frequency = Semiannual; Real accuracy = 1.0e-11; Size maxEvaluations = 100; // // Create the Schedule // Schedule fixedBondSchedule( datedDate, // Dated Date maturityDate, // Maturity Date Period(Semiannual), // Period UnitedStates(UnitedStates::GovernmentBond), // Calendar Unadjusted, // BusinessDayConvention - convention Unadjusted, // BusinessDayConvention - terminationDateConvention dateGeneration, // DateGeneration::Rule rule false, // endOfMonth firstCouponDate); // First Date // // Create the Fixed Rate Bond // FixedRateBond bond( settlementDays, // Settlement Days faceAmount, // Face Amount fixedBondSchedule, // Schedule std::vector<Rate>(1, ql_coupon), // Coupons bondDayCount, // DayCounter paymentConvention, // BusinessDayConvention redemption); // Redemption Real ql_yield = BondFunctions::yield( bond, ql_price, bondDayCount, compoundingMethod, frequency, settlementDate, accuracy, maxEvaluations); InterestRate interestRate(ql_yield, bondDayCount, compoundingMethod, frequency ); Real ql_convexity = BondFunctions::convexity( bond, interestRate, settlementDate ); Compounding compoundingMethod4Duration = Compounded; Time ql_duration = BondFunctions::duration( bond, ql_yield, bondDayCount, compoundingMethod4Duration, frequency, Duration::Macaulay, settlementDate ); Thanks -Senevi ------------------------------------------------------------------------------ ------------------------------------------------------------------------------ Sponsored by Intel(R) XDK Develop, test and display web and hybrid apps with a single code base. Download it for free now! http://pubads.g.doubleclick.net/gampad/clk?id=111408631&iu=/4140/ostg.clktrk _______________________________________________ QuantLib-users mailing list [hidden email] https://lists.sourceforge.net/lists/listinfo/quantlib-users |
Free forum by Nabble | Edit this page |