Other Examples
Other Examples
Option Pricing Tools
The C++ SDK does not include a built-in option pricing library. However, you can use the SDK's market data interfaces to obtain option bid/ask prices, implied volatility, Greeks, and other data, and then use a third-party math library (such as QuantLib) for local option pricing calculations.
The following example demonstrates how to retrieve option market data using the C++ SDK and analyze the returned Greeks and implied volatility.
Note
For local option pricing and Greeks calculations, using the QuantLib C++ library is recommended. The local calculation portions in the examples below require QuantLib to be installed separately.
Get Option Quotes and Greeks via SDK
Use get_option_brief to get a real-time option quote snapshot. The returned data includes implied volatility and Greeks.
#include <iostream>
#include "tigerapi/quote_client.h"
#include "tigerapi/client_config.h"
using namespace TIGER_API;
using namespace web::json;
int main() {
// Initialize configuration
ClientConfig config(false, U("/path/to/your/properties/"));
// Initialize quote client
QuoteClient quote_client(config);
// Get option quote snapshot (including Greeks)
// Option identifier format: "Underlying ExpiryDirectionStrike" (OCC format)
value result = quote_client.get_option_brief(U("AAPL 240621C00190000"));
ucout << result.serialize() << std::endl;
return 0;
}Return Example
{
"askPrice": 35.5,
"askSize": 10,
"bidPrice": 35.0,
"bidSize": 15,
"latestPrice": 35.25,
"volume": 1234,
"openInterest": 5678,
"impliedVol": 0.4648,
"delta": 0.6006,
"gamma": 0.0246,
"theta": -0.4430,
"vega": 0.1304,
"rho": 0.0265
}Get Option Chain Data
Use get_option_chain to get the complete option chain for a given underlying and expiration date, with optional filter conditions.
#include <iostream>
#include "tigerapi/quote_client.h"
#include "tigerapi/client_config.h"
using namespace TIGER_API;
using namespace web::json;
int main() {
ClientConfig config(false, U("/path/to/your/properties/"));
QuoteClient quote_client(config);
// Get option expiration dates
value symbols = value::array();
symbols[0] = value::string(U("AAPL"));
value expirations = quote_client.get_option_expiration(symbols);
ucout << U("Expirations: ") << expirations.serialize() << std::endl;
// Get option chain for a specific expiration date
value chain = quote_client.get_option_chain(U("AAPL"), U("2024-06-21"));
ucout << U("Option chain: ") << chain.serialize() << std::endl;
// Get option chain with filter (in-the-money only)
value filter = value::object();
filter[U("in_the_money")] = value::boolean(true);
value filtered_chain = quote_client.get_option_chain(U("AAPL"), U("2024-06-21"), filter);
ucout << U("In-the-money options: ") << filtered_chain.serialize() << std::endl;
return 0;
}Local Option Pricing with QuantLib
If you need to perform local option pricing and Greeks calculations, you can use the QuantLib C++ library. The following example demonstrates calculating implied volatility and Greeks for American options using QuantLib.
QuantLib C++ library must be installed first. Install via vcpkg:
vcpkg install quantlib, or via brew:brew install quantlib
#include <iostream>
#include <ql/quantlib.hpp>
using namespace QuantLib;
int main() {
// Set evaluation date
Date evaluationDate(19, April, 2022);
Settings::instance().evaluationDate() = evaluationDate;
// Option parameters
Option::Type optionType = Option::Call;
Real underlying = 985.0; // Underlying asset price
Real strike = 990.0; // Strike price
Rate riskFreeRate = 0.017; // Risk-free rate
Rate dividendRate = 0.0; // Dividend rate
Date settlementDate(14, April, 2022); // Settlement date
Date expirationDate(22, April, 2022); // Option expiration date
// Build exercise and underlying
auto exercise = ext::make_shared<AmericanExercise>(settlementDate, expirationDate);
auto payoff = ext::make_shared<PlainVanillaPayoff>(optionType, strike);
VanillaOption option(payoff, exercise);
// Market data handles
auto spotHandle = ext::make_shared<SimpleQuote>(underlying);
auto volHandle = ext::make_shared<SimpleQuote>(0.0); // Temporarily set to 0
auto rateHandle = ext::make_shared<SimpleQuote>(riskFreeRate);
auto divHandle = ext::make_shared<SimpleQuote>(dividendRate);
DayCounter dayCounter = Actual365Fixed();
Calendar calendar = UnitedStates(UnitedStates::NYSE);
auto flatVol = ext::make_shared<BlackConstantVol>(
evaluationDate, calendar,
Handle<Quote>(volHandle), dayCounter);
auto flatRate = ext::make_shared<FlatForward>(
evaluationDate, Handle<Quote>(rateHandle), dayCounter);
auto flatDiv = ext::make_shared<FlatForward>(
evaluationDate, Handle<Quote>(divHandle), dayCounter);
auto bsmProcess = ext::make_shared<BlackScholesMertonProcess>(
Handle<Quote>(spotHandle),
Handle<YieldTermStructure>(flatDiv),
Handle<YieldTermStructure>(flatRate),
Handle<BlackVolTermStructure>(flatVol));
// Use finite difference pricing engine
option.setPricingEngine(
ext::make_shared<FdBlackScholesVanillaEngine>(bsmProcess, 100, 100));
// Calculate implied volatility from option price
Real optionPrice = 33.6148; // Option market price, can use (ask + bid) / 2
Volatility impliedVol = option.impliedVolatility(optionPrice, bsmProcess);
std::cout << "implied volatility: " << impliedVol << std::endl;
// Update volatility and recalculate Greeks
volHandle->setValue(impliedVol);
std::cout << "value: " << option.NPV() << std::endl;
std::cout << "delta: " << option.delta() << std::endl;
std::cout << "gamma: " << option.gamma() << std::endl;
std::cout << "theta: " << option.theta() << std::endl;
std::cout << "vega: " << option.vega() << std::endl;
std::cout << "rho: " << option.rho() << std::endl;
std::cout << std::endl;
// Calculate option price directly using known implied volatility
Real knownVolatility = 0.6153;
volHandle->setValue(knownVolatility);
std::cout << "---- Calculate using known implied volatility ----" << std::endl;
std::cout << "value: " << option.NPV() << std::endl;
std::cout << "delta: " << option.delta() << std::endl;
std::cout << "gamma: " << option.gamma() << std::endl;
std::cout << "theta: " << option.theta() << std::endl;
std::cout << "vega: " << option.vega() << std::endl;
std::cout << "rho: " << option.rho() << std::endl;
return 0;
}Full Example: SDK Market Data + QuantLib Calculation
The following example combines Tiger Open API market data queries with QuantLib local calculations to implement a complete option analysis workflow.
#include <iostream>
#include <string>
#include "tigerapi/quote_client.h"
#include "tigerapi/client_config.h"
#include <ql/quantlib.hpp>
using namespace TIGER_API;
using namespace web::json;
using namespace QuantLib;
int main() {
// 1. Get option market data via SDK
ClientConfig config(false, U("/path/to/your/properties/"));
QuoteClient quote_client(config);
// Get real-time option quotes
value brief = quote_client.get_option_brief(U("AAPL 240209P00185000"));
ucout << U("Option brief: ") << brief.serialize() << std::endl;
// Get underlying stock latest price
value symbols = value::array();
symbols[0] = value::string(U("AAPL"));
value stock_brief = quote_client.get_brief(symbols);
ucout << U("Stock brief: ") << stock_brief.serialize() << std::endl;
// 2. Extract key parameters from returned data
// Note: In actual code, you need to parse fields based on the returned JSON structure
double askPrice = 2.50; // From brief
double bidPrice = 2.30; // From brief
double latestPrice = 185.0; // From stock_brief
// 3. Perform local calculation using QuantLib
Date evaluationDate(5, February, 2024);
Settings::instance().evaluationDate() = evaluationDate;
Option::Type optionType = Option::Put;
Real underlying = latestPrice;
Real strike = 185.0;
Rate riskFreeRate = 0.0241;
Rate dividendRate = 0.0;
Date settlementDate(5, February, 2024);
Date expirationDate(9, February, 2024);
auto exercise = ext::make_shared<AmericanExercise>(settlementDate, expirationDate);
auto payoff = ext::make_shared<PlainVanillaPayoff>(optionType, strike);
VanillaOption option(payoff, exercise);
auto spotHandle = ext::make_shared<SimpleQuote>(underlying);
auto volHandle = ext::make_shared<SimpleQuote>(0.0);
auto rateHandle = ext::make_shared<SimpleQuote>(riskFreeRate);
auto divHandle = ext::make_shared<SimpleQuote>(dividendRate);
DayCounter dayCounter = Actual365Fixed();
Calendar calendar = UnitedStates(UnitedStates::NYSE);
auto flatVol = ext::make_shared<BlackConstantVol>(
evaluationDate, calendar,
Handle<Quote>(volHandle), dayCounter);
auto flatRate = ext::make_shared<FlatForward>(
evaluationDate, Handle<Quote>(rateHandle), dayCounter);
auto flatDiv = ext::make_shared<FlatForward>(
evaluationDate, Handle<Quote>(divHandle), dayCounter);
auto bsmProcess = ext::make_shared<BlackScholesMertonProcess>(
Handle<Quote>(spotHandle),
Handle<YieldTermStructure>(flatDiv),
Handle<YieldTermStructure>(flatRate),
Handle<BlackVolTermStructure>(flatVol));
option.setPricingEngine(
ext::make_shared<FdBlackScholesVanillaEngine>(bsmProcess, 100, 100));
// Calculate implied volatility (using average of ask and bid)
Real optionPrice = (askPrice + bidPrice) / 2.0;
Volatility impliedVol = option.impliedVolatility(optionPrice, bsmProcess);
volHandle->setValue(impliedVol);
std::cout << "---- Option Analysis Results ----" << std::endl;
std::cout << "implied volatility: " << impliedVol << std::endl;
std::cout << "value: " << option.NPV() << std::endl;
std::cout << "delta: " << option.delta() << std::endl;
std::cout << "gamma: " << option.gamma() << std::endl;
std::cout << "theta: " << option.theta() << std::endl;
std::cout << "vega: " << option.vega() << std::endl;
std::cout << "rho: " << option.rho() << std::endl;
return 0;
}Example Output
{
"delta": -0.4291523762730371,
"gamma": 0.06867092999396703,
"predictedValue": 1.8448482568095044,
"rho": -0.007994670535451135,
"theta": -0.27407985875145857,
"vega": 0.07649602025704422,
"volatility": 0.5919
}In addition to the examples provided in this documentation, more C++ SDK examples are being continuously updated. New examples will be synchronized to the GitHub repository.
https://github.com/tigerfintech/openapi-cpp-sdk
We will continue to add more examples and update them in the documentation and GitHub repository. If you have any questions about using the SDK, please Contact Us directly.
Updated 1 day ago
