npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

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

Readme

option-pricing

GitHub license npm version build coverage

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 is 1, 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 then Math.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 is 0, a value of about 15 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