voly 0.0.41__tar.gz → 0.0.42__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.
- {voly-0.0.41/src/voly.egg-info → voly-0.0.42}/PKG-INFO +1 -1
 - {voly-0.0.41 → voly-0.0.42}/pyproject.toml +2 -2
 - {voly-0.0.41 → voly-0.0.42}/src/voly/core/charts.py +23 -26
 - {voly-0.0.41 → voly-0.0.42/src/voly.egg-info}/PKG-INFO +1 -1
 - {voly-0.0.41 → voly-0.0.42}/LICENSE +0 -0
 - {voly-0.0.41 → voly-0.0.42}/README.md +0 -0
 - {voly-0.0.41 → voly-0.0.42}/setup.cfg +0 -0
 - {voly-0.0.41 → voly-0.0.42}/setup.py +0 -0
 - {voly-0.0.41 → voly-0.0.42}/src/voly/__init__.py +0 -0
 - {voly-0.0.41 → voly-0.0.42}/src/voly/client.py +0 -0
 - {voly-0.0.41 → voly-0.0.42}/src/voly/core/__init__.py +0 -0
 - {voly-0.0.41 → voly-0.0.42}/src/voly/core/data.py +0 -0
 - {voly-0.0.41 → voly-0.0.42}/src/voly/core/fit.py +0 -0
 - {voly-0.0.41 → voly-0.0.42}/src/voly/core/interpolate.py +0 -0
 - {voly-0.0.41 → voly-0.0.42}/src/voly/core/rnd.py +0 -0
 - {voly-0.0.41 → voly-0.0.42}/src/voly/exceptions.py +0 -0
 - {voly-0.0.41 → voly-0.0.42}/src/voly/formulas.py +0 -0
 - {voly-0.0.41 → voly-0.0.42}/src/voly/models.py +0 -0
 - {voly-0.0.41 → voly-0.0.42}/src/voly/utils/__init__.py +0 -0
 - {voly-0.0.41 → voly-0.0.42}/src/voly/utils/logger.py +0 -0
 - {voly-0.0.41 → voly-0.0.42}/src/voly.egg-info/SOURCES.txt +0 -0
 - {voly-0.0.41 → voly-0.0.42}/src/voly.egg-info/dependency_links.txt +0 -0
 - {voly-0.0.41 → voly-0.0.42}/src/voly.egg-info/requires.txt +0 -0
 - {voly-0.0.41 → voly-0.0.42}/src/voly.egg-info/top_level.txt +0 -0
 - {voly-0.0.41 → voly-0.0.42}/tests/test_client.py +0 -0
 
| 
         @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" 
     | 
|
| 
       4 
4 
     | 
    
         | 
| 
       5 
5 
     | 
    
         
             
            [project]
         
     | 
| 
       6 
6 
     | 
    
         
             
            name = "voly"
         
     | 
| 
       7 
     | 
    
         
            -
            version = "0.0. 
     | 
| 
      
 7 
     | 
    
         
            +
            version = "0.0.42"
         
     | 
| 
       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. 
     | 
| 
      
 63 
     | 
    
         
            +
            python_version = "0.0.42"
         
     | 
| 
       64 
64 
     | 
    
         
             
            warn_return_any = true
         
     | 
| 
       65 
65 
     | 
    
         
             
            warn_unused_configs = true
         
     | 
| 
       66 
66 
     | 
    
         
             
            disallow_untyped_defs = true
         
     | 
| 
         @@ -23,19 +23,18 @@ pio.renderers.default = "browser" 
     | 
|
| 
       23 
23 
     | 
    
         | 
| 
       24 
24 
     | 
    
         
             
            @catch_exception
         
     | 
| 
       25 
25 
     | 
    
         
             
            def plot_volatility_smile(moneyness_array: np.ndarray,
         
     | 
| 
       26 
     | 
    
         
            -
                                       
     | 
| 
      
 26 
     | 
    
         
            +
                                      iv_array: np.ndarray,
         
     | 
| 
       27 
27 
     | 
    
         
             
                                      market_data: pd.DataFrame = None,
         
     | 
| 
       28 
     | 
    
         
            -
                                       
     | 
| 
      
 28 
     | 
    
         
            +
                                      maturity: Optional[float] = None,
         
     | 
| 
       29 
29 
     | 
    
         
             
                                      ) -> go.Figure:
         
     | 
| 
       30 
