int NewtonRaphson_put(double S, double X, double T, double r, double cm, double *piv) { double vi, ci, vegai; assert_valid_price(S); assert_valid_strike(X); assert_valid_time(T); assert_valid_interest_rate(r); /* Compute the Manaster and Koehler seed value (vi) */ vi = sqrt(fabs(log(S/X) + r * T) * 2.0/T); ci = gbs_put(S, X, T, r, r, vi); vegai = vega(S, X, T, r, r, vi); while(fabs(cm - ci) > epsilon) { vi -= (ci - cm)/vegai; if(vi < VOLATILITY_MIN || vi > VOLATILITY_MAX) return 0; ci = gbs_put(S, X, T, r, r, vi); vegai = vega(S, X, T, r, r, vi); } *piv = vi; return 1; }
double bsmodel_4_vr::d(int pno, const double params[]) { if (pno == 0) return(vega(params)); else if (pno == 1) return(rho(params)); else if (pno == 2) return(da(params)); else if (pno == 3) return(db(params)); else return(0.0); }
// [[Rcpp::export]] Rcpp::List europeanOptionArraysEngine(std::string type, Rcpp::NumericMatrix par) { QuantLib::Option::Type optionType = getOptionType(type); int n = par.nrow(); Rcpp::NumericVector value(n), delta(n), gamma(n), vega(n), theta(n), rho(n), divrho(n); QuantLib::Date today = QuantLib::Date::todaysDate(); QuantLib::Settings::instance().evaluationDate() = today; QuantLib::DayCounter dc = QuantLib::Actual360(); for (int i=0; i<n; i++) { double underlying = par(i, 0); // first column double strike = par(i, 1); // second column QuantLib::Spread dividendYield = par(i, 2); // third column QuantLib::Rate riskFreeRate = par(i, 3); // fourth column QuantLib::Time maturity = par(i, 4); // fifth column #ifdef QL_HIGH_RESOLUTION_DATE // in minutes boost::posix_time::time_duration length = boost::posix_time::minutes(boost::uint64_t(maturity * 360 * 24 * 60)); #else int length = int(maturity*360 + 0.5); // FIXME: this could be better #endif double volatility = par(i, 5); // sixth column boost::shared_ptr<QuantLib::SimpleQuote> spot(new QuantLib::SimpleQuote( underlying )); boost::shared_ptr<QuantLib::SimpleQuote> vol(new QuantLib::SimpleQuote( volatility )); boost::shared_ptr<QuantLib::BlackVolTermStructure> volTS = flatVol(today, vol, dc); boost::shared_ptr<QuantLib::SimpleQuote> qRate(new QuantLib::SimpleQuote( dividendYield )); boost::shared_ptr<QuantLib::YieldTermStructure> qTS = flatRate(today, qRate, dc); boost::shared_ptr<QuantLib::SimpleQuote> rRate(new QuantLib::SimpleQuote( riskFreeRate )); boost::shared_ptr<QuantLib::YieldTermStructure> rTS = flatRate(today, rRate, dc); #ifdef QL_HIGH_RESOLUTION_DATE QuantLib::Date exDate(today.dateTime() + length); #else QuantLib::Date exDate = today + length; #endif boost::shared_ptr<QuantLib::Exercise> exercise(new QuantLib::EuropeanExercise(exDate)); boost::shared_ptr<QuantLib::StrikedTypePayoff> payoff(new QuantLib::PlainVanillaPayoff(optionType, strike)); boost::shared_ptr<QuantLib::VanillaOption> option = makeOption(payoff, exercise, spot, qTS, rTS, volTS); value[i] = option->NPV(); delta[i] = option->delta(); gamma[i] = option->gamma(); vega[i] = option->vega(); theta[i] = option->theta(); rho[i] = option->rho(); divrho[i] = option->dividendRho(); } return Rcpp::List::create(Rcpp::Named("value") = value, Rcpp::Named("delta") = delta, Rcpp::Named("gamma") = gamma, Rcpp::Named("vega") = vega, Rcpp::Named("theta") = theta, Rcpp::Named("rho") = rho, Rcpp::Named("divRho") = divrho); }