voly 0.0.40__py3-none-any.whl → 0.0.42__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/charts.py CHANGED
@@ -22,20 +22,19 @@ pio.renderers.default = "browser"
22
22
 
23
23
 
24
24
  @catch_exception
25
- def plot_volatility_smile(moneyness: np.ndarray,
26
- iv: np.ndarray,
27
- market_data: Optional[pd.DataFrame] = None,
28
- expiry: Optional[float] = None,
29
- title: Optional[str] = None) -> go.Figure:
25
+ def plot_volatility_smile(moneyness_array: np.ndarray,
26
+ iv_array: np.ndarray,
27
+ market_data: pd.DataFrame = None,
28
+ maturity: Optional[float] = None,
29
+ ) -> go.Figure:
30
30
  """
31
31
  Plot volatility smile for a single expiry.
32
32
 
33
33
  Parameters:
34
- - moneyness: Moneyness grid
35
- - iv: Implied volatility values
34
+ - moneyness_array: Moneyness grid
35
+ - iv_array: Implied volatility values
36
36
  - market_data: Optional market data for comparison
37
- - expiry: Optional expiry time (in years) for filtering market data
38
- - title: Optional plot title
37
+ - maturity: Maturity name for filtering market data
39
38
 
40
39
  Returns:
41
40
  - Plotly figure
@@ -45,8 +44,8 @@ def plot_volatility_smile(moneyness: np.ndarray,
45
44
  # Add model curve
46
45
  fig.add_trace(
47
46
  go.Scatter(
48
- x=moneyness,
49
- y=iv * 100, # Convert to percentage
47
+ x=moneyness_array,
48
+ y=iv_array * 100, # Convert to percentage
50
49
  mode='lines',
51
50
  name='Model',
52
51
  line=dict(color='#0080FF', width=2)
@@ -54,14 +53,14 @@ def plot_volatility_smile(moneyness: np.ndarray,
54
53
  )
55
54
 
56
55
  # Filter market data for the specific expiry
57
- expiry_data = market_data[market_data['yte'] == expiry]
56
+ maturity_data = market_data[market_data['maturity_name'] == maturity]
58
57
 
59
- if not expiry_data.empty:
58
+ if not maturity_data.empty:
60
59
  # Add bid IV
61
60
  fig.add_trace(
62
61
  go.Scatter(
63
- x=expiry_data['log_moneyness'],
64
- y=expiry_data['bid_iv'] * 100, # Convert to percentage
62
+ x=maturity_data['log_moneyness'],
63
+ y=maturity_data['bid_iv'] * 100, # Convert to percentage
65
64
  mode='markers',
66
65
  name='Bid IV',
67
66
  marker=dict(size=8, symbol='circle', opacity=0.7)
@@ -71,23 +70,19 @@ def plot_volatility_smile(moneyness: np.ndarray,
71
70
  # Add ask IV
72
71
  fig.add_trace(
73
72
  go.Scatter(
74
- x=expiry_data['log_moneyness'],
75
- y=expiry_data['ask_iv'] * 100, # Convert to percentage
73
+ x=maturity_data['log_moneyness'],
74
+ y=maturity_data['ask_iv'] * 100, # Convert to percentage
76
75
  mode='markers',
77
76
  name='Ask IV',
78
77
  marker=dict(size=8, symbol='circle', opacity=0.7)
79
78
  )
80
79
  )
81
80
 
82
- # Get maturity name and DTE for title if not provided
83
- if title is None:
84
- maturity_name = expiry_data['maturity_name'].iloc[0]
85
- dte_value = expiry_data['dte'].iloc[0]
86
- title = f'Vol Smile for {maturity_name} (DTE: {dte_value:.1f})'
81
+ dte_value = maturity_data['dte'].iloc[0]
87
82
 
88
83
  # Update layout
89
84
  fig.update_layout(
90
- title=title,
85
+ title=f'Vol Smile for {maturity} (DTE: {dte_value:.1f})',
91
86
  xaxis_title='Log Moneyness',
92
87
  yaxis_title='Implied Volatility (%)',
93
88
  template='plotly_dark',
@@ -98,7 +93,7 @@ def plot_volatility_smile(moneyness: np.ndarray,
98
93
 
99
94
 
100
95
  @catch_exception
101
- def plot_all_smiles(moneyness: np.ndarray,
96
+ def plot_all_smiles(moneyness_array: np.ndarray,
102
97
  iv_surface: Dict[float, np.ndarray],
103
98
  market_data: Optional[pd.DataFrame] = None) -> List[go.Figure]:
104
99
  """
