代码之家  ›  专栏  ›  技术社区  ›  Truong Ngo

QuantLib返回日期超出界限的付款计划?

  •  0
  • Truong Ngo  · 技术社区  · 9 年前

    我正在使用QuantLib 1.7.1并尝试运行以下代码:

    Date begin(30, September, 2009), end(15, Jun, 2012);
    Calendar myCal = Japan();
    BusinessDayConvention bdC = BusinessDayConvention(Following);
    Period myTenor(6, Months);
    DateGeneration::Rule myRule = DateGeneration::Forward;
    Schedule mySched(begin, end, myTenor, myCal, bdC, bdC, myRule, true);
    std::vector <Date > finalSched = mySched.dates();
    BOOST_FOREACH(Date d, finalSched) std::cout << d << std::endl;
    

    我希望得到一个下限和上限分别为2009年9月30日和2012年6月15日的时间表,如下所示:

    September 30th, 2009
    March 31st, 2010
    September 30th, 2010
    March 31st, 2011
    September 30th, 2011
    March 30th, 2012
    June 15th, 2012
    

    但我得到的结果是,最终付款日期为2012年6月29日,在我设定的界限之后:

    September 30th, 2009
    March 31st, 2010
    September 30th, 2010
    March 31st, 2011
    September 30th, 2011
    March 30th, 2012
    June 29th, 2012
    

    如果我将DateGeneration规则设置为Backward,它将按预期工作(计划下限为30/9/2009):

    September 30th, 2009
    December 15th, 2009
    June 15th, 2010
    December 15th, 2010
    June 15th, 2011
    December 15th, 2011
    June 15th, 2012
    

    在第一种情况下,QuantLib是否故意给出超出界限的结果,或者这是一个bug?

    1 回复  |  直到 9 年前
        1
  •  1
  •   Luigi Ballabio    9 年前

    据我所知,您传递的最后一个参数( true )导致所有日期都要调整到月底,包括到期日,即使离该日期很远。我不确定这是怎么发生的,但我认为这是意料之外的。

    到目前为止,恐怕对于这个特定的案例没有解决办法。经过 false 因为最后一个参数会产生正确的到期日,但不会调整这两个参数之间的日期:

    September 30th, 2009
    March 30th, 2010
    September 30th, 2010
    March 30th, 2011
    September 30th, 2011
    March 30th, 2012
    June 15th, 2012
    

    所以,如果你碰巧需要这种特殊的债券,这对你没有帮助。

    此外,只有当开始日期是当月的最后一个工作日时,才会发生这种情况;如果不是,通过 endOfMonth 参数被忽略。

    总之,是的:这可能是一个bug。

    更新: 实际上,有一个我已经忘记的变通方法:你可以告诉 Schedule 构造函数明确不调整成熟度,通过传递 Unadjusted 按照终止日期约定:

    Schedule mySched(begin, end, myTenor, myCal, bdC, Unadjusted, myRule, true);
    

    这会产生您期望的日期:

    September 30th, 2009
    March 31st, 2010
    September 30th, 2010
    March 31st, 2011
    September 30th, 2011
    March 30th, 2012
    June 15th, 2012
    

    不过,我仍然倾向于将其他行为视为某种bug,因为它是如此出乎意料。