30 
     | 
    
         
             
                """
         
     | 
| 
       31 
31 
     | 
    
         
             
                Plot volatility smile for a single expiry.
         
     | 
| 
       32 
32 
     | 
    
         | 
| 
       33 
33 
     | 
    
         
             
                Parameters:
         
     | 
| 
       34 
     | 
    
         
            -
                -  
     | 
| 
       35 
     | 
    
         
            -
                -  
     | 
| 
      
 34 
     | 
    
         
            +
                - moneyness_array: Moneyness grid
         
     | 
| 
      
 35 
     | 
    
         
            +
                - iv_array: Implied volatility values
         
     | 
| 
       36 
36 
     | 
    
         
             
                - market_data: Optional market data for comparison
         
     | 
| 
       37 
     | 
    
         
            -
                -  
     | 
| 
       38 
     | 
    
         
            -
                - title: Optional plot title
         
     | 
| 
      
 37 
     | 
    
         
            +
                - maturity: Maturity name for filtering market data
         
     | 
| 
       39 
38 
     | 
    
         | 
| 
       40 
39 
     | 
    
         
             
                Returns:
         
     | 
| 
       41 
40 
     | 
    
         
             
                - Plotly figure
         
     | 
| 
         @@ -46,7 +45,7 @@ def plot_volatility_smile(moneyness_array: np.ndarray, 
     | 
|
| 
       46 
45 
     | 
    
         
             
                fig.add_trace(
         
     | 
| 
       47 
46 
     | 
    
         
             
                    go.Scatter(
         
     | 
| 
       48 
47 
     | 
    
         
             
                        x=moneyness_array,
         
     | 
| 
       49 
     | 
    
         
            -
                        y= 
     | 
| 
      
 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_array: np.ndarray, 
     | 
|
| 
       54 
53 
     | 
    
         
             
                )
         
     | 
| 
       55 
54 
     | 
    
         | 
| 
       56 
55 
     | 
    
         
             
                # Filter market data for the specific expiry
         
     | 
| 
       57 
     | 
    
         
            -
                 
     | 
| 
      
 56 
     | 
    
         
            +
                maturity_data = market_data[market_data['maturity_name'] == maturity]
         
     | 
| 
       58 
57 
     | 
    
         | 
| 
       59 
     | 
    
         
            -
                if not  
     | 
| 
      
 58 
     | 
    
         
            +
                if not maturity_data.empty:
         
     | 
| 
       60 
59 
     | 
    
         
             
                    # Add bid IV
         
     | 
| 
       61 
60 
     | 
    
         
             
                    fig.add_trace(
         
     | 
| 
       62 
61 
     | 
    
         
             
                        go.Scatter(
         
     | 
| 
       63 
     | 
    
         
            -
                            x= 
     | 
| 
       64 
     | 
    
         
            -
                            y= 
     | 
| 
      
 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,20 +70,19 @@ def plot_volatility_smile(moneyness_array: np.ndarray, 
     | 
|
| 
       71 
70 
     | 
    
         
             
                    # Add ask IV
         
     | 
| 
       72 
71 
     | 
    
         
             
                    fig.add_trace(
         
     | 
| 
       73 
72 
     | 
    
         
             
                        go.Scatter(
         
     | 
| 
       74 
     | 
    
         
            -
                            x= 
     | 
| 
       75 
     | 
    
         
            -
                            y= 
     | 
| 
      
 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 
     | 
    
         
            -
                 
     | 
| 
       83 
     | 
    
         
            -
                dte_value = expiry_data['dte'].iloc[0]
         
     | 
| 
      
 81 
     | 
    
         
            +
                dte_value = maturity_data['dte'].iloc[0]
         
     | 
| 
       84 
82 
     | 
    
         | 
| 
       85 
83 
     | 
    
         
             
                # Update layout
         
     | 
| 
       86 
84 
     | 
    
         
             
                fig.update_layout(
         
     | 
| 
       87 
     | 
    
         
            -
                    title=f'Vol Smile for { 
     | 
| 
      
 85 
     | 
    
         
            +
                    title=f'Vol Smile for {maturity} (DTE: {dte_value:.1f})',
         
     | 
| 
       88 
86 
     | 
    
         
             
                    xaxis_title='Log Moneyness',
         
     | 
| 
       89 
87 
     | 
    
         
             
                    yaxis_title='Implied Volatility (%)',
         
     | 
| 
       90 
88 
     | 
    
         
             
                    template='plotly_dark',
         
     | 
| 
         @@ -111,16 +109,16 @@ def plot_all_smiles(moneyness_array: np.ndarray, 
     | 
|
| 
       111 
109 
     | 
    
         
             
                """
         
     | 
| 
       112 
110 
     | 
    
         
             
                figures = []
         
     | 
| 
       113 
111 
     | 
    
         | 
| 
       114 
     | 
    
         
            -
                #  
     | 
| 
       115 
     | 
    
         
            -
                 
     | 
| 
      
 112 
     | 
    
         
            +
                # Get maturities
         
     | 
| 
      
 113 
     | 
    
         
            +
                maturities = list(iv_surface.keys())
         
     | 
| 
       116 
114 
     | 
    
         | 
| 
       117 
115 
     | 
    
         
             
                # Create a figure for each expiry
         
     | 
| 
       118 
     | 
    
         
            -
                for  
     | 
