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.