voly 0.0.257__py3-none-any.whl → 0.0.259__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 +6 -4
- voly/core/data.py +0 -53
- voly/core/rnd.py +1 -1
- {voly-0.0.257.dist-info → voly-0.0.259.dist-info}/METADATA +1 -1
- {voly-0.0.257.dist-info → voly-0.0.259.dist-info}/RECORD +8 -8
- {voly-0.0.257.dist-info → voly-0.0.259.dist-info}/WHEEL +1 -1
- {voly-0.0.257.dist-info → voly-0.0.259.dist-info}/licenses/LICENSE +0 -0
- {voly-0.0.257.dist-info → voly-0.0.259.dist-info}/top_level.txt +0 -0
voly/core/charts.py
CHANGED
@@ -38,6 +38,7 @@ def plot_volatility_smile(x_array: np.ndarray,
|
|
38
38
|
Returns:
|
39
39
|
- Plotly figure
|
40
40
|
"""
|
41
|
+
|
41
42
|
# Map domain types to axis labels
|
42
43
|
domain_labels = {
|
43
44
|
'log_moneyness': 'Log Moneyness',
|
@@ -62,6 +63,7 @@ def plot_volatility_smile(x_array: np.ndarray,
|
|
62
63
|
|
63
64
|
# Add market data if provided
|
64
65
|
if option_chain is not None and maturity is not None:
|
66
|
+
currency = option_chain['currency'].iloc[0]
|
65
67
|
maturity_data = option_chain[option_chain['maturity'] == maturity]
|
66
68
|
if return_domain == 'delta':
|
67
69
|
maturity_data = maturity_data[maturity_data['flag'] == 'C']
|
@@ -80,9 +82,9 @@ def plot_volatility_smile(x_array: np.ndarray,
|
|
80
82
|
)
|
81
83
|
)
|
82
84
|
|
83
|
-
title = f'Vol Smile for {maturity}'
|
85
|
+
title = f'{currency} - Vol Smile for {maturity}'
|
84
86
|
else:
|
85
|
-
title = f'Vol Smile for {maturity}'
|
87
|
+
title = f'{currency} - Vol Smile for {maturity}'
|
86
88
|
else:
|
87
89
|
title = 'Volatility Smile'
|
88
90
|
|
@@ -182,7 +184,7 @@ def plot_raw_parameters(fit_results: pd.DataFrame) -> go.Figure:
|
|
182
184
|
|
183
185
|
# Update layout
|
184
186
|
fig.update_layout(
|
185
|
-
title='Raw SVI Parameters Across
|
187
|
+
title='Raw SVI Parameters Across Maturities',
|
186
188
|
template='plotly_dark',
|
187
189
|
showlegend=False
|
188
190
|
)
|
@@ -245,7 +247,7 @@ def plot_jw_parameters(fit_results: pd.DataFrame) -> go.Figure:
|
|
245
247
|
|
246
248
|
# Update layout
|
247
249
|
fig.update_layout(
|
248
|
-
title='Jump-Wing Parameters Across
|
250
|
+
title='Jump-Wing Parameters Across Maturities',
|
249
251
|
template='plotly_dark',
|
250
252
|
showlegend=False
|
251
253
|
)
|
voly/core/data.py
CHANGED
@@ -182,59 +182,6 @@ async def get_deribit_data(currency: str = "BTC") -> pd.DataFrame:
|
|
182
182
|
|
183
183
|
return pd.DataFrame(all_data)
|
184
184
|
|
185
|
-
'''
|
186
|
-
@catch_exception
|
187
|
-
def process_option_chain(df: pd.DataFrame, currency: str) -> pd.DataFrame:
|
188
|
-
"""
|
189
|
-
Process raw option chain data into a standardized format.
|
190
|
-
|
191
|
-
Parameters:
|
192
|
-
df (pd.DataFrame): Raw option chain data
|
193
|
-
currency (str): Currency code (e.g., 'BTC', 'ETH')
|
194
|
-
|
195
|
-
Returns:
|
196
|
-
pd.DataFrame: Processed option chain data
|
197
|
-
"""
|
198
|
-
logger.info(f"Processing data for {currency}...")
|
199
|
-
|
200
|
-
# Apply extraction to create new columns
|
201
|
-
splits = df['instrument_name'].str.split('-')
|
202
|
-
df['maturity_name'] = splits.str[1]
|
203
|
-
if currency == 'XRP':
|
204
|
-
df['strikes'] = splits.str[2].str.replace('d', '.', regex=False).astype(float)
|
205
|
-
else:
|
206
|
-
df['strikes'] = splits.str[2].astype(float)
|
207
|
-
df['option_type'] = splits.str[3]
|
208
|
-
|
209
|
-
# Create maturity date at 8:00 AM UTC
|
210
|
-
df['maturity_date'] = pd.to_datetime(df['maturity_name'].apply(
|
211
|
-
lambda x: int(dt.datetime.strptime(x, "%d%b%y")
|
212
|
-
.replace(hour=8, minute=0, second=0, tzinfo=dt.timezone.utc)
|
213
|
-
.timestamp() * 1000)), unit='ms')
|
214
|
-
|
215
|
-
# Get reference time from timestamp
|
216
|
-
reference_time = dt.datetime.fromtimestamp(df['timestamp'].iloc[0] / 1000)
|
217
|
-
|
218
|
-
# Calculate time to expiry in years
|
219
|
-
df['t'] = ((df['maturity_date'] - reference_time).dt.total_seconds() / (24 * 60 * 60)) / 365.25
|
220
|
-
|
221
|
-
# Calculate implied volatility (convert from percentage)
|
222
|
-
df['mark_iv'] = df['mark_iv'] / 100
|
223
|
-
df['bid_iv'] = df['bid_iv'].replace({0: np.nan}) / 100
|
224
|
-
df['ask_iv'] = df['ask_iv'].replace({0: np.nan}) / 100
|
225
|
-
|
226
|
-
# Calculate log-moneyness
|
227
|
-
df['log_moneyness'] = np.log(df['strikes'] / df['index_price'].iloc[0])
|
228
|
-
# Calculate moneyness
|
229
|
-
df['moneyness'] = np.exp(df['log_moneyness'])
|
230
|
-
# Calculate returns
|
231
|
-
df['returns'] = df['moneyness'] - 1
|
232
|
-
|
233
|
-
logger.info(f"Processing complete!")
|
234
|
-
|
235
|
-
return df
|
236
|
-
'''
|
237
|
-
|
238
185
|
|
239
186
|
@catch_exception
|
240
187
|
def process_option_chain(df: pd.DataFrame, currency: str) -> pd.DataFrame:
|
voly/core/rnd.py
CHANGED
@@ -51,7 +51,7 @@ def breeden(domain_params, s, r, o, t, return_domain):
|
|
51
51
|
dx = domains['dx']
|
52
52
|
|
53
53
|
# Calculate option prices and derivatives
|
54
|
-
c = bs(s,
|
54
|
+
c = [bs(s, strike, r, vol, t, flag='call') for strike, vol in zip(K, o)]
|
55
55
|
c1 = np.gradient(c, K)
|
56
56
|
c2 = np.gradient(c1, K)
|
57
57
|
|
@@ -4,17 +4,17 @@ voly/exceptions.py,sha256=PBsbn1vNMvKcCJwwJ4lBO6glD85jo1h2qiEmD7ArAjs,92
|
|
4
4
|
voly/formulas.py,sha256=5DupVzJuPtnkfbhIq05ciNXb6S6o4Cd33wqG-ahf4bc,10015
|
5
5
|
voly/models.py,sha256=CGJQr13Uie7iwtx2hjViN9lMXeRN_uOqzp4u8NPaTlA,9282
|
6
6
|
voly/core/__init__.py,sha256=bu6fS2I1Pj9fPPnl-zY3L7NqrZSY5Zy6NY2uMUvdhKs,183
|
7
|
-
voly/core/charts.py,sha256=
|
8
|
-
voly/core/data.py,sha256=
|
7
|
+
voly/core/charts.py,sha256=W_6yhJrfPGjOev8PjDZRv_SAw2wUovhYAsF6ZDdGgxY,12718
|
8
|
+
voly/core/data.py,sha256=IPR-dtTMPBA7ua8D_VQeV6lsguCKBf-H0ZIxRpxNV-k,11677
|
9
9
|
voly/core/fit.py,sha256=G5ooc47QxAcoVWunU8990TLH3gOigkDA5vSRtPG-mXA,14010
|
10
10
|
voly/core/hd.py,sha256=dSv197RmSWFWbRRdoBzMrD_poT7ZiJ8hdD_wKE-Li_M,13559
|
11
11
|
voly/core/interpolate.py,sha256=GAkrqaar7A0D6UMipXQUp4vSHRfb44TmCG5Xiv9elXg,5176
|
12
|
-
voly/core/rnd.py,sha256=
|
12
|
+
voly/core/rnd.py,sha256=SITZVvZGm-3vjnzFJMncRWsu7Gfj9qJKgXsfBvkDyJ4,13245
|
13
13
|
voly/utils/__init__.py,sha256=E05mWatyC-PDOsCxQV1p5Xi1IgpOomxrNURyCx_gB-w,200
|
14
14
|
voly/utils/density.py,sha256=ONpRli-IaJDgOZ2sb27HHFc9_tkkGSATKl94JODd86A,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.259.dist-info/licenses/LICENSE,sha256=wcHIVbE12jfcBOai_wqBKY6xvNQU5E909xL1zZNq_2Q,1065
|
17
|
+
voly-0.0.259.dist-info/METADATA,sha256=Gz-Kz-3SZB7JUKx2mIP06o_FsV7Xr6RDt8TKkyJj9cg,4115
|
18
|
+
voly-0.0.259.dist-info/WHEEL,sha256=wXxTzcEDnjrTwFYjLPcsW_7_XihufBwmpiBeiXNBGEA,91
|
19
|
+
voly-0.0.259.dist-info/top_level.txt,sha256=ZfLw2sSxF-LrKAkgGjOmeTcw6_gD-30zvtdEY5W4B7c,5
|
20
|
+
voly-0.0.259.dist-info/RECORD,,
|
File without changes
|
File without changes
|