@@ -114,16 +109,16 @@ def plot_all_smiles(moneyness: np.ndarray,
114
109
  """
115
110
  figures = []
116
111
 
117
- # Sort expiries in ascending order
118
- sorted_expiries = sorted(iv_surface.keys())
112
+ # Get maturities
113
+ maturities = list(iv_surface.keys())
119
114
 
120
115
  # Create a figure for each expiry
121
- for expiry in sorted_expiries:
116
+ for maturity in maturities:
122
117
  fig = plot_volatility_smile(
123
- moneyness=moneyness,
124
- iv=iv_surface[expiry],
118
+ moneyness_array=moneyness_array,
119
+ iv_array=iv_surface[maturity],
125
120
  market_data=market_data,
126
- expiry=expiry
121
+ maturity=maturity
127
122
  )
128
123
  figures.append(fig)
129
124
 
@@ -383,7 +378,7 @@ def plot_3d_surface(moneyness_array: np.ndarray,
383
378
  template='plotly_dark',
384
379
  scene=dict(
385
380
  xaxis_title='Log Moneyness',
386
- yaxis_title='Time to Expiry (years)',
381
+ yaxis_title='Maturities',
387
382
  zaxis_title='Implied Volatility (%)'
388
383
  ),
389
384
  margin=dict(l=65, r=50, b=65, t=90)
@@ -395,8 +390,7 @@ def plot_3d_surface(moneyness_array: np.ndarray,
395
390
  @catch_exception
396
391
  def plot_rnd(moneyness_array: np.ndarray,
397
392
  rnd_values: np.ndarray,
398
- spot_price: float = 1.0,
399
- title: str = 'Risk-Neutral Density') -> go.Figure:
393
+ spot_price: float = 1.0) -> go.Figure:
400
394
  """
401
395
  Plot risk-neutral density (RND).
402
396
 
@@ -452,7 +446,7 @@ def plot_rnd(moneyness_array: np.ndarray,
452
446
 
453
447
  # Update layout
454
448
  fig.update_layout(
455
- title=title,
449
+ title='Risk-Neutral Density',
456
450
  xaxis_title='Price',
457
451
  yaxis_title='Density',
458
452
  template='plotly_dark',
@@ -465,7 +459,7 @@ def plot_rnd(moneyness_array: np.ndarray,
465
459
  @catch_exception
466
460
  def plot_rnd_all_expiries(moneyness_array: np.ndarray,
467
461
  rnd_surface: Dict[str, np.ndarray],
468
- param_matrix: pd.DataFrame,
462
+ fit_results: Dict[str, Any],
469
463
  spot_price: float = 1.0) -> go.Figure:
470
464
  """
471
465
  Plot risk-neutral densities for all expiries.
@@ -480,7 +474,7 @@ def plot_rnd_all_expiries(moneyness_array: np.ndarray,
480
474
  - Plotly figure
481
475
  """
482
476
  # Get maturity information
483
- dte_values = param_matrix.attrs['dte_values']
477
+ dte_values = fit_results['fit_performance']['DTE']
484
478
 
485
479
  # Create figure
486
480
  fig = go.Figure()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: voly
3
- Version: 0.0.40
3
+ Version: 0.0.42
4
4
  Summary: Options & volatility research package
5
5
  Author-email: Manu de Cara <manu.de.cara@gmail.com>
6
6
  License: MIT
@@ -4,15 +4,15 @@ voly/exceptions.py,sha256=PBsbn1vNMvKcCJwwJ4lBO6glD85jo1h2qiEmD7ArAjs,92
4
4
  voly/formulas.py,sha256=7NQZtYWFT_VOyAVNQHLB5-8caGAdtzU8y8eFcYJsZn8,7256
5
5
  voly/models.py,sha256=YJ12aamLz_-aOni4Qm0_XV9u4bjKK3vfJz0J2gc1h0o,3565
6
6
  voly/core/__init__.py,sha256=bu6fS2I1Pj9fPPnl-zY3L7NqrZSY5Zy6NY2uMUvdhKs,183
7
- voly/core/charts.py,sha256=tt8WZfAKmfb5YQiVXYAXt9ROT_FRMB4w_Lbe5ihjh5E,26725
7
+ voly/core/charts.py,sha256=T8cogkiHj8NcFxfARumNvAjLJUAxsMlHUOVgshwjye8,26474
8
8
  voly/core/data.py,sha256=Dfk-ByHpdteUiLXr0p-wRLr3VAmdyjdDBKwjwdTgCjA,9939
9
9
  voly/core/fit.py,sha256=O4PMihVWI1NIEFU4_RkKvT73p0Jk0tB-ot5moMXAW78,9950
10
10
  voly/core/interpolate.py,sha256=ztVIePJZOh-CIbn69wkh1JW2rKywNe2FEewRN0zcSAo,8185
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.40.dist-info/LICENSE,sha256=wcHIVbE12jfcBOai_wqBKY6xvNQU5E909xL1zZNq_2Q,1065
15
- voly-0.0.40.dist-info/METADATA,sha256=82ZAciFjV9qvdgsfzv3L-wjRbwfjUUhUjwzzHUb0j0E,4092
16
- voly-0.0.40.dist-info/WHEEL,sha256=52BFRY2Up02UkjOa29eZOS2VxUrpPORXg1pkohGGUS8,91
17
- voly-0.0.40.dist-info/top_level.txt,sha256=ZfLw2sSxF-LrKAkgGjOmeTcw6_gD-30zvtdEY5W4B7c,5
18
- voly-0.0.40.dist-info/RECORD,,
14
+ voly-0.0.42.dist-info/LICENSE,sha256=wcHIVbE12jfcBOai_wqBKY6xvNQU5E909xL1zZNq_2Q,1065
15
+ voly-0.0.42.dist-info/METADATA,sha256=aMamoio_CqWwAa26G_rZa-NMbID91c_9S3VSxzEBevQ,4092
16
+ voly-0.0.42.dist-info/WHEEL,sha256=52BFRY2Up02UkjOa29eZOS2VxUrpPORXg1pkohGGUS8,91
17
+ voly-0.0.42.dist-info/top_level.txt,sha256=ZfLw2sSxF-LrKAkgGjOmeTcw6_gD-30zvtdEY5W4B7c,5
18
+ voly-0.0.42.dist-info/RECORD,,
File without changes
File without changes