Arbitrage Smoothing

class TonicSmoother(*args, **kwargs)

Bases: object

classmethod __caller__(vslice, space='volatility|price')

Check if current slice has butterfly arbitrages. a) If there are none, we return a copy. b) If there are, we transform the k->sigma(k) using isotonic regression for dC/dk so as to remove arbitrages.

CAVEAT: The resulting slice is not garanteed to be arbitrage free. Thus we return a “success” boolean too.

Parameters:
Return type:

Tuple[bool, KVMVolSlice]

class HullSmoother(*args, **kwargs)

Bases: object

classmethod __caller__(vslice, interpolate=False)

This method is mostly suitable for a vol slice based on ask prices only. It relies on the fact the mapping k->call_price(k) should be convex (and decreasing). In the case of ask prices it means the “ideal” price curve is lower than the convex hull of the ask price curve. This function returns a vol slice based solely on the strikes whose ask prices are on the boundary of that convex hull.

WARNING: In the following example the method returns the upper bound :

as_of_date = date(2024, 12, 5) ticker = ‘DE’ expiration_date = datetime.date(2025, 1, 17)

This requires more investigation

To review:

GE, 2025 Feb 21 NVDA, 2024 Dec 13 AMD, 2025 Mar 21 JNJ, 2025 Mar 21 MRK, 2025 Jun 20

Parameters:
Return type:

Tuple[bool, KVMVolSlice]

class QPSmoother(*args, **kwargs)

Bases: object

classmethod __caller__(vslice, side)
Parameters:
Return type:

Tuple[bool, KVMVolSlice]