voly 0.0.200__py3-none-any.whl → 0.0.202__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/core/fit.py +25 -23
- {voly-0.0.200.dist-info → voly-0.0.202.dist-info}/METADATA +1 -1
- {voly-0.0.200.dist-info → voly-0.0.202.dist-info}/RECORD +6 -6
- {voly-0.0.200.dist-info → voly-0.0.202.dist-info}/WHEEL +0 -0
- {voly-0.0.200.dist-info → voly-0.0.202.dist-info}/licenses/LICENSE +0 -0
- {voly-0.0.200.dist-info → voly-0.0.202.dist-info}/top_level.txt +0 -0
voly/core/fit.py
CHANGED
@@ -32,9 +32,7 @@ def fit_model(option_chain: pd.DataFrame, num_points: int = 2000) -> Tuple[pd.Da
|
|
32
32
|
- num_points: Number of points for k_grid and plotting
|
33
33
|
|
34
34
|
Returns:
|
35
|
-
-
|
36
|
-
results_df: DataFrame with all fit results and performance metrics as columns, maturity_dates as index
|
37
|
-
params_dict: Dictionary mapping maturity_dates to (t, params)
|
35
|
+
- results_df: DataFrame with all fit results and performance metrics as columns, maturity_names as index
|
38
36
|
"""
|
39
37
|
# Start overall timer
|
40
38
|
start_total = time.time()
|
@@ -192,6 +190,9 @@ def fit_model(option_chain: pd.DataFrame, num_points: int = 2000) -> Tuple[pd.Da
|
|
192
190
|
# Create results DataFrame
|
193
191
|
results_df = pd.DataFrame(results_data, index=results_data['maturity_name'])
|
194
192
|
|
193
|
+
# Map maturity_date to maturity_name for indexing
|
194
|
+
date_to_name = dict(zip(results_data['maturity_date'], results_data['maturity_name']))
|
195
|
+
|
195
196
|
# Convert columns to appropriate types
|
196
197
|
for col, dtype in column_dtypes.items():
|
197
198
|
if col in results_df.columns:
|
@@ -234,7 +235,7 @@ def fit_model(option_chain: pd.DataFrame, num_points: int = 2000) -> Tuple[pd.Da
|
|
234
235
|
break
|
235
236
|
|
236
237
|
for mat in sorted_maturities:
|
237
|
-
results_df.at[mat, 'calendar_arbitrage_free'] = calendar_arbitrage_free
|
238
|
+
results_df.at[date_to_name[mat], 'calendar_arbitrage_free'] = calendar_arbitrage_free
|
238
239
|
|
239
240
|
# Calendar arbitrage correction
|
240
241
|
for i in range(1, len(sorted_maturities)):
|
@@ -293,24 +294,24 @@ def fit_model(option_chain: pd.DataFrame, num_points: int = 2000) -> Tuple[pd.Da
|
|
293
294
|
butterfly_arbitrage_free = False
|
294
295
|
break
|
295
296
|
|
296
|
-
results_df.at[mat2, 'a'] = float(a_scaled)
|
297
|
-
results_df.at[mat2, 'b'] = float(b_scaled)
|
298
|
-
results_df.at[mat2, 'm'] = float(m)
|
299
|
-
results_df.at[mat2, 'rho'] = float(rho)
|
300
|
-
results_df.at[mat2, 'sigma'] = float(sigma)
|
301
|
-
results_df.at[mat2, 'nu'] = float(nu)
|
302
|
-
results_df.at[mat2, 'psi'] = float(psi)
|
303
|
-
results_df.at[mat2, 'p'] = float(p)
|
304
|
-
results_df.at[mat2, 'c'] = float(c)
|
305
|
-
results_df.at[mat2, 'nu_tilde'] = float(nu_tilde)
|
306
|
-
results_df.at[mat2, 'rmse'] = float(rmse)
|
307
|
-
results_df.at[mat2, 'mae'] = float(mae)
|
308
|
-
results_df.at[mat2, 'r2'] = float(r2)
|
309
|
-
results_df.at[mat2, 'max_error'] = float(max_error)
|
310
|
-
results_df.at[mat2, 'log_min_strike'] = float(log_min_strike)
|
311
|
-
results_df.at[mat2, 'usd_min_strike'] = float(usd_min_strike)
|
312
|
-
results_df.at[mat2, 'butterfly_arbitrage_free'] = butterfly_arbitrage_free
|
313
|
-
results_df.at[mat2, 'fit_success'] = bool(not np.isnan(a))
|
297
|
+
results_df.at[date_to_name[mat2], 'a'] = float(a_scaled)
|
298
|
+
results_df.at[date_to_name[mat2], 'b'] = float(b_scaled)
|
299
|
+
results_df.at[date_to_name[mat2], 'm'] = float(m)
|
300
|
+
results_df.at[date_to_name[mat2], 'rho'] = float(rho)
|
301
|
+
results_df.at[date_to_name[mat2], 'sigma'] = float(sigma)
|
302
|
+
results_df.at[date_to_name[mat2], 'nu'] = float(nu)
|
303
|
+
results_df.at[date_to_name[mat2], 'psi'] = float(psi)
|
304
|
+
results_df.at[date_to_name[mat2], 'p'] = float(p)
|
305
|
+
results_df.at[date_to_name[mat2], 'c'] = float(c)
|
306
|
+
results_df.at[date_to_name[mat2], 'nu_tilde'] = float(nu_tilde)
|
307
|
+
results_df.at[date_to_name[mat2], 'rmse'] = float(rmse)
|
308
|
+
results_df.at[date_to_name[mat2], 'mae'] = float(mae)
|
309
|
+
results_df.at[date_to_name[mat2], 'r2'] = float(r2)
|
310
|
+
results_df.at[date_to_name[mat2], 'max_error'] = float(max_error)
|
311
|
+
results_df.at[date_to_name[mat2], 'log_min_strike'] = float(log_min_strike)
|
312
|
+
results_df.at[date_to_name[mat2], 'usd_min_strike'] = float(usd_min_strike)
|
313
|
+
results_df.at[date_to_name[mat2], 'butterfly_arbitrage_free'] = butterfly_arbitrage_free
|
314
|
+
results_df.at[date_to_name[mat2], 'fit_success'] = bool(not np.isnan(a))
|
314
315
|
|
315
316
|
# Calendar arbitrage check (post-correction)
|
316
317
|
calendar_arbitrage_free = True
|
@@ -341,13 +342,14 @@ def fit_model(option_chain: pd.DataFrame, num_points: int = 2000) -> Tuple[pd.Da
|
|
341
342
|
break
|
342
343
|
|
343
344
|
for mat in sorted_maturities:
|
344
|
-
results_df.at[mat, 'calendar_arbitrage_free'] = calendar_arbitrage_free
|
345
|
+
results_df.at[date_to_name[mat], 'calendar_arbitrage_free'] = calendar_arbitrage_free
|
345
346
|
|
346
347
|
# End overall timer and print total time
|
347
348
|
end_total = time.time()
|
348
349
|
logger.info(f"Total execution time for the model: {end_total - start_total:.4f} seconds")
|
349
350
|
|
350
351
|
logger.info("Model fitting complete.")
|
352
|
+
results_df = results_df.drop(columns='maturity_name')
|
351
353
|
return results_df
|
352
354
|
|
353
355
|
|
@@ -6,15 +6,15 @@ voly/models.py,sha256=Wop6gZbvAOXSmI0JpYapjVSeJub_i8RLif2PzxRsfFE,7185
|
|
6
6
|
voly/core/__init__.py,sha256=bu6fS2I1Pj9fPPnl-zY3L7NqrZSY5Zy6NY2uMUvdhKs,183
|
7
7
|
voly/core/charts.py,sha256=2S-BfCo30aj1_xlNLqF-za5rQWxF_mWKIdtdOe5bgbw,12735
|
8
8
|
voly/core/data.py,sha256=9v9iuE2XdIIlzoRAB7q1ol7YghBzBsPGAiwZ11oDuis,13650
|
9
|
-
voly/core/fit.py,sha256=
|
9
|
+
voly/core/fit.py,sha256=Ya2g8tNHw_5QFqD66_U4b7z18iWYSF-q_SBeRqBSjU8,17443
|
10
10
|
voly/core/hd.py,sha256=UFAyLncNUHivpPAcko6IK1bC55mudVtdlRFfXp63HXE,14771
|
11
11
|
voly/core/interpolate.py,sha256=JkK172-FXyhesW3hY4pEeuJWG3Bugq7QZXbeKoRpLuo,5305
|
12
12
|
voly/core/rnd.py,sha256=GoC3m1Q46Wnk5tV_mstr-3_aktHeue6BBLh4DQTciW0,13307
|
13
13
|
voly/utils/__init__.py,sha256=E05mWatyC-PDOsCxQV1p5Xi1IgpOomxrNURyCx_gB-w,200
|
14
14
|
voly/utils/density.py,sha256=q0fX4im9TGwMCZ32Hzdv8CNh56KnJo8bmG5w0gVWZH8,5879
|
15
15
|
voly/utils/logger.py,sha256=4-_2bVJmq17Q0d7Rd2mPg1AeR8gxv6EPvcmBDMFWcSM,1744
|
16
|
-
voly-0.0.
|
17
|
-
voly-0.0.
|
18
|
-
voly-0.0.
|
19
|
-
voly-0.0.
|
20
|
-
voly-0.0.
|
16
|
+
voly-0.0.202.dist-info/licenses/LICENSE,sha256=wcHIVbE12jfcBOai_wqBKY6xvNQU5E909xL1zZNq_2Q,1065
|
17
|
+
voly-0.0.202.dist-info/METADATA,sha256=3CWte_z_H0YA3JgacjwwhwRekrDnjOyHnK30g7FkK8s,4115
|
18
|
+
voly-0.0.202.dist-info/WHEEL,sha256=pxyMxgL8-pra_rKaQ4drOZAegBVuX-G_4nRHjjgWbmo,91
|
19
|
+
voly-0.0.202.dist-info/top_level.txt,sha256=ZfLw2sSxF-LrKAkgGjOmeTcw6_gD-30zvtdEY5W4B7c,5
|
20
|
+
voly-0.0.202.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|