SABRVolCurve Example CPP

C++ Example - SABRVolCurve![]() ![]() ![]() ![]() // ################################################################################## // The first function here SABRVolCurve(), contains a series of // function calls leading upto the main function call, the second function // within this file ( SABRVolCurvePart() ). // which contains the answer that we are looking for.![]() // The first function here is simply an example of how to construct the parameters // in order acquire either a string Key (that is to be passed to other functions) // or a computed result.![]() // If you are viewing this source code from the chm or web help file you can use the // outlining features to collapse certain sections of the code for better readability. // ################################################################################## ![]() #include <string> #include <exception>![]() #include <sstream> #include <iomanip>![]() // Point the "additional includes directory" within your editor to the following paths ( where <InstallFolder> is your installation folder) // <InstallFolder>/Libs/Headers/ (For the library header files) // <InstallFolder>/Libs/Client/ (For the client helper header and source files)![]() // The helper files are optional and you can include only those files needed for your functionality // Each helper header/source file pair corresponds to a single QuantTools category of functions.![]() // Include QuantTools library header files #include <QuantTools_all.hpp>![]() // Include Client Helper QuantTools header files #include <QuantToolsClient_all.hpp>![]() // For Debug builds add a reference to the CTQuantToolsCPPAPI20D.lib // For Release builds add a reference to the CTQuantToolsCPPAPI20.lib // You add a reference via the ProjectProperties->Linker->Input menu item![]() // Some global parameter in order to append to user defined keys. // We use it here to ensure that we have unique Keys (in the case several of our examples // use the same key-name) // In normal use, a user defined string will be used and so this variable will be pointless.![]() static long nCTVolatiltyCurvesGlobal = 0;![]() // Used by parameters that take an optional range value. // In Excel we simply omit the value, within the API functions, // we pass an empty range object CTRangeDataCPP oEmptyRange;![]() std::string szTickedKeyName; std::ostringstream szTemp; std::string CPP_EX_SABRVolCurve() { nCTVolatiltyCurvesGlobal += 1; std::string szErrorMsg = ""; try {![]() ![]() // Creates a centralized valuation date object. ![]() std::string MyValuationDate; MyValuationDate = ValueDateObjPart(); ![]() ![]() // UK date calendar used within the UK stock exchange. ![]() std::string MyCALUKExchange; MyCALUKExchange = CALUKExchangePart(); ![]() ![]() // EURO calendar used for holiday adjustments. ![]() std::string MyEuroCal; MyEuroCal = CALEUROPart(); ![]() ![]() // Creates a Deposit template which is almost identical to a Libor // Index, but without the YieldCurve information. std::string MyDepoTPL; MyDepoTPL = CreateDepoTemplatePart( MyCALUKExchange, MyEuroCal); ![]() ![]() // Creates a Swap template which is almost identical to the definition // of the parameters of a swap contract, but without the swap duration, // buysell, and YieldCurve information. std::string MySwapTPL; MySwapTPL = CreateSwapTemplatePart( MyEuroCal, MyDepoTPL); ![]() ![]() // Creates a SABR curve to model the dynamics of the volatility // curve (smile). std::string MySABRVolCurve; MySABRVolCurve = SABRVolCurvePart( MyValuationDate, MyDepoTPL, MySwapTPL); // This is the result we are looking for. return MySABRVolCurve; ![]() } catch(std::exception e) { szErrorMsg = e.what(); throw; } catch(...) { throw; } } ![]() ![]() // ///////////////////////////////////////////////////////////////////![]() std::string SABRVolCurvePart( std::string MyValuationDate, std::string MyDepoTPL, std::string MySwapTPL) {![]() // Create example range for parameter SABRVolCurve_ATMRange CTRangeDataCPP SABRVolCurve_ATMRange; // We could set the value for each cell individually, but for display // purposes, this is quicker and more informative. SABRVolCurve_ATMRange.RangeFromStr ( "{" "'Opt\\Und' | '3M' | '6M' | '9M' | '12M' | '2Y' | '4Y' | '6Y' | '8Y' | '10Y' | '12Y' | '14Y' | '16Y' ;" "'3M' | 18 | 18.01 | 18.02 | 18.02 | 18.03 | 18.04 | 18.05 | 18.06 | 18.07 | 18.07 | 18.08 | 18.09 ;" "'6M' | 18.1 | 18.11 | 18.12 | 18.12 | 18.13 | 18.14 | 18.15 | 18.16 | 18.17 | 18.17 | 18.18 | 18.19 ;" "'9M' | 18.19 | 18.2 | 18.21 | 18.22 | 18.22 | 18.23 | 18.24 | 18.25 | 18.26 | 18.26 | 18.27 | 18.28 ;" "'12M' | 18.29 | 18.29 | 18.3 | 18.31 | 18.32 | 18.32 | 18.33 | 18.34 | 18.34 | 18.35 | 18.36 | 18.37 ;" "'2Y' | 18.37 | 18.38 | 18.39 | 18.4 | 18.41 | 18.42 | 18.42 | 18.43 | 18.44 | 18.44 | 18.45 | 18.46 ;" "'4Y' | 18.46 | 18.47 | 18.48 | 18.48 | 18.49 | 18.5 | 18.5 | 18.51 | 18.52 | 18.53 | 18.53 | 18.54 ;" "'6Y' | 18.55 | 18.55 | 18.56 | 18.57 | 18.57 | 18.58 | 18.59 | 18.6 | 18.6 | 18.61 | 18.62 | 18.62 ;" "'8Y' | 18.63 | 18.64 | 18.64 | 18.65 | 18.66 | 18.66 | 18.67 | 18.68 | 18.69 | 18.69 | 18.7 | 18.71 ;" "'10Y' | 18.71 | 18.72 | 18.73 | 18.74 | 18.75 | 18.75 | 18.76 | 18.77 | 18.78 | 18.79 | 18.79 | 18.8 ;" "'12Y' | 18.81 | 18.81 | 18.82 | 18.83 | 18.84 | 18.84 | 18.85 | 18.86 | 18.87 | 18.87 | 18.88 | 18.88 ;" "'14Y' | 18.89 | 18.9 | 18.91 | 18.92 | 18.92 | 18.93 | 18.94 | 18.95 | 18.96 | 18.96 | 18.97 | 18.98 ;" "'16Y' | 18.99 | 18.99 | 19 | 19.01 | 19.02 | 19.03 | 19.04 | 19.05 | 19.05 | 19.06 | 19.07 | 19.07 ;" "'18Y' | 19.08 | 19.08 | 19.09 | 19.1 | 19.11 | 19.11 | 19.12 | 19.13 | 19.13 | 19.14 | 19.15 | 19.16 ;" "'20Y' | 19.16 | 19.17 | 19.18 | 19.18 | 19.19 | 19.2 | 19.21 | 19.21 | 19.22 | 19.22 | 19.23 | 19.24 ;" "'22Y' | 19.25 | 19.26 | 19.26 | 19.27 | 19.28 | 19.29 | 19.29 | 19.3 | 19.31 | 19.32 | 19.32 | 19.33" "}" ); // Create example range for parameter SABRVolCurve_ALPHARange CTRangeDataCPP SABRVolCurve_ALPHARange; // We could set the value for each cell individually, but for display // purposes, this is quicker and more informative. SABRVolCurve_ALPHARange.RangeFromStr ( "{" "'Opt\\Und' | '3M' | '6M' | '9M' | '12M' | '2Y' | '4Y' | '6Y' | '8Y' | '10Y' | '12Y' | '14Y' | '16Y' ;" "'3M' | 0.4 | 0.4 | 0.4 | 0.4 | 0.41 | 0.41 | 0.41 | 0.41 | 0.41 | 0.41 | 0.41 | 0.42 ;" "'6M' | 0.42 | 0.42 | 0.42 | 0.42 | 0.42 | 0.42 | 0.43 | 0.43 | 0.43 | 0.43 | 0.43 | 0.43 ;" "'9M' | 0.43 | 0.44 | 0.44 | 0.44 | 0.44 | 0.44 | 0.44 | 0.45 | 0.45 | 0.45 | 0.45 | 0.45 ;" "'12M' | 0.45 | 0.45 | 0.46 | 0.46 | 0.46 | 0.46 | 0.46 | 0.46 | 0.46 | 0.47 | 0.47 | 0.47 ;" "'2Y' | 0.47 | 0.47 | 0.47 | 0.47 | 0.48 | 0.48 | 0.48 | 0.48 | 0.48 | 0.48 | 0.49 | 0.49 ;" "'4Y' | 0.49 | 0.49 | 0.49 | 0.49 | 0.49 | 0.49 | 0.5 | 0.5 | 0.5 | 0.5 | 0.5 | 0.5 ;" "'6Y' | 0.51 | 0.51 | 0.51 | 0.51 | 0.51 | 0.51 | 0.52 | 0.52 | 0.52 | 0.52 | 0.52 | 0.52 ;" "'8Y' | 0.52 | 0.53 | 0.53 | 0.53 | 0.53 | 0.53 | 0.53 | 0.53 | 0.54 | 0.54 | 0.54 | 0.54 ;" "'10Y' | 0.54 | 0.54 | 0.54 | 0.55 | 0.55 | 0.55 | 0.55 | 0.55 | 0.55 | 0.55 | 0.56 | 0.56 ;" "'12Y' | 0.56 | 0.56 | 0.56 | 0.56 | 0.56 | 0.57 | 0.57 | 0.57 | 0.57 | 0.57 | 0.57 | 0.57 ;" "'14Y' | 0.57 | 0.58 | 0.58 | 0.58 | 0.58 | 0.58 | 0.58 | 0.58 | 0.59 | 0.59 | 0.59 | 0.59 ;" "'16Y' | 0.59 | 0.59 | 0.59 | 0.6 | 0.6 | 0.6 | 0.6 | 0.6 | 0.6 | 0.6 | 0.61 | 0.61 ;" "'18Y' | 0.61 | 0.61 | 0.61 | 0.61 | 0.61 | 0.62 | 0.62 | 0.62 | 0.62 | 0.62 | 0.62 | 0.62 ;" "'20Y' | 0.63 | 0.63 | 0.63 | 0.63 | 0.63 | 0.63 | 0.64 | 0.64 | 0.64 | 0.64 | 0.64 | 0.64 ;" "'22Y' | 0.65 | 0.65 | 0.65 | 0.65 | 0.65 | 0.65 | 0.65 | 0.65 | 0.66 | 0.66 | 0.66 | 0.66" "}" ); // Create example range for parameter SABRVolCurve_BETARange CTRangeDataCPP SABRVolCurve_BETARange; // We could set the value for each cell individually, but for display // purposes, this is quicker and more informative. SABRVolCurve_BETARange.RangeFromStr ( "{" "'Opt\\Und' | '3M' | '6M' | '9M' | '12M' | '2Y' | '4Y' | '6Y' | '8Y' | '10Y' | '12Y' | '14Y' | '16Y' ;" "'3M' | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 ;" "'6M' | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 ;" "'9M' | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 ;" "'12M' | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 ;" "'2Y' | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 ;" "'4Y' | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 ;" "'6Y' | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 ;" "'8Y' | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 ;" "'10Y' | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 ;" "'12Y' | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 ;" "'14Y' | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 ;" "'16Y' | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 ;" "'18Y' | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 ;" "'20Y' | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 ;" "'22Y' | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7 | 0.7" "}" ); // Create example range for parameter SABRVolCurve_RHORange CTRangeDataCPP SABRVolCurve_RHORange; // We could set the value for each cell individually, but for display // purposes, this is quicker and more informative. SABRVolCurve_RHORange.RangeFromStr ( "{" "'Opt\\Und' | '3M' | '6M' | '9M' | '12M' | '2Y' | '4Y' | '6Y' | '8Y' | '10Y' | '12Y' | '14Y' | '16Y' ;" "'3M' | 0.3 | 0.3 | 0.3 | 0.31 | 0.31 | 0.31 | 0.31 | 0.31 | 0.31 | 0.31 | 0.31 | 0.32 ;" "'6M' | 0.32 | 0.32 | 0.32 | 0.32 | 0.32 | 0.32 | 0.33 | 0.32 | 0.32 | 0.33 | 0.33 | 0.33 ;" "'9M' | 0.33 | 0.33 | 0.32 | 0.33 | 0.32 | 0.33 | 0.33 | 0.33 | 0.33 | 0.33 | 0.33 | 0.33 ;" "'12M' | 0.33 | 0.34 | 0.33 | 0.33 | 0.33 | 0.33 | 0.34 | 0.34 | 0.34 | 0.34 | 0.34 | 0.34 ;" "'2Y' | 0.34 | 0.34 | 0.34 | 0.34 | 0.34 | 0.34 | 0.34 | 0.34 | 0.34 | 0.34 | 0.35 | 0.35 ;" "'4Y' | 0.35 | 0.35 | 0.36 | 0.36 | 0.36 | 0.36 | 0.36 | 0.36 | 0.36 | 0.36 | 0.36 | 0.36 ;" "'6Y' | 0.37 | 0.36 | 0.37 | 0.37 | 0.37 | 0.37 | 0.37 | 0.37 | 0.37 | 0.37 | 0.37 | 0.37 ;" "'8Y' | 0.38 | 0.38 | 0.38 | 0.37 | 0.37 | 0.37 | 0.38 | 0.38 | 0.38 | 0.38 | 0.38 | 0.38 ;" "'10Y' | 0.38 | 0.38 | 0.38 | 0.38 | 0.38 | 0.38 | 0.37 | 0.38 | 0.37 | 0.38 | 0.38 | 0.38 ;" "'12Y' | 0.38 | 0.38 | 0.38 | 0.38 | 0.38 | 0.38 | 0.38 | 0.38 | 0.39 | 0.39 | 0.39 | 0.39 ;" "'14Y' | 0.39 | 0.39 | 0.39 | 0.39 | 0.39 | 0.39 | 0.4 | 0.39 | 0.39 | 0.39 | 0.4 | 0.4 ;" "'16Y' | 0.4 | 0.4 | 0.4 | 0.4 | 0.4 | 0.4 | 0.4 | 0.4 | 0.4 | 0.4 | 0.41 | 0.41 ;" "'18Y' | 0.41 | 0.41 | 0.41 | 0.41 | 0.41 | 0.41 | 0.42 | 0.42 | 0.41 | 0.42 | 0.42 | 0.42 ;" "'20Y' | 0.42 | 0.42 | 0.42 | 0.43 | 0.43 | 0.43 | 0.42 | 0.43 | 0.42 | 0.43 | 0.43 | 0.43 ;" "'22Y' | 0.42 | 0.43 | 0.43 | 0.43 | 0.43 | 0.43 | 0.43 | 0.43 | 0.43 | 0.43 | 0.43 | 0.43" "}" ); ![]() ![]() std::ostringstream szTemp; szTemp.str(""); szTemp << std::setw(0) << nCTVolatiltyCurvesGlobal;![]() ![]() // Key value to use as a handle for the created object std::string MySABRVolCurve = std::string("MySABRVolCurve") + std::string("_") + szTemp.str(); ![]() // When creating this object for the first time, set this parameter // to a positive value. long Reload = 1; ![]() // A tag used to identify this curve (case insensitive) if placed // within a Volatility curve collection ( via the GroupedVolCurves() // function ). std::string CurveName = "MySABRVolCurve"; ![]() // Number of days between the Exercise date of the options and // the STARTDATE of the instrument. long SettleDays = 2; ![]() // Is the input volatility entered as a percentage value (true), // or the raw volatility value (false). bool DivideVolBy100 = true; ![]() // DayCounter for converting dates into year fractions. DayCountEnum DayCount = DayCount_30360; ![]() // Interpolation method to use when interpolating the curve for // vols, - LINEAR, LOGLINEAR, CUBIC. InterpEnum InterpType = Interp_LINEAR;![]() // Excel function call would be this - "CT.CRV.SABRVolCurve()"![]() // Creates a SABR curve to model the dynamics of the volatility // curve (smile). std::string rSABRVolCurve; rSABRVolCurve = CTVolatiltyCurvesSA::SABRVolCurve( MySABRVolCurve, Reload, CurveName, MyValuationDate, SettleDays, SABRVolCurve_ATMRange, SABRVolCurve_ALPHARange, SABRVolCurve_BETARange, SABRVolCurve_RHORange, DivideVolBy100, MyDepoTPL, MySwapTPL, DayCount, InterpType);![]() ![]() return rSABRVolCurve; } ![]() ![]() ![]() ![]() |