voly 0.0.175__tar.gz → 0.0.177__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.
Files changed (26) hide show
  1. {voly-0.0.175/src/voly.egg-info → voly-0.0.177}/PKG-INFO +1 -1
  2. {voly-0.0.175 → voly-0.0.177}/pyproject.toml +2 -2
  3. {voly-0.0.175 → voly-0.0.177}/src/voly/core/fit.py +9 -9
  4. {voly-0.0.175 → voly-0.0.177}/src/voly/models.py +13 -8
  5. {voly-0.0.175 → voly-0.0.177/src/voly.egg-info}/PKG-INFO +1 -1
  6. {voly-0.0.175 → voly-0.0.177}/LICENSE +0 -0
  7. {voly-0.0.175 → voly-0.0.177}/README.md +0 -0
  8. {voly-0.0.175 → voly-0.0.177}/setup.cfg +0 -0
  9. {voly-0.0.175 → voly-0.0.177}/setup.py +0 -0
  10. {voly-0.0.175 → voly-0.0.177}/src/voly/__init__.py +0 -0
  11. {voly-0.0.175 → voly-0.0.177}/src/voly/client.py +0 -0
  12. {voly-0.0.175 → voly-0.0.177}/src/voly/core/__init__.py +0 -0
  13. {voly-0.0.175 → voly-0.0.177}/src/voly/core/charts.py +0 -0
  14. {voly-0.0.175 → voly-0.0.177}/src/voly/core/data.py +0 -0
  15. {voly-0.0.175 → voly-0.0.177}/src/voly/core/hd.py +0 -0
  16. {voly-0.0.175 → voly-0.0.177}/src/voly/core/interpolate.py +0 -0
  17. {voly-0.0.175 → voly-0.0.177}/src/voly/core/rnd.py +0 -0
  18. {voly-0.0.175 → voly-0.0.177}/src/voly/exceptions.py +0 -0
  19. {voly-0.0.175 → voly-0.0.177}/src/voly/formulas.py +0 -0
  20. {voly-0.0.175 → voly-0.0.177}/src/voly/utils/__init__.py +0 -0
  21. {voly-0.0.175 → voly-0.0.177}/src/voly/utils/density.py +0 -0
  22. {voly-0.0.175 → voly-0.0.177}/src/voly/utils/logger.py +0 -0
  23. {voly-0.0.175 → voly-0.0.177}/src/voly.egg-info/SOURCES.txt +0 -0
  24. {voly-0.0.175 → voly-0.0.177}/src/voly.egg-info/dependency_links.txt +0 -0
  25. {voly-0.0.175 → voly-0.0.177}/src/voly.egg-info/requires.txt +0 -0
  26. {voly-0.0.175 → voly-0.0.177}/src/voly.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: voly
3
- Version: 0.0.175
3
+ Version: 0.0.177
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.175"
7
+ version = "0.0.177"
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.175"
63
+ python_version = "0.0.177"
64
64
  warn_return_any = true
65
65
  warn_unused_configs = true
66
66
  disallow_untyped_defs = true