| 
      
 116 
     | 
    
         
            +
                for maturity in maturities:
         
     | 
| 
       119 
117 
     | 
    
         
             
                    fig = plot_volatility_smile(
         
     | 
| 
       120 
118 
     | 
    
         
             
                        moneyness_array=moneyness_array,
         
     | 
| 
       121 
     | 
    
         
            -
                         
     | 
| 
      
 119 
     | 
    
         
            +
                        iv_array=iv_surface[maturity],
         
     | 
| 
       122 
120 
     | 
    
         
             
                        market_data=market_data,
         
     | 
| 
       123 
     | 
    
         
            -
                         
     | 
| 
      
 121 
     | 
    
         
            +
                        maturity=maturity
         
     | 
| 
       124 
122 
     | 
    
         
             
                    )
         
     | 
| 
       125 
123 
     | 
    
         
             
                    figures.append(fig)
         
     | 
| 
       126 
124 
     | 
    
         | 
| 
         @@ -392,8 +390,7 @@ def plot_3d_surface(moneyness_array: np.ndarray, 
     | 
|
| 
       392 
390 
     | 
    
         
             
            @catch_exception
         
     | 
| 
       393 
391 
     | 
    
         
             
            def plot_rnd(moneyness_array: np.ndarray,
         
     | 
| 
       394 
392 
     | 
    
         
             
                         rnd_values: np.ndarray,
         
     | 
| 
       395 
     | 
    
         
            -
                         spot_price: float = 1.0 
     | 
| 
       396 
     | 
    
         
            -
                         title: str = 'Risk-Neutral Density') -> go.Figure:
         
     | 
| 
      
 393 
     | 
    
         
            +
                         spot_price: float = 1.0) -> go.Figure:
         
     | 
| 
       397 
394 
     | 
    
         
             
                """
         
     | 
| 
       398 
395 
     | 
    
         
             
                Plot risk-neutral density (RND).
         
     | 
| 
       399 
396 
     | 
    
         | 
| 
         @@ -449,7 +446,7 @@ def plot_rnd(moneyness_array: np.ndarray, 
     | 
|
| 
       449 
446 
     | 
    
         | 
| 
       450 
447 
     | 
    
         
             
                # Update layout
         
     | 
| 
       451 
448 
     | 
    
         
             
                fig.update_layout(
         
     | 
| 
       452 
     | 
    
         
            -
                    title= 
     | 
| 
      
 449 
     | 
    
         
            +
                    title='Risk-Neutral Density',
         
     | 
| 
       453 
450 
     | 
    
         
             
                    xaxis_title='Price',
         
     | 
| 
       454 
451 
     | 
    
         
             
                    yaxis_title='Density',
         
     | 
| 
       455 
452 
     | 
    
         
             
                    template='plotly_dark',
         
     | 
| 
         @@ -462,7 +459,7 @@ def plot_rnd(moneyness_array: np.ndarray, 
     | 
|
| 
       462 
459 
     | 
    
         
             
            @catch_exception
         
     | 
| 
       463 
460 
     | 
    
         
             
            def plot_rnd_all_expiries(moneyness_array: np.ndarray,
         
     | 
| 
       464 
461 
     | 
    
         
             
                                      rnd_surface: Dict[str, np.ndarray],
         
     | 
| 
       465 
     | 
    
         
            -
                                       
     | 
| 
      
 462 
     | 
    
         
            +
                                      fit_results: Dict[str, Any],
         
     | 
| 
       466 
463 
     | 
    
         
             
                                      spot_price: float = 1.0) -> go.Figure:
         
     | 
| 
       467 
464 
     | 
    
         
             
                """
         
     | 
| 
       468 
465 
     | 
    
         
             
                Plot risk-neutral densities for all expiries.
         
     | 
| 
         @@ -477,7 +474,7 @@ def plot_rnd_all_expiries(moneyness_array: np.ndarray, 
     | 
|
| 
       477 
474 
     | 
    
         
             
                - Plotly figure
         
     | 
| 
       478 
475 
     | 
    
         
             
                """
         
     | 
| 
       479 
476 
     | 
    
         
             
                # Get maturity information
         
     | 
| 
       480 
     | 
    
         
            -
                dte_values =  
     | 
| 
      
 477 
     | 
    
         
            +
                dte_values = fit_results['fit_performance']['DTE']
         
     | 
| 
       481 
478 
     | 
    
         | 
| 
       482 
479 
     | 
    
         
             
                # Create figure
         
     | 
| 
       483 
480 
     | 
    
         
             
                fig = go.Figure()
         
     | 
| 
         
            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
         
     | 
| 
         
            File without changes
         
     | 
| 
         
            File without changes
         
     | 
| 
         
            File without changes
         
     | 
| 
         
            File without changes
         
     | 
| 
         
            File without changes
         
     |