voly 0.0.82__py3-none-any.whl → 0.0.84__py3-none-any.whl

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/client.py CHANGED
@@ -348,7 +348,7 @@ class VolyClient:
348
348
  return fit_results
349
349
 
350
350
  @staticmethod
351
- def get_iv_surface(fit_results: pd.DataFrame,
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
- - fit_results: DataFrame from fit_model()
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
- fit_results=fit_results,
368
+ model_results=model_results,
369
369
  log_moneyness_params=log_moneyness_params,
370
370
  return_domain=return_domain
371
371
  )
voly/core/fit.py CHANGED
@@ -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
  )
voly/core/interpolate.py CHANGED
@@ -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.84
4
4
  Summary: Options & volatility research package
5
5
  Author-email: Manu de Cara <manu.de.cara@gmail.com>
6
6
  License: MIT
@@ -1,18 +1,18 @@
1
1
  voly/__init__.py,sha256=8xyDk7rFCn_MOD5hxuv5cxxKZvBVRiSIM7TgaMPpwpw,211
2
- voly/client.py,sha256=Y6XidftiRTiFHuckv9HT8EyApF6zDjR14mryZeO0rGA,21828
2
+ voly/client.py,sha256=ABScTJhB-KXjv3ddJ6XEoSIt9DB4Z40TzH8GGalrox8,21859
3
3
  voly/exceptions.py,sha256=PBsbn1vNMvKcCJwwJ4lBO6glD85jo1h2qiEmD7ArAjs,92
4
4
  voly/formulas.py,sha256=wSbGAH6GuQThT9QyQY4Ud2eUf9fo1YFHglUmP6fNris,11871
5
5
  voly/models.py,sha256=LXXIlpXZQEfXTuCngxC8Hd3bWtw6wdXDCSGxTLmHM-c,3659
6
6
  voly/core/__init__.py,sha256=bu6fS2I1Pj9fPPnl-zY3L7NqrZSY5Zy6NY2uMUvdhKs,183
7
7
  voly/core/charts.py,sha256=ycZgbPeROYVRMO61auVXCGLmKZA2NwS3vLOsQ9wqCyo,27526
8
8
  voly/core/data.py,sha256=JCPD44UDSJqh83jjapAtXVpJEHm8Hq4JC8lVhl5Zb4A,8935
9
- voly/core/fit.py,sha256=lDlw4z5lehJSgpT4-J7NLq3wf42sQQM-0GHSlaATGKA,9223
10
- voly/core/interpolate.py,sha256=7FBx7EmbgET1I1-MD6o-nxCyGlAqcQJulCXYvzATisU,5243
9
+ voly/core/fit.py,sha256=g6slA9rBC2_Pys5ipAYZNzfCdHdaZF8To8c4HBGHviQ,9549
10
+ voly/core/interpolate.py,sha256=BzLwEuE-PIf0k0oVka7gH6NASlaEdtZAo7zUVwarkoQ,5384
11
11
  voly/core/rnd.py,sha256=8FTU-Qp9epW9yE4XSOdiFGIRXrGyXqF6mVgZn1NMvxk,11813
12
12
  voly/utils/__init__.py,sha256=E05mWatyC-PDOsCxQV1p5Xi1IgpOomxrNURyCx_gB-w,200
13
13
  voly/utils/logger.py,sha256=4-_2bVJmq17Q0d7Rd2mPg1AeR8gxv6EPvcmBDMFWcSM,1744
14
- voly-0.0.82.dist-info/LICENSE,sha256=wcHIVbE12jfcBOai_wqBKY6xvNQU5E909xL1zZNq_2Q,1065
15
- voly-0.0.82.dist-info/METADATA,sha256=uV23GWgeNRpVdmu6psFoJdeJJ7v1CwpoBL-C720BJnQ,4092
16
- voly-0.0.82.dist-info/WHEEL,sha256=52BFRY2Up02UkjOa29eZOS2VxUrpPORXg1pkohGGUS8,91
17
- voly-0.0.82.dist-info/top_level.txt,sha256=ZfLw2sSxF-LrKAkgGjOmeTcw6_gD-30zvtdEY5W4B7c,5
18
- voly-0.0.82.dist-info/RECORD,,
14
+ voly-0.0.84.dist-info/LICENSE,sha256=wcHIVbE12jfcBOai_wqBKY6xvNQU5E909xL1zZNq_2Q,1065
15
+ voly-0.0.84.dist-info/METADATA,sha256=uu6qkbgS5-LDwb6YMuZXolHTmTrYk5QncG42L-EN9PU,4092
16
+ voly-0.0.84.dist-info/WHEEL,sha256=52BFRY2Up02UkjOa29eZOS2VxUrpPORXg1pkohGGUS8,91
17
+ voly-0.0.84.dist-info/top_level.txt,sha256=ZfLw2sSxF-LrKAkgGjOmeTcw6_gD-30zvtdEY5W4B7c,5
18
+ voly-0.0.84.dist-info/RECORD,,
File without changes
File without changes