From 45a9c6676ac030dac8c03bf6fbc5a2c11f902c3c Mon Sep 17 00:00:00 2001 From: Chuck Cadman Date: Tue, 17 Jan 2023 13:09:13 -0800 Subject: [PATCH 1/8] Remove _calculate_tau definition which is overwritten below. --- volatilipy/helper_functions.py | 22 ---------------------- 1 file changed, 22 deletions(-) diff --git a/volatilipy/helper_functions.py b/volatilipy/helper_functions.py index 6a0e00f..79304a0 100644 --- a/volatilipy/helper_functions.py +++ b/volatilipy/helper_functions.py @@ -106,28 +106,6 @@ def _generate_date_df( return date_df -def _calculate_tau( - end_date: ql.Date, - start_date: ql.Date, - day_count_convention: ql.DayCounter, -) -> float: - """Function to calculate a tau/difference in time from Quantlib objects - - Args: - end_date (ql.Date): End date - start_date (ql.Date): Start date - day_count_convention (ql.DayCounter): What basis of days to use; - ActualActual, 30/360, etc. - - Returns: - float: tau in years of the difference between the two dates - """ - - if isinstance(end_date, pd.core.series.Series): - end_date = end_date["QuantlibDate"] - return day_count_convention.yearFraction(start_date, end_date) - - def _calculate_dtm( end_date: ql.Date, start_date: ql.Date, From a1f00b225d211f06dcbf0c15d313131b045e5b2e Mon Sep 17 00:00:00 2001 From: Chuck Cadman Date: Tue, 17 Jan 2023 13:13:55 -0800 Subject: [PATCH 2/8] Remove unused method _get_option_rfr --- volatilipy/helper_functions.py | 28 ---------------------------- 1 file changed, 28 deletions(-) diff --git a/volatilipy/helper_functions.py b/volatilipy/helper_functions.py index 79304a0..ae0e6fd 100644 --- a/volatilipy/helper_functions.py +++ b/volatilipy/helper_functions.py @@ -174,34 +174,6 @@ def _create_ql_vol_grid( return implied_vols -# Helper functions for the implied vol object -def _get_option_rfr( - risk_free_rates: pd.DataFrame, - position: namedtuple, - day_count_convention: ql.DayCounter, - rate_column_name: str, -) -> float: - """Method to pull market data that is specific to one option (namely volatility - and a risk free rate) - - Args: - risk_free_rates (pd.DataFrame): Dataframe containing risk free rates. Used to - pull the risk free rate corresponding to the date of maturity of the option - position (namedtuple): A named tuple that represents one option position; used to - retrieve the maturity date and strike - day_count_convention (QuantLibday_count_convention): Method to determine how to count days - between two dates - Returns: - risk_free_rate: The risk free rate - """ - - rate = ql.SimpleQuote(risk_free_rates[rate_column_name][position.exercise_date]) - risk_free_rate = ql.FlatForward( - 0, ql.TARGET(), ql.QuoteHandle(rate), day_count_convention - ) - return (risk_free_rate,) - - def _setup_quantlib_economy( valuation_date: datetime, index_values: float64, dividend_yields: float64 ) -> Tuple: From 8187674ae10acd55bbd1367c56e608f96bd41af7 Mon Sep 17 00:00:00 2001 From: Chuck Cadman Date: Tue, 17 Jan 2023 13:40:47 -0800 Subject: [PATCH 3/8] Streamline some logic so that code coverage reaches 100%. --- volatilipy/helper_functions.py | 28 +++++++++------------------- 1 file changed, 9 insertions(+), 19 deletions(-) diff --git a/volatilipy/helper_functions.py b/volatilipy/helper_functions.py index ae0e6fd..99ae5db 100644 --- a/volatilipy/helper_functions.py +++ b/volatilipy/helper_functions.py @@ -355,10 +355,8 @@ def _drop_valdate_row(option_df: pd.DataFrame, valuation_date: date) -> pd.DataF pd.Timestamp(valuation_date) in option_df.index or valuation_date in option_df.index ): - cleaned_df = option_df.drop([valuation_date]) - else: - cleaned_df = option_df - return cleaned_df + option_df = option_df.drop([valuation_date]) + return option_df def _sort_df(option_df: pd.DataFrame): @@ -375,31 +373,23 @@ def _datetime_to_quantlib_date( Args: input_datetime (Union[datetime, pd.Series]): Either a datetime object or a pandas series object that contains datetime objects + datetime_column_name (str, Optional): the index value of the datetime to convert. + This is only used if input_datetime is a Series containing more than one row. + Optional, defaults to 'exercise_date'. Returns: ql.Date: The same dates, represented as Quantlib objects """ if isinstance(input_datetime, pd.core.series.Series): - cols = input_datetime.shape[0] - if cols > 1: - return_date = ql.Date( - input_datetime.loc[datetime_column_name].day, - input_datetime.loc[datetime_column_name].month, - input_datetime.loc[datetime_column_name].year, - ) + if len(input_datetime.index) > 1: + input_datetime = input_datetime.loc[datetime_column_name] else: - return_date = ql.Date( - input_datetime[0].day, - input_datetime[0].month, - input_datetime[0].year, - ) - else: - return_date = ql.Date( + input_datetime = input_datetime[0] + return ql.Date( input_datetime.day, input_datetime.month, input_datetime.year, ) - return return_date def _create_quantlib_option(dataframe_row: pd.Series) -> ql.EuropeanOption: From 04a009b8434dbb81fafd584fdcff0697e68b4100 Mon Sep 17 00:00:00 2001 From: Chuck Cadman Date: Tue, 17 Jan 2023 14:05:43 -0800 Subject: [PATCH 4/8] Fix ql.ActualActual() deprecation. --- volatilipy/helper_functions.py | 6 +++--- volatilipy/volatility_surface.py | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/volatilipy/helper_functions.py b/volatilipy/helper_functions.py index 99ae5db..bd0b303 100644 --- a/volatilipy/helper_functions.py +++ b/volatilipy/helper_functions.py @@ -98,10 +98,10 @@ def _generate_date_df( date_df = date_df.to_frame(index=True, name="expiryDate") date_df["QuantlibDate"] = date_df.apply(_datetime_to_quantlib_date, axis=1) date_df["tau"] = date_df.apply( - _calculate_tau, args=(vol_surface.referenceDate(), ql.ActualActual()), axis=1 + _calculate_tau, args=(vol_surface.referenceDate(), ql.ActualActual(ql.ActualActual.ISDA)), axis=1 ) date_df["days_to_maturity"] = date_df.apply( - _calculate_dtm, args=(vol_surface.referenceDate(), ql.ActualActual()), axis=1 + _calculate_dtm, args=(vol_surface.referenceDate(), ql.ActualActual(ql.ActualActual.ISDA)), axis=1 ) return date_df @@ -191,7 +191,7 @@ def _setup_quantlib_economy( valuation_date.day, valuation_date.month, valuation_date.year ) ql.Settings.instance().evaluationDate = valuation_date_for_quantlib - day_count_convention = ql.ActualActual() + day_count_convention = ql.ActualActual(ql.ActualActual.ISDA) spot = index_values spot_quote = ql.QuoteHandle(ql.SimpleQuote(spot)) diff --git a/volatilipy/volatility_surface.py b/volatilipy/volatility_surface.py index 0d7e2a6..37d10b8 100644 --- a/volatilipy/volatility_surface.py +++ b/volatilipy/volatility_surface.py @@ -22,7 +22,7 @@ class VolatilitySurface(ql.BlackVarianceSurface): Args: options_data (OptionsData): Options data on which to fit the surface day_count (ql.DayCounter, optional): Day counter to use with Quantlib. - Defaults to ql.ActualActual(). + Defaults to ql.ActualActual(ql.ActualActual.ISDA). calendar (ql.Calendar, optional): Calendar to use with Quantlib. Defaults to ql.UnitedStates(). allow_extrapolation (boolean, optional): Flag to enable extrapolation. @@ -39,7 +39,7 @@ def __init__( self, options_data: OptionsData = None, volatility_grid: pd.DataFrame = None, - day_count: ql.DayCounter = ql.ActualActual(), + day_count: ql.DayCounter = ql.ActualActual(ql.ActualActual.ISDA), calendar: ql.Calendar = ql.UnitedStates(), allow_extrapolation: bool = False, valuation_date: datetime = None, From d68167b76bad83584aa11c272f26c29ba389c503 Mon Sep 17 00:00:00 2001 From: Chuck Cadman Date: Tue, 17 Jan 2023 14:26:06 -0800 Subject: [PATCH 5/8] Fix ql.UnitedStates() deprecation. --- volatilipy/volatility_surface.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/volatilipy/volatility_surface.py b/volatilipy/volatility_surface.py index 37d10b8..3332ae1 100644 --- a/volatilipy/volatility_surface.py +++ b/volatilipy/volatility_surface.py @@ -24,7 +24,7 @@ class VolatilitySurface(ql.BlackVarianceSurface): day_count (ql.DayCounter, optional): Day counter to use with Quantlib. Defaults to ql.ActualActual(ql.ActualActual.ISDA). calendar (ql.Calendar, optional): Calendar to use with Quantlib. - Defaults to ql.UnitedStates(). + Defaults to ql.UnitedStates(ql.UnitedStates.Settlement). allow_extrapolation (boolean, optional): Flag to enable extrapolation. Defaults to False, consistent with Quantlib. interpolation_method (str, optional): Define interpolation method to use. @@ -40,7 +40,7 @@ def __init__( options_data: OptionsData = None, volatility_grid: pd.DataFrame = None, day_count: ql.DayCounter = ql.ActualActual(ql.ActualActual.ISDA), - calendar: ql.Calendar = ql.UnitedStates(), + calendar: ql.Calendar = ql.UnitedStates(ql.UnitedStates.Settlement), allow_extrapolation: bool = False, valuation_date: datetime = None, interpolation_method: str = "Bilinear", From 9a57e9ec0a99dafe85450c8b182d0affa02c75d6 Mon Sep 17 00:00:00 2001 From: Chuck Cadman Date: Tue, 17 Jan 2023 14:29:58 -0800 Subject: [PATCH 6/8] Fix pandas numeric_only FutureWarning. --- volatilipy/helper_functions.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/volatilipy/helper_functions.py b/volatilipy/helper_functions.py index bd0b303..c7566e8 100644 --- a/volatilipy/helper_functions.py +++ b/volatilipy/helper_functions.py @@ -287,7 +287,7 @@ def _average_across_options( option_df.groupby( [column_name_mapping["strike"], column_name_mapping["expiration"]] ) - .mean() + .mean(numeric_only=True) .reset_index() ) From bec07e5b140deb3410f004ea3a5c0ceb989125b8 Mon Sep 17 00:00:00 2001 From: Chuck Cadman Date: Tue, 17 Jan 2023 14:31:56 -0800 Subject: [PATCH 7/8] Update version. --- HISTORY.rst | 5 +++++ volatilipy/__init__.py | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/HISTORY.rst b/HISTORY.rst index 6792d74..461f16d 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -1,6 +1,11 @@ ======= History ======= +0.1.4 (2023-01-17) +------------------ +* Fix Quantlib deprecations in ActualActual() and UnitedStates(). +* Fix pandas FutureWarning involving numeric_only default value. + 0.1.3 (2022-10-11) ------------------ * Drop the 'how' parameter from _drop_sparse_columns() for coherence with Pandas 1.5.0 diff --git a/volatilipy/__init__.py b/volatilipy/__init__.py index c4ab8c0..b42e95f 100644 --- a/volatilipy/__init__.py +++ b/volatilipy/__init__.py @@ -2,7 +2,7 @@ __author__ = """Aaron Smith""" __email__ = "aaronsmith1234@gmail.com" -__version__ = "0.1.3" +__version__ = "0.1.4" # pylint: disable=unused-import From 73ee1a45bf80f1cf22adbc0701018e7446cce629 Mon Sep 17 00:00:00 2001 From: Chuck Cadman Date: Tue, 17 Jan 2023 16:05:19 -0800 Subject: [PATCH 8/8] Update minimum versions. --- requirements.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/requirements.txt b/requirements.txt index 70df8da..51ad188 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,2 +1,2 @@ -pandas>=1.1.4 -QuantLib>=1.20 +pandas>=1.3.4 +QuantLib>=1.24