option-pricing
v2.1.0
Published
Analytical (Black-Scholes) and numerical (binomial tree, Monte Carlo simulation) option pricing calculator supporting different payoff styles (European and American).
Downloads
149
Maintainers
Readme
option-pricing
Analytical and numerical option pricing calculator supporting different payoff styles.
Pricing methods implemented:
- Black-Scholes: analytical calculation of the value of a European option using the Black-Scholes model, extended by Merton to allow for the inclusion of a continuous dividend yield.
- Binomial tree: using the binomial options pricing model described by Cox, Ross, and Rubinstein, i.e. the Cox-Ross-Rubinstein (CRR) model (also known as the binomial model)
- Monte Carlo simulation: risk neutral valuation of random price paths as first applied by Boyle, with early exercise handled using the least-squares Monte Carlo approach (with a fixed degree of 2) proposed by Longstaff and Schwartz.
Table of contents
Installation
To install the package run:
npm install option-pricing
or load it directly in the browser using a CDN like unpkg:
<script crossorigin src="https://unpkg.com/option-pricing/client-dist/bundle.js"></script>
Usage
Import the Option
class:
import { Option } from "option-pricing";
Create a new Option
:
const option = new Option({
style: "european", // Style of the option defined by the exercise rights ("european" or "american").
type: "call", // Type of the option ("call" or "put").
initialSpotPrice: 100, // Initial price of the underlying asset (S₀ > 0).
strikePrice: 105, // Strike/exercise price of the option (K > 0).
timeToMaturity: 0.5, // Time until maturity/expiration in years (τ = T - t > 0).
volatility: 0.3, // Underlying volatility (σ > 0).
riskFreeRate: 0.2, // [optional=0] Annualized risk-free interest rate continuously compounded (r).
dividendYield: 0.1, // [optional=0] Annual dividend yield continuously compounded (q).
});
Then call the price
method on the Option
, selecting the desired pricing method/model (and passing in the required parameters if a numerical method is selected).
You can use the setter methods provided to update the option parameters.
Pricing method selection and parameters
The available pricing methods are:
- Black-Scholes:
"bs"
or"black-scholes"
- Binomial tree:
"bt"
or"binomial-tree"
timeSteps
: Number of time steps in the tree (> 0).
- Monte Carlo simulation:
"mcs"
or"monte-carlo-simulation"
simulations
: Number of simulated price paths (> 0).timeSteps
: [optional] Number of time steps to simulate for each path. The default value is1
, a higher value should be chosen for options with early exercise.prngName
: [optional] Name of the pseudorandom number generator (PRNG) to use. If not specified thenMath.random()
will be used. Choices are:"sfc32"
,"mulberry32"
,"xoshiro128ss"
, and"jsf32"
. See this Stack Overflow answer for details.prngSeed
: [optional] Initial seed state of the PRNG. If not specified then a random seed will be created.prngAdvancePast
: [optional] Initial amount of numbers generated by the PRNG to discard. The default value is0
, a value of about15
is recommended by the Stack Overflow answer.
// Black-Scholes
option.price("bs");
option.price("black-scholes");
// Binomial tree
option.price("bt", { timeSteps: 25 });
option.price("binomial-tree", { timeSteps: 100 });
// Monte Carlo simulation
option.price("mcs", { simulations: 10000 }); // uses Math.random() as the PRNG
option.price("monte-carlo-simulation", {
simulations: 1000,
timeSteps: 50,
prngName: "sfc32",
prngSeed: "123",
prngAdvancePast: 15,
});
Examples
Black-Scholes (analytically priced options)
- European call option
Hull SSM (2014), Problem 15.13, page 166
S₀ = 52, K = 50, τ = 0.25, σ = 0.3, r = 0.12, q = 0
const option = new Option({
style: "european",
type: "call",
initialSpotPrice: 52,
strikePrice: 50,
timeToMaturity: 0.25,
volatility: 0.3,
riskFreeRate: 0.12,
});
const price = option.price("bs");
console.log(price);
// 5.057...
- European put option
Hull SSM (2014), Problem 17.7, page 187
S₀ = 0.52, K = 0.5, τ = 0.6667, σ = 0.12, r = 0.04, q = 008
const option = new Option({
style: "european",
type: "put",
initialSpotPrice: 0.52,
strikePrice: 0.5,
timeToMaturity: 0.6667,
volatility: 0.12,
riskFreeRate: 0.04,
dividendYield: 0.08,
});
const price = option.price("black-scholes");
console.log(price);
// 0.0162...
- American call option on a non-dividend paying stock
"Since it is never optimal to exercise early an American call option on a non-dividend-paying stock (see Section 11.5), equation (15.20) [the Black-Scholes-Merton pricing formula] is the value of an American call option on a non-dividend-paying stock." (Hull, 2014, p. 359)
That is, the price of an American call option on a non-dividend paying stock is the same as the price of a European call option.
const option = new Option({
style: "american",
type: "call",
initialSpotPrice: 52,
strikePrice: 50,
timeToMaturity: 0.25,
volatility: 0.3,
riskFreeRate: 0.12,
});
const price = option.price("bs");
console.log(price);
// 5.057...
- American put option
"no exact analytic formula for the value of an American put option on a non-dividend-paying stock has been produced" (Hull, 2014, p. 359)
So, the result when attempting to analytically price an American put option will be undefined
.
const option = new Option({
style: "american",
type: "put",
initialSpotPrice: 52,
strikePrice: 50,
timeToMaturity: 0.25,
volatility: 0.3,
riskFreeRate: 0.12,
});
const price = option.price("bs");
console.log(price);
// undefined
Binomial tree
- American put option
Hull SSM (2014): Problem 13.17, page 142
S₀ = 1500, K = 1480, τ = 1, σ = 0.18, r = 0.04, q = 0.025, time steps = 2
const option = new Option({
style: "american",
type: "put",
initialSpotPrice: 1500,
strikePrice: 1480,
timeToMaturity: 1,
volatility: 0.18,
riskFreeRate: 0.04,
dividendYield: 0.025,
});
const price = option.price("bt", { timeSteps: 2 });
console.log(price);
// 78.413...
Monte Carlo simulation
- Compare to the exact European call option price of 5.057
S₀ = 52, K = 50, τ = 0.25, σ = 0.3, r = 0.12, q = 0
const option = new Option({
style: "european",
type: "call",
initialSpotPrice: 52,
strikePrice: 50,
timeToMaturity: 0.25,
volatility: 0.3,
riskFreeRate: 0.12,
});
const params = {
simulations: 10000,
prngSeed: "123",
prngAdvancePast: 15,
};
const sfc32 = option.price("mcs", {
...params,
prngName: "sfc32",
});
console.log(sfc32);
// 5.073740074053896
const mulberry32 = option.price("mcs", {
...params,
prngName: "mulberry32",
});
console.log(mulberry32);
// 5.007275545013275
const xoshiro128ss = option.price("mcs", {
...params,
prngName: "xoshiro128ss",
});
console.log(xoshiro128ss);
// 5.021720720229929
const jsf32 = option.price("mcs", {
...params,
prngName: "jsf32",
});
console.log(jsf32);
// 5.1499321549907
References
- Black, F., & Scholes, M. (1973). The Pricing of Options and Corporate Liabilities. Journal of Political Economy, 81(3), 637–654.
- Boyle, P.P. (1977) Options: A Monte Carlo Approach. Journal of Financial Economics, 4, 323-338.
- Cox, J.C., Ross, S.A., & Rubinstein, M. (1979). Options pricing: A simplified approach. Journal of Financial Economics, 7, 229-263.
- Hull (2014): Hull, J. (2014) Options, Futures and Other Derivatives. 9th Edition, Prentice Hall, Upper Saddle River.
- Hull SSM (2014): Hull, J. (2014) Student Solutions Manual for Options, Futures, and Other Derivatives. 9th Edition, Prentice Hall, Upper Saddle River.
- Longstaff, F., & Schwartz, E. (2001). Valuing American Options by Simulation: A Simple Least-Squares Approach. Review of Financial Studies. 14. 113-47.
- Merton, R. C. (1973). Theory of Rational Option Pricing. The Bell Journal of Economics and Management Science, 4(1), 141–183.
- Stack Overflow: Seeding the random number generator in Javascript