Quick start

Philosophy

The philosophy of py_vollib_vectorized is to provide seamless integration of vectorization into the py_vollib library. py_vollib_vectorized also possesses an API which simplifies the process of obtaining all option greeks for option contracts.

Monkey-patching

Upon import, py_vollib_vectorized monkey-patches (i.e. replaces) all relevant functions in py_vollib to make them accept floats as well as list, tuple, numpy.array or pandas.Series. The calculations are therefore much faster and more memory efficient, which is in some cases a benefit, in others a necessity.

The example below shows that the monkey-patch is applied to the py_vollib.black.black() function. You can confirm this by printing the function definition.

>>> from py_vollib.black import black
>>> import py_vollib_vectorized
>>> black # check if the monkey-patch is applied.
Vectorized <vectorized_black()>
>>> flag = 'c'  # 'c' for call, 'p' for put
>>> S = 95  # price of the underlying
>>> K = 100  # strike
>>> t = .2  # annualized time to expiration
>>> r = .2  # interest-free rate
>>> sigma = .2  # implied volatility
>>> black_scholes(flag, S, K, t, r, sigma, return_as='numpy')
array([2.89558836])

Data Format

All input arguments are raveled. In order to avoid conflicts or mispricing, you should supply 0- or 1-dimensional arrays or pandas.Series to all functions. By default, all input arguments are broadcasted to the largest input argument. If you supply unbroadcastable inputs (e.g. a 2-item list and a 3-item list), a ValueError is generated.

Again, you can supply the inputs as int, float, list, tuple, numpy.array or pandas.Series, or a mix of all of those. You can also ask to return the result in a specific format (see documentation of the specific functions for the accepted formats).

>>> from py_vollib.black_scholes.implied_volatility import implied_volatility
>>> import py_vollib_vectorized
>>> price = 0.2
>>> flag = ['c', 'p']  # 'c' for call, 'p' for put
>>> S = (95, 10)  # price of the underlying
>>> K = 100  # strike
>>> t = pd.Series([.2])  # annualized time to expiration
>>> r = .2  # interest-free rate
>>> sigma = .2  # implied volatility
>>> implied_volatility(price, S, K, t, r, flag, return_as='series')
0    0.034543
1         NaN
Name: IV, dtype: float64

Here, the put contract is below the intrinsic price. Contracts below intrinsic or above maximum price are returned as NaNs.