quant-pricer-cpp
Loading...
Searching...
No Matches
black_scholes.hpp
Go to the documentation of this file.
1
2#pragma once
3
4#include <cmath>
5
6namespace quant::bs {
7
12inline double normal_pdf(double x) {
13 static constexpr double INV_SQRT_2PI = 0.39894228040143267794; // 1/sqrt(2*pi)
14 return INV_SQRT_2PI * std::exp(-0.5 * x * x);
15}
16
21inline double normal_cdf(double x) { return 0.5 * std::erfc(-x / std::sqrt(2.0)); }
22
27struct Params {
28 double spot; // S
29 double strike; // K
30 double rate; // r (risk-free rate)
31 double dividend; // q (continuous dividend yield)
32 double vol; // sigma
33 double time; // T (years)
34};
35
44inline double d1(double S, double K, double r, double q, double sigma, double T) {
45 const double vol_sqrt_t = sigma * std::sqrt(T);
46 return (std::log(S / K) + (r - q + 0.5 * sigma * sigma) * T) / vol_sqrt_t;
47}
48
54inline double d2(double d1_value, double sigma, double T) { return d1_value - sigma * std::sqrt(T); }
55
57
66double call_price(double S, double K, double r, double q, double sigma, double T);
67
69
78double put_price(double S, double K, double r, double q, double sigma, double T);
79
80inline double call_price(const Params& p) {
81 return call_price(p.spot, p.strike, p.rate, p.dividend, p.vol, p.time);
82}
83
84inline double put_price(const Params& p) {
85 return put_price(p.spot, p.strike, p.rate, p.dividend, p.vol, p.time);
86}
87
90double delta_call(double S, double K, double r, double q, double sigma, double T);
91double delta_put(double S, double K, double r, double q, double sigma, double T);
92double gamma(double S, double K, double r, double q, double sigma, double T);
93double vega(double S, double K, double r, double q, double sigma, double T);
94double theta_call(double S, double K, double r, double q, double sigma, double T);
95double theta_put(double S, double K, double r, double q, double sigma, double T);
96double rho_call(double S, double K, double r, double q, double sigma, double T);
97double rho_put(double S, double K, double r, double q, double sigma, double T);
98
101double implied_vol_call(double S, double K, double r, double q, double T, double price);
102double implied_vol_put(double S, double K, double r, double q, double T, double price);
103
104} // namespace quant::bs
double S
Definition bs_barrier_rr.cpp:14
double sigma
Definition bs_barrier_rr.cpp:19
double q
Definition bs_barrier_rr.cpp:18
double K
Definition bs_barrier_rr.cpp:15
double r
Definition bs_barrier_rr.cpp:17
double T
Definition bs_barrier_rr.cpp:20
quant::stats::Welford vega
Definition mc.cpp:54
Analytic Black–Scholes European option pricing and Greeks.
Definition black_scholes.hpp:6
double put_price(double S, double K, double r, double q, double sigma, double T)
Price a European put option under Black–Scholes (present value).
Definition black_scholes.cpp:23
double theta_call(double S, double K, double r, double q, double sigma, double T)
Definition black_scholes.cpp:71
double rho_call(double S, double K, double r, double q, double sigma, double T)
Definition black_scholes.cpp:117
double d2(double d1_value, double sigma, double T)
Definition black_scholes.hpp:54
double normal_cdf(double x)
Definition black_scholes.hpp:21
double implied_vol_put(double S, double K, double r, double q, double T, double price)
Definition black_scholes.cpp:258
double rho_put(double S, double K, double r, double q, double sigma, double T)
Definition black_scholes.cpp:136
double d1(double S, double K, double r, double q, double sigma, double T)
Definition black_scholes.hpp:44
double theta_put(double S, double K, double r, double q, double sigma, double T)
Definition black_scholes.cpp:96
double delta_put(double S, double K, double r, double q, double sigma, double T)
Definition black_scholes.cpp:47
double call_price(double S, double K, double r, double q, double sigma, double T)
Price a European call option under Black–Scholes (present value).
Definition black_scholes.cpp:6
double normal_pdf(double x)
Definition black_scholes.hpp:12
double delta_call(double S, double K, double r, double q, double sigma, double T)
Definition black_scholes.cpp:39
double implied_vol_call(double S, double K, double r, double q, double T, double price)
Definition black_scholes.cpp:254
double gamma
Definition pde.cpp:93
Definition black_scholes.hpp:27
double vol
Definition black_scholes.hpp:32
double dividend
Definition black_scholes.hpp:31
double strike
Definition black_scholes.hpp:29
double time
Definition black_scholes.hpp:33
double spot
Definition black_scholes.hpp:28
double rate
Definition black_scholes.hpp:30