voly 0.0.100__tar.gz → 0.0.102__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.100/src/voly.egg-info → voly-0.0.102}/PKG-INFO +1 -1
- {voly-0.0.100 → voly-0.0.102}/pyproject.toml +2 -2
- {voly-0.0.100 → voly-0.0.102}/src/voly/client.py +4 -0
- {voly-0.0.100 → voly-0.0.102}/src/voly/core/rnd.py +12 -12
- {voly-0.0.100 → voly-0.0.102}/src/voly/models.py +6 -6
- {voly-0.0.100 → voly-0.0.102/src/voly.egg-info}/PKG-INFO +1 -1
- {voly-0.0.100 → voly-0.0.102}/LICENSE +0 -0
- {voly-0.0.100 → voly-0.0.102}/README.md +0 -0
- {voly-0.0.100 → voly-0.0.102}/setup.cfg +0 -0
- {voly-0.0.100 → voly-0.0.102}/setup.py +0 -0
- {voly-0.0.100 → voly-0.0.102}/src/voly/__init__.py +0 -0
- {voly-0.0.100 → voly-0.0.102}/src/voly/core/__init__.py +0 -0
- {voly-0.0.100 → voly-0.0.102}/src/voly/core/charts.py +0 -0
- {voly-0.0.100 → voly-0.0.102}/src/voly/core/data.py +0 -0
- {voly-0.0.100 → voly-0.0.102}/src/voly/core/fit.py +0 -0
- {voly-0.0.100 → voly-0.0.102}/src/voly/core/interpolate.py +0 -0
- {voly-0.0.100 → voly-0.0.102}/src/voly/exceptions.py +0 -0
- {voly-0.0.100 → voly-0.0.102}/src/voly/formulas.py +0 -0
- {voly-0.0.100 → voly-0.0.102}/src/voly/utils/__init__.py +0 -0
- {voly-0.0.100 → voly-0.0.102}/src/voly/utils/logger.py +0 -0
- {voly-0.0.100 → voly-0.0.102}/src/voly.egg-info/SOURCES.txt +0 -0
- {voly-0.0.100 → voly-0.0.102}/src/voly.egg-info/dependency_links.txt +0 -0
- {voly-0.0.100 → voly-0.0.102}/src/voly.egg-info/requires.txt +0 -0
- {voly-0.0.100 → voly-0.0.102}/src/voly.egg-info/top_level.txt +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.102"
|
|
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.102"
|
|
64
64
|
warn_return_any = true
|
|
65
65
|
warn_unused_configs = true
|
|
66
66
|
disallow_untyped_defs = true
|
|
@@ -86,6 +86,10 @@ class VolyClient:
|
|
|
86
86
|
# SVI, Black-Scholes and Greeks Calculations
|
|
87
87
|
# -------------------------------------------------------------------------
|
|
88
88
|
|
|
89
|
+
@staticmethod
|
|
90
|
+
def svi(LM: float, a: float, b: float, sigma: float, rho: float, m: float) -> float:
|
|
91
|
+
return svi(LM, a, b, sigma, rho, m)
|
|
92
|
+
|
|
89
93
|
@staticmethod
|
|
90
94
|
def d1(s: float, K: float, r: float, o: float, t: float,
|
|
91
95
|
option_type: str = 'call') -> float:
|
|
@@ -9,7 +9,7 @@ from typing import Dict, List, Tuple, Optional, Union, Any
|
|
|
9
9
|
from voly.utils.logger import logger, catch_exception
|
|
10
10
|
from voly.exceptions import VolyError
|
|
11
11
|
from voly.models import SVIModel
|
|
12
|
-
from voly.formulas import get_domain
|
|
12
|
+
from voly.formulas import bs, d1, d2, get_domain
|
|
13
13
|
from scipy import stats
|
|
14
14
|
|
|
15
15
|
|
|
@@ -22,7 +22,7 @@ def breeden(domain_params, s, r, o, t, return_domain):
|
|
|
22
22
|
K = get_domain(domain_params, s, r, o, t, 'strikes')
|
|
23
23
|
D = get_domain(domain_params, s, r, o, t, 'delta')
|
|
24
24
|
|
|
25
|
-
c =
|
|
25
|
+
c = bs(s, K, r, o, t, option_type='call')
|
|
26
26
|
c1 = np.gradient(c, K)
|
|
27
27
|
c2 = np.gradient(c1, K)
|
|
28
28
|
|
|
@@ -36,8 +36,8 @@ def breeden(domain_params, s, r, o, t, return_domain):
|
|
|
36
36
|
pdf_m = pdf_k * s
|
|
37
37
|
pdf_r = pdf_lm / (1 + R)
|
|
38
38
|
|
|
39
|
-
|
|
40
|
-
dd_dK =
|
|
39
|
+
pdf_d1 = stats.norm.pdf(d1(s, K, r, o, t, option_type='call'))
|
|
40
|
+
dd_dK = pdf_d1 / (o * np.sqrt(t) * K)
|
|
41
41
|
pdf_d = pdf_k / dd_dK
|
|
42
42
|
|
|
43
43
|
cdf = np.cumsum(pdf_lm) * dx
|
|
@@ -87,8 +87,8 @@ def rookley(domain_params, s, r, o, t, return_domain):
|
|
|
87
87
|
rt = r * t
|
|
88
88
|
ert = np.exp(rt)
|
|
89
89
|
|
|
90
|
-
|
|
91
|
-
|
|
90
|
+
n_d1 = (np.log(M) + (r + 1 / 2 * o ** 2) * t) / (o * st)
|
|
91
|
+
n_d2 = n_d1 - o * st
|
|
92
92
|
|
|
93
93
|
del_d1_M = 1 / (M * o * st)
|
|
94
94
|
del_d2_M = del_d1_M
|
|
@@ -109,12 +109,12 @@ def rookley(domain_params, s, r, o, t, return_domain):
|
|
|
109
109
|
+ o1 * (2 * o1 * (np.log(M) + rt) / (o ** 3 * st) - 1 / (M * o ** 2 * st))
|
|
110
110
|
)
|
|
111
111
|
|
|
112
|
-
d_c_M = stats.norm.pdf(
|
|
112
|
+
d_c_M = stats.norm.pdf(n_d1) * d_d1_M - 1 / ert * stats.norm.pdf(n_d2) / M * d_d2_M + 1 / ert * stats.norm.cdf(n_d2) / (
|
|
113
113
|
M ** 2)
|
|
114
114
|
dd_c_M = (
|
|
115
|
-
stats.norm.pdf(
|
|
116
|
-
- stats.norm.pdf(
|
|
117
|
-
- 2 * stats.norm.cdf(
|
|
115
|
+
stats.norm.pdf(n_d1) * (dd_d1_M - n_d1 * d_d1_M ** 2)
|
|
116
|
+
- stats.norm.pdf(n_d2) / (ert * M) * (dd_d2_M - 2 / M * d_d2_M - n_d2 * d_d2_M ** 2)
|
|
117
|
+
- 2 * stats.norm.cdf(n_d2) / (ert * M ** 3)
|
|
118
118
|
)
|
|
119
119
|
|
|
120
120
|
dd_c_K = dd_c_M * (M / K) ** 2 + 2 * d_c_M * (M / K ** 2)
|
|
@@ -129,8 +129,8 @@ def rookley(domain_params, s, r, o, t, return_domain):
|
|
|
129
129
|
pdf_m = pdf_k * s
|
|
130
130
|
pdf_r = pdf_lm / (1 + R)
|
|
131
131
|
|
|
132
|
-
|
|
133
|
-
dd_dK =
|
|
132
|
+
pdf_d1 = stats.norm.pdf(d1(s, K, r, o, t, option_type='call'))
|
|
133
|
+
dd_dK = pdf_d1 / (o * np.sqrt(t) * K)
|
|
134
134
|
pdf_d = pdf_k / dd_dK
|
|
135
135
|
|
|
136
136
|
cdf = np.cumsum(pdf_lm) * dx
|
|
@@ -36,16 +36,16 @@ class SVIModel:
|
|
|
36
36
|
}
|
|
37
37
|
|
|
38
38
|
@staticmethod
|
|
39
|
-
def svi(
|
|
40
|
-
return a + b * (rho * (
|
|
39
|
+
def svi(LM: float, a: float, b: float, sigma: float, rho: float, m: float) -> float:
|
|
40
|
+
return a + b * (rho * (LM - m) + np.sqrt((LM - m) ** 2 + sigma ** 2))
|
|
41
41
|
|
|
42
42
|
@staticmethod
|
|
43
|
-
def svi_d(
|
|
44
|
-
return b * (rho + ((
|
|
43
|
+
def svi_d(LM: float, a: float, b: float, sigma: float, rho: float, m: float) -> float:
|
|
44
|
+
return b * (rho + ((LM - m) / np.sqrt((LM - m) ** 2 + sigma ** 2)))
|
|
45
45
|
|
|
46
46
|
@staticmethod
|
|
47
|
-
def svi_dd(
|
|
48
|
-
return b *
|
|
47
|
+
def svi_dd(LM: float, a: float, b: float, sigma: float, rho: float, m: float) -> float:
|
|
48
|
+
return b * LM ** 2 / ((LM - m) ** 2 + sigma ** 2) ** 1.5
|
|
49
49
|
|
|
50
50
|
@staticmethod
|
|
51
51
|
def svi_min_strike(sigma: float, rho: float, m: float) -> float:
|
|
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
|