voly 0.0.82__tar.gz → 0.0.84__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {voly-0.0.82/src/voly.egg-info → voly-0.0.84}/PKG-INFO +1 -1
- {voly-0.0.82 → voly-0.0.84}/pyproject.toml +2 -2
- {voly-0.0.82 → voly-0.0.84}/src/voly/client.py +3 -3
- {voly-0.0.82 → voly-0.0.84}/src/voly/core/fit.py +18 -11
- {voly-0.0.82 → voly-0.0.84}/src/voly/core/interpolate.py +5 -2
- {voly-0.0.82 → voly-0.0.84/src/voly.egg-info}/PKG-INFO +1 -1
- {voly-0.0.82 → voly-0.0.84}/LICENSE +0 -0
- {voly-0.0.82 → voly-0.0.84}/README.md +0 -0
- {voly-0.0.82 → voly-0.0.84}/setup.cfg +0 -0
- {voly-0.0.82 → voly-0.0.84}/setup.py +0 -0
- {voly-0.0.82 → voly-0.0.84}/src/voly/__init__.py +0 -0
- {voly-0.0.82 → voly-0.0.84}/src/voly/core/__init__.py +0 -0
- {voly-0.0.82 → voly-0.0.84}/src/voly/core/charts.py +0 -0
- {voly-0.0.82 → voly-0.0.84}/src/voly/core/data.py +0 -0
- {voly-0.0.82 → voly-0.0.84}/src/voly/core/rnd.py +0 -0
- {voly-0.0.82 → voly-0.0.84}/src/voly/exceptions.py +0 -0
- {voly-0.0.82 → voly-0.0.84}/src/voly/formulas.py +0 -0
- {voly-0.0.82 → voly-0.0.84}/src/voly/models.py +0 -0
- {voly-0.0.82 → voly-0.0.84}/src/voly/utils/__init__.py +0 -0
- {voly-0.0.82 → voly-0.0.84}/src/voly/utils/logger.py +0 -0
- {voly-0.0.82 → voly-0.0.84}/src/voly.egg-info/SOURCES.txt +0 -0
- {voly-0.0.82 → voly-0.0.84}/src/voly.egg-info/dependency_links.txt +0 -0
- {voly-0.0.82 → voly-0.0.84}/src/voly.egg-info/requires.txt +0 -0
- {voly-0.0.82 → voly-0.0.84}/src/voly.egg-info/top_level.txt +0 -0
- {voly-0.0.82 → voly-0.0.84}/tests/test_client.py +0 -0
| @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" | |
| 4 4 |  | 
| 5 5 | 
             
            [project]
         | 
| 6 6 | 
             
            name = "voly"
         | 
| 7 | 
            -
            version = "0.0. | 
| 7 | 
            +
            version = "0.0.84"
         | 
| 8 8 | 
             
            description = "Options & volatility research package"
         | 
| 9 9 | 
             
            readme = "README.md"
         | 
| 10 10 | 
             
            authors = [
         | 
| @@ -60,7 +60,7 @@ line_length = 100 | |
| 60 60 | 
             
            multi_line_output = 3
         | 
| 61 61 |  | 
| 62 62 | 
             
            [tool.mypy]
         | 
| 63 | 
            -
            python_version = "0.0. | 
| 63 | 
            +
            python_version = "0.0.84"
         | 
| 64 64 | 
             
            warn_return_any = true
         | 
| 65 65 | 
             
            warn_unused_configs = true
         | 
| 66 66 | 
             
            disallow_untyped_defs = true
         | 
| @@ -348,7 +348,7 @@ class VolyClient: | |
| 348 348 | 
             
                    return fit_results
         | 
| 349 349 |  | 
| 350 350 | 
             
                @staticmethod
         | 
| 351 | 
            -
                def get_iv_surface( | 
| 351 | 
            +
                def get_iv_surface(model_results: pd.DataFrame,
         | 
| 352 352 | 
             
                                   log_moneyness_params: Tuple[float, float, int] = (-2, 2, 500),
         | 
| 353 353 | 
             
                                   return_domain: str = 'log_moneyness',
         | 
| 354 354 | 
             
                                   ) -> Dict[str, Any]:
         | 
| @@ -356,7 +356,7 @@ class VolyClient: | |
| 356 356 | 
             
                    Generate implied volatility surface using optimized SVI parameters.
         | 
| 357 357 |  | 
| 358 358 | 
             
                    Parameters:
         | 
| 359 | 
            -
                        -  | 
| 359 | 
            +
                        - model_results: DataFrame from fit_model() or interpolate_model()
         | 
| 360 360 | 
             
                        - log_moneyness_params: Tuple of (min, max, num_points) for the moneyness grid
         | 
| 361 361 | 
             
                        - return_domain: str Domain for x-axis values ('log_moneyness', 'moneyness', 'strikes', 'delta')
         | 
| 362 362 |  | 
| @@ -365,7 +365,7 @@ class VolyClient: | |
| 365 365 | 
             
                    """
         | 
| 366 366 | 
             
                    # Generate the surface
         | 
| 367 367 | 
             
                    iv_surface, x_surface = get_iv_surface(
         | 
| 368 | 
            -
                         | 
| 368 | 
            +
                        model_results=model_results,
         | 
| 369 369 | 
             
                        log_moneyness_params=log_moneyness_params,
         | 
| 370 370 | 
             
                        return_domain=return_domain
         | 
| 371 371 | 
             
                    )
         | 
| @@ -188,14 +188,16 @@ def fit_model(option_chain: pd.DataFrame, | |
| 188 188 |  | 
| 189 189 |  | 
| 190 190 | 
             
            @catch_exception
         | 
| 191 | 
            -
            def get_iv_surface( | 
| 191 | 
            +
            def get_iv_surface(model_results: pd.DataFrame,
         | 
| 192 192 | 
             
                               log_moneyness_params: Tuple[float, float, int] = (-1.5, 1.5, 1000),
         | 
| 193 193 | 
             
                               return_domain: str = 'log_moneyness') -> Tuple[Dict[str, np.ndarray], Dict[str, np.ndarray]]:
         | 
| 194 194 | 
             
                """
         | 
| 195 195 | 
             
                Generate implied volatility surface using optimized SVI parameters.
         | 
| 196 196 |  | 
| 197 | 
            +
                Works with both regular fit_results and interpolated_results dataframes.
         | 
| 198 | 
            +
             | 
| 197 199 | 
             
                Parameters:
         | 
| 198 | 
            -
                -  | 
| 200 | 
            +
                - model_results: DataFrame from fit_model() or interpolate_model()
         | 
| 199 201 | 
             
                - log_moneyness_params: Tuple of (min, max, num_points) for the moneyness grid
         | 
| 200 202 | 
             
                - return_domain: Domain for x-axis values ('log_moneyness', 'moneyness', 'strikes', 'delta')
         | 
| 201 203 |  | 
| @@ -204,6 +206,11 @@ def get_iv_surface(fit_results: pd.DataFrame, | |
| 204 206 | 
             
                  iv_surface: Dictionary mapping maturity names to IV arrays
         | 
| 205 207 | 
             
                  x_surface: Dictionary mapping maturity names to requested x domain arrays
         | 
| 206 208 | 
             
                """
         | 
| 209 | 
            +
                # Check if required columns are present
         | 
| 210 | 
            +
                required_columns = ['a', 'b', 'rho', 'm', 'sigma', 'ytm']
         | 
| 211 | 
            +
                missing_columns = [col for col in required_columns if col not in model_results.columns]
         | 
| 212 | 
            +
                if missing_columns:
         | 
| 213 | 
            +
                    raise VolyError(f"Required columns missing in model_results: {missing_columns}")
         | 
| 207 214 |  | 
| 208 215 | 
             
                # Generate implied volatility surface in log-moneyness domain
         | 
| 209 216 | 
             
                min_m, max_m, num_points = log_moneyness_params
         | 
| @@ -213,16 +220,16 @@ def get_iv_surface(fit_results: pd.DataFrame, | |
| 213 220 | 
             
                x_surface = {}
         | 
| 214 221 |  | 
| 215 222 | 
             
                # Process each maturity
         | 
| 216 | 
            -
                for  | 
| 223 | 
            +
                for i in model_results.index:
         | 
| 217 224 | 
             
                    # Calculate SVI total implied variance and convert to IV
         | 
| 218 225 | 
             
                    params = [
         | 
| 219 | 
            -
                        fit_results.loc[ | 
| 220 | 
            -
                        fit_results.loc[ | 
| 221 | 
            -
                        fit_results.loc[ | 
| 222 | 
            -
                        fit_results.loc[ | 
| 223 | 
            -
                        fit_results.loc[ | 
| 226 | 
            +
                        fit_results.loc[i, 'a'],
         | 
| 227 | 
            +
                        fit_results.loc[i, 'b'],
         | 
| 228 | 
            +
                        fit_results.loc[i, 'sigma'],
         | 
| 229 | 
            +
                        fit_results.loc[i, 'rho'],
         | 
| 230 | 
            +
                        fit_results.loc[i, 'm']
         | 
| 224 231 | 
             
                    ]
         | 
| 225 | 
            -
                    ytm = fit_results.loc[ | 
| 232 | 
            +
                    ytm = fit_results.loc[i, 'ytm']
         | 
| 226 233 |  | 
| 227 234 | 
             
                    # Calculate implied volatility
         | 
| 228 235 | 
             
                    w_svi = np.array([SVIModel.svi(x, *params) for x in log_moneyness_array])
         | 
| @@ -233,8 +240,8 @@ def get_iv_surface(fit_results: pd.DataFrame, | |
| 233 240 | 
             
                    x_surface[maturity] = get_x_domain(
         | 
| 234 241 | 
             
                        log_moneyness_params=log_moneyness_params,
         | 
| 235 242 | 
             
                        return_domain=return_domain,
         | 
| 236 | 
            -
                        s=fit_results.loc[ | 
| 237 | 
            -
                        r=fit_results.loc[ | 
| 243 | 
            +
                        s=fit_results.loc[i, 's'],
         | 
| 244 | 
            +
                        r=fit_results.loc[i, 'r'],
         | 
| 238 245 | 
             
                        iv_array=iv_array,
         | 
| 239 246 | 
             
                        ytm=ytm
         | 
| 240 247 | 
             
                    )
         | 
| @@ -88,6 +88,9 @@ def interpolate_model(fit_results: pd.DataFrame, | |
| 88 88 |  | 
| 89 89 | 
             
                # Sort fit_results by ytm
         | 
| 90 90 | 
             
                sorted_fit_results = fit_results.iloc[sorted_indices]
         | 
| 91 | 
            +
                recent_row = sorted_fit_results.iloc[-1]
         | 
| 92 | 
            +
                interpolated_df['s'] = recent_row['s']
         | 
| 93 | 
            +
                interpolated_df['r'] = recent_row['r']
         | 
| 91 94 |  | 
| 92 95 | 
             
                # Interpolate model parameters
         | 
| 93 96 | 
             
                for param in param_columns:
         | 
| @@ -117,8 +120,8 @@ def interpolate_model(fit_results: pd.DataFrame, | |
| 117 120 | 
             
                            interpolated_df[param] = f(target_years)
         | 
| 118 121 |  | 
| 119 122 | 
             
                # Ensure consistent ordering of columns with expected structure
         | 
| 120 | 
            -
                expected_columns = ['u', 'maturity_date', 'dtm', 'ytm', 'a', 'b', 'rho', 'm', 'sigma',
         | 
| 121 | 
            -
                                    'nu', 'psi', 'p', 'c', 'nu_tilde']
         | 
| 123 | 
            +
                expected_columns = ['s', 'u', 'maturity_date', 'dtm', 'ytm', 'a', 'b', 'rho', 'm', 'sigma',
         | 
| 124 | 
            +
                                    'nu', 'psi', 'p', 'c', 'nu_tilde', 'r']
         | 
| 122 125 |  | 
| 123 126 | 
             
                # Create final column order based on available columns
         | 
| 124 127 | 
             
                column_order = [col for col in expected_columns if col in interpolated_df.columns]
         | 
| 
            File without changes
         | 
| 
            File without changes
         | 
| 
            File without changes
         | 
| 
            File without changes
         | 
| 
            File without changes
         | 
| 
            File without changes
         | 
| 
            File without changes
         | 
| 
            File without changes
         | 
| 
            File without changes
         | 
| 
            File without changes
         | 
| 
            File without changes
         | 
| 
            File without changes
         | 
| 
            File without changes
         | 
| 
            File without changes
         | 
| 
            File without changes
         | 
| 
            File without changes
         | 
| 
            File without changes
         | 
| 
            File without changes
         | 
| 
            File without changes
         |