@@ -133,7 +133,7 @@ def fit_model(option_chain: pd.DataFrame,
133
133
  nu, psi, p, c, nu_tilde = SVIModel.raw_to_jw_params(a_scaled, b_scaled, m, rho, sigma, t)
134
134
 
135
135
  # Calculate model predictions for statistics
136
- w_model = np.array([SVIModel.svi(x, a_scaled, b_scaled, m, rho, sigma) for x in k_masked])
136
+ w_model = np.array([SVIModel.svi_raw(x, a_scaled, b_scaled, m, rho, sigma) for x in k_masked])
137
137
  iv_model = np.sqrt(w_model / t)
138
138
  iv_market = iv_masked
139
139
 
@@ -150,7 +150,7 @@ def fit_model(option_chain: pd.DataFrame,
150
150
  # Check butterfly arbitrage
151
151
  k_range = np.linspace(min(k_masked), max(k_masked), domain_params[2])
152
152
  for k_val in k_range:
153
- wk = SVIModel.svi(k_val, a_scaled, b_scaled, m, rho, sigma)
153
+ wk = SVIModel.svi_raw(k_val, a_scaled, b_scaled, m, rho, sigma)
154
154
  wp = SVIModel.svi_d(k_val, a_scaled, b_scaled, m, rho, sigma)
155
155
  wpp = SVIModel.svi_dd(k_val, a_scaled, b_scaled, m, rho, sigma)
156
156
  g = (1 - (k_val * wp) / (2 * wk)) ** 2 - (wp ** 2) / 4 * (1 / wk + 1 / 4) + wpp / 2
@@ -222,8 +222,8 @@ def fit_model(option_chain: pd.DataFrame,
222
222
 
223
223
  # Check arbitrage on a grid of points
224
224
  for k_val in k_grid:
225
- w1 = SVIModel.svi(k_val, a1 * t1, b1 * t1, m1, rho1, sigma1)
226
- w2 = SVIModel.svi(k_val, a2 * t2, b2 * t2, m2, rho2, sigma2)
225
+ w1 = SVIModel.svi_raw(k_val, a1 * t1, b1 * t1, m1, rho1, sigma1)
226
+ w2 = SVIModel.svi_raw(k_val, a2 * t2, b2 * t2, m2, rho2, sigma2)
227
227
  if w2 < w1 - 1e-6:
228
228
  calendar_arbitrage_free = False
229
229
  logger.warning(
@@ -291,7 +291,7 @@ def fit_model(option_chain: pd.DataFrame,
291
291
  nu, psi, p, c, nu_tilde = SVIModel.raw_to_jw_params(a_scaled, b_scaled, m, rho, sigma, t2)
292
292
 
293
293
  # Calculate model predictions for statistics
294
- w_model = np.array([SVIModel.svi(x, a_scaled, b_scaled, m, rho, sigma) for x in k_masked])
294
+ w_model = np.array([SVIModel.svi_raw(x, a_scaled, b_scaled, m, rho, sigma) for x in k_masked])
295
295
  iv_model = np.sqrt(w_model / t2)
296
296
  iv_market = iv_masked
297
297
 
@@ -309,7 +309,7 @@ def fit_model(option_chain: pd.DataFrame,
309
309
  butterfly_arbitrage_free = True
310
310
  k_range = np.linspace(min(k_masked), max(k_masked), domain_params[2])
311
311
  for k_val in k_range:
312
- wk = SVIModel.svi(k_val, a_scaled, b_scaled, m, rho, sigma)
312
+ wk = SVIModel.svi_raw(k_val, a_scaled, b_scaled, m, rho, sigma)
313
313
  wp = SVIModel.svi_d(k_val, a_scaled, b_scaled, m, rho, sigma)
314
314
  wpp = SVIModel.svi_dd(k_val, a_scaled, b_scaled, m, rho, sigma)
315
315
  g = (1 - (k_val * wp) / (2 * wk)) ** 2 - (wp ** 2) / 4 * (1 / wk + 1 / 4) + wpp / 2
@@ -353,8 +353,8 @@ def fit_model(option_chain: pd.DataFrame,
353
353
 
354
354
  # Check arbitrage on a grid of points
355
355
  for k_val in k_grid:
356
- w1 = SVIModel.svi(k_val, a1 * t1, b1 * t1, m1, rho1, sigma1)
357
- w2 = SVIModel.svi(k_val, a2 * t2, b2 * t2, m2, rho2, sigma2)
356
+ w1 = SVIModel.svi_raw(k_val, a1 * t1, b1 * t1, m1, rho1, sigma1)
357
+ w2 = SVIModel.svi_raw(k_val, a2 * t2, b2 * t2, m2, rho2, sigma2)
358
358
  if w2 < w1 - 1e-6:
359
359
  calendar_arbitrage_free = False
360
360
  logger.warning(f"Calendar arbitrage still detected between {mat1} and {mat2} after correction")
@@ -416,7 +416,7 @@ def get_iv_surface(model_results: pd.DataFrame,
416
416
  t = model_results.loc[i, 't']
417
417
 
418
418
  # Calculate implied volatility
419
- w = np.array([SVIModel.svi(x, *params) for x in LM])
419
+ w = np.array([SVIModel.svi_raw(x, *params) for x in LM])
420
420
  o = np.sqrt(w / t)
421
421
  iv_surface[i] = o
422
422
 
@@ -35,24 +35,29 @@ class SVIModel:
35
35
  }
36
36
 
37
37
  @staticmethod
38
- def svi(k, a, b, m, rho, sigma):
39
- assert b >= 0, 'b must be non-negative'
40
- assert abs(rho) <= 1, '|rho| must be <= 1'
41
- assert sigma >= 0, 'sigma must be non-negative'
42
- assert a + b * sigma * np.sqrt(1 - rho ** 2) >= 0, 'a + b*sigma*sqrt(1-rho^2) must be non-negative'
38
+ def svi_raw(k, a, b, m, rho, sigma):
39
+ """
40
+ Calculate SVI total implied variance using raw parameterization.
41
+ This is the original function name from the user's code.
42
+ """
43
+ assert b >= 0 and abs(rho) <= 1 and sigma >= 0 and a + b * sigma * np.sqrt(1 - rho ** 2) >= 0
43
44
  return a + b * (rho * (k - m) + np.sqrt((k - m) ** 2 + sigma ** 2))
44
45
 
45
46
  @staticmethod
46
- def svi_raw(LM: float, a: float, b: float, m: float, rho: float, sigma: float) -> float:
47
+ def svi(LM: float, a: float, b: float, m: float, rho: float, sigma: float) -> float:
48
+ """
49
+ Calculate SVI total implied variance at a given log-moneyness.
50
+ This version maintains compatibility with the original Voly package.
51
+ """
47
52
  return a + b * (rho * (LM - m) + np.sqrt((LM - m) ** 2 + sigma ** 2))
48
53
 
49
54
  @staticmethod
50
- def svi_d(LM: float, a: float, b: float, sigma: float, rho: float, m: float) -> float:
55
+ def svi_d(LM: float, a: float, b: float, m: float, rho: float, sigma: float) -> float:
51
56
  """Calculate first derivative of SVI function with respect to log-moneyness."""
52
57
  return b * (rho + ((LM - m) / np.sqrt((LM - m) ** 2 + sigma ** 2)))
53
58
 
54
59
  @staticmethod
55
- def svi_dd(LM: float, a: float, b: float, sigma: float, rho: float, m: float) -> float:
60
+ def svi_dd(LM: float, a: float, b: float, m: float, rho: float, sigma: float) -> float:
56
61
  """Calculate second derivative of SVI function with respect to log-moneyness."""
57
62
  return b * sigma ** 2 / ((LM - m) ** 2 + sigma ** 2) ** 1.5
58
63
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: voly
3
- Version: 0.0.175
3
+ Version: 0.0.177
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