"结束必须大于开始"在Uniform1dMesher中

时间:2014-04-23 21:22:56

标签: quantlib

我尝试使用QuantLib和Boost构建一个pyd文件,我想为屏障选项计算NPV。然而,QuantLib pyd抛出:

RuntimeError: end must be large than start

错误源自 uniform1dmesher.hpp 中的以下Quantlib类:

class Uniform1dMesher : public Fdm1dMesher {
public:
    Uniform1dMesher(Real start, Real end, Size size)
    : Fdm1dMesher(size) {
        QL_REQUIRE(end > start, "end must be large than start");

        const Real dx = (end-start)/(size-1);

        for (Size i=0; i < size-1; ++i) {
            locations_[i] = start + i*dx;
            dplus_[i] = dminus_[i+1] = dx;
        }

        locations_.back() = end;
        dplus_.back() = dminus_.front() = Null<Real>();
    }
};

我的c ++ - 代码如下:

struct OptionInputs
{
  QuantLib::Real S;
  QuantLib::Real K;
  QuantLib::Spread f;
  QuantLib::Rate r;
  QuantLib::Volatility vol;
  QuantLib::Date maturity;
  QuantLib::DayCounter dayCounter;
};

double FxOptEx(const OptionInputs &in,
          const QuantLib::Date &todaysDate,
          const QuantLib::Date &settlementDate)
{
  using namespace QuantLib;

  Calendar calendar = TARGET();
  Settings::instance().evaluationDate() = todaysDate;
  QuantLib::Real rebate = 0.05;

  Size timeGird = 365;
  Size underlyingGird = 100;
  Size dampingSteps = 0;
  Real theta = 0.05;
  bool localVolatility = true;

  boost::shared_ptr<Exercise> europeanExercise(
            new EuropeanExercise(
                in.maturity));
  Handle<Quote>
    underlyingH(boost::shared_ptr<Quote>(new SimpleQuote(in.S)));

  Handle<YieldTermStructure>
    rTS(boost::shared_ptr<YieldTermStructure>(new FlatForward(settlementDate,
                                                           in.r,
                                                           in.dayCounter)));
  Handle<YieldTermStructure>
    fTS(boost::shared_ptr<YieldTermStructure>(new FlatForward(settlementDate,
                                                           in.f,
                                                           in.dayCounter)));
  Handle<BlackVolTermStructure>
    flatVolTS(boost::shared_ptr<BlackVolTermStructure>(new BlackConstantVol(settlementDate,
                                                                         calendar,
                                                                         in.vol,
                                                                         in.dayCounter)));

  boost::shared_ptr<StrikedTypePayoff>
    payoff(new PlainVanillaPayoff(Option::Put,
                               in.K));

  boost::shared_ptr<BlackScholesMertonProcess> blackScholesMertonProcess(new BlackScholesMertonProcess(
                                        underlyingH,
                                        fTS,
                                            rTS,
                                        flatVolTS));


        BarrierOption barrierOption(
            QuantLib::Barrier::UpIn,
            QuantLib::Option::Put,
            rebate,
            payoff, 
            europeanExercise);

        barrierOption.setPricingEngine(
            boost::shared_ptr<PricingEngine>(
                new FdBlackScholesBarrierEngine (
                    blackScholesMertonProcess,
                    timeGird,
                    underlyingGird,
                    dampingSteps,
                    FdmSchemeDesc::ImplicitEuler(),
                    localVolatility,
                    -Null< Real >())));


  return barrierOption.NPV();
}

struct FXOption
{
  double value;
  void set(int S, int K, double f, double r, double vol, std::string maturity, std::string dayCounter)
  {
    OptionInputs in;
    in.S=S;
    in.K=K;
    in.f=f;
    in.r=r;
    in.vol=vol;
    in.maturity=QuantLib::DateParser::parseISO(maturity);
    if (dayCounter == "Actual365Fixed")
    {
        in.dayCounter = Actual365Fixed();
    }
    value = FxOptEx(in, Date(15, May, 1998), Date(17, May, 1998));
  }

  double get()
  {
      return value;
  }

};


using namespace boost::python;
BOOST_PYTHON_MODULE(quant)
{

    class_<FXOption>("FXOption")
        .def("get", &FXOption::get)
        .def("set", &FXOption::set)
    ;
}

知道为什么会抛出这个错误吗?

1 个答案:

答案 0 :(得分:0)

抱歉,我迟到了。

很难说没有看到实际的调用,但可能是期权的到期时间早于结算日期?