voly 0.0.82__tar.gz → 0.0.83__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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: voly
3
- Version: 0.0.82
3
+ Version: 0.0.83
4
4
  Summary: Options & volatility research package
5
5
  Author-email: Manu de Cara <manu.de.cara@gmail.com>
6
6
  License: MIT
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "voly"
7
- version = "0.0.82"
7
+ version = "0.0.83"
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.82"
63
+ python_version = "0.0.83"
64
64
  warn_return_any = true
65
65
  warn_unused_configs = true
66
66
  disallow_untyped_defs = true
@@ -188,14 +188,16 @@ def fit_model(option_chain: pd.DataFrame,
188
188
 
189
189
 
190
190
  @catch_exception
191
- def get_iv_surface(fit_results: pd.DataFrame,
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
- - fit_results: DataFrame from fit_model() with maturity names as index
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 maturity in fit_results.index:
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[maturity, 'a'],
220
- fit_results.loc[maturity, 'b'],
221
- fit_results.loc[maturity, 'sigma'],
222
- fit_results.loc[maturity, 'rho'],
223
- fit_results.loc[maturity, 'm']
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[maturity, 'ytm']
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[maturity, 's'],
237
- r=fit_results.loc[maturity, 'r'],
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]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: voly
3
- Version: 0.0.82
3
+ Version: 0.0.83
4
4
  Summary: Options & volatility research package
5
5
  Author-email: Manu de Cara <manu.de.cara@gmail.com>
6
6
  License: MIT
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