# Recipe: Pricing Options Using Barone-Adesi Whaley Approximation

## Introduction

Many people have discussed how parallel programming practice can be applied to the Black-Scholes model and the Black-Scholes formula that prices European options analytically. They have successfully applied the parallelization methods to achieve high performance on European-style options pricing algorithm. However, nearly all the options written on a wide variety of underlying financial products including stocks, commodities and foreign exchanges are American-style with an early exercise clause embedded into the options contracts. Unlike the European-style options pricing problems, there is no close-form solution for this American-style option pricing problem. The pricing of American options has mainly focused on using the finite difference methods of Brennan and Schwartz [1978], the binomial of Cox, Ross Rubinstein [1979] and trinomial of Tian [1993]. While these numerical methods are capable of producing accurate solutions to American option pricing problems, they are also difficult to use and consume at least two magnitude more computationally resources. As a result, for the past 40 years, many talented financial mathematicians have been searching for newer and better numerical methods that can produce results with a more efficient use of computational resources. In this paper, we look at one of these successful efforts, pioneered by Barone-Adesi and Whaley [1989], and apply the high performance parallel computing entailed in the modern microprocessors to create a program that can exceed our expectation for high performance with a suitable numerical result.

## Black-Scholes-Merton Formula

Consider an option on a stock providing a dividend yield equal to q. We will denote the difference between the American and European option price by v. Because both the American and the European option prices satisfy the Black–Scholes differential equation, v also does so.

For convenicence, We define

Without loss of generality, we can also write:

`v = h(τ)g(S, h)`

Change variables and substitution

The approximation involves assuming that the final term on the left-hand side is zero, so that

The ignored term is generally fairly small. When τ is large, 1-h is close to zero; when τ is small, ∂g/∂h is close to zero.

The American call and put prices at time t will be denoted by C(S, t) and P(S, t), where S is the stock price, and the corresponding European call and put price will be denoted by c(S, t) and p(S, t). Equation (1) can be solved using standard techniques. After boundary conditions have been applied, it is found that

The variable S* is the critical price of the stock above which the option should be exercised. It is estimated by solving the equation

Iteratively. For a put option, the valuation formula is

The variable S** is the critical price of the stock below which the option should be exercised. It is estimated by solving the equation

Iteratively, the other variables that have been used here are

Options on stock indices, currencies, and futures contracts are analogous to options on a stock providing a constant dividend yield. Hence the quadratic approximation approach can easily be applied to all of these types of options.

## Code Access

The source code for Black-Scholes-Merton formula is maintained by Shuo Li and is available under the BSD 3-Clause Licensing Agreement. The program runs natively on Intel® Xeon Phi™ processors in a single node environment.

## Build and Run Directions

Here are the steps for rebuilding the program:

1. Install Intel® Parallel Studio XE 2016 SP 3 on your system
2. Source the environment variable script file
3. Untar the BAWAmericanOptions.tar
4. Type make to build the binaries for Single and Double Precision

1. For Single Precision processing: am_call_sp.knl
2. For Double Precision processing: am_call_dp.knl
5. Make sure the host machine is powered by Intel® Xeon Phi™ Processors

[sli@ortce-knl7 ~]\$ lscpu

``````Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                272
On-line CPU(s) list:   0-271
Core(s) per socket:    68
Socket(s):             1
NUMA node(s):          8
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 87
Model name:            Intel(R) Xeon Phi(TM) CPU 7250 @ 1.40GHz
Stepping:              1
CPU MHz:               1400.273
BogoMIPS:              2793.61
Virtualization:        VT-x
L1d cache:             32K
L1i cache:             32K
L2 cache:              1024K
NUMA node0 CPU(s):     5,6,11,12,17,18,23-25,73-86,135-148,197-210,259-271
NUMA node1 CPU(s):     1,2,7,8,13,14,19,20,43-58,105-120,167-182,229-244
NUMA node2 CPU(s):     3,4,9,10,15,16,21,22,59-72,121-134,183-196,245-258
NUMA node3 CPU(s):     0,26-42,87-104,149-166,211-228For Double Precision processing:
``````
6. ``````Run am_call_sp.knl and am_call_dp.knl
[sli@wsl-knl-02 test_baw]\$ ./am_call_sp.knl
Call price using Barone-Adesi Whaley approximation Optimized = 5.743389
cycles consumed is 99246
Pricing American Options using BAW Approximation in single precision.
Compiler Version  = 16
Release Update    = 3
Build Time        = May 27 2016 20:27:47
Input Dataset     = 142606336

Completed pricing 142.60634 million options in 0.56671 seconds:
Parallel version runs at 251.64027 million options per second.
[sli@wsl-knl-02 test_baw]\$ ./am_call_dp.knl
Call price using Barone-Adesi Whaley approximation Optimized = 5.743386
cycles consumed is 122640
Pricing American Options using BAW Approximation in double precision.
Compiler Version  = 16
Release Update    = 3
Build Time        = May 27 2016 20:34:32
Input Dataset     = 142606336