mirror of
https://github.com/OpenBB-finance/OpenBB.git
synced 2026-11-05 08:51:20 +00:00
Core SDK improvements (#5294)
* added `yfinance` data provider * static files * `yfinance` model cleanup * static files * add tests folder to yfinance * added `yfinance` in `extensions` `pyproject.toml` * feature/sdk-v4-cboe-provider: Adds CBOE Provider to SDK V4 (#5300) * add cboe provider, fix regressions introduced by merge conflict * black * black again * codespell - openbb_sdk/sdk/provider/README.md * ruff * ruff again * static files * modified `StockNews` date to type datetime * static file * cboe cleanup --------- Co-authored-by: Danglewood <85772166+deeleeramone@users.noreply.github.com>
This commit is contained in:
@@ -1,19 +1,29 @@
|
||||
"""Options Router."""
|
||||
|
||||
from openbb_core.app.model.command_context import CommandContext
|
||||
from openbb_core.app.model.command_output import CommandOutput
|
||||
from openbb_core.app.model.results.empty import Empty
|
||||
from openbb_core.app.provider_interface import (
|
||||
ExtraParams,
|
||||
ProviderChoices,
|
||||
StandardParams,
|
||||
)
|
||||
from openbb_core.app.query import Query
|
||||
from openbb_core.app.router import Router
|
||||
from pydantic import BaseModel
|
||||
|
||||
router = Router(prefix="/options")
|
||||
|
||||
|
||||
@router.command
|
||||
def chains() -> CommandOutput[Empty]: # type: ignore
|
||||
"""Return options chains with greeks."""
|
||||
return CommandOutput(results=Empty())
|
||||
|
||||
|
||||
@router.command
|
||||
def dte() -> CommandOutput[Empty]: # type: ignore
|
||||
return CommandOutput(results=Empty())
|
||||
@router.command(model="OptionsChains")
|
||||
def chains(
|
||||
cc: CommandContext,
|
||||
provider_choices: ProviderChoices,
|
||||
standard_params: StandardParams,
|
||||
extra_params: ExtraParams,
|
||||
) -> CommandOutput[BaseModel]:
|
||||
"""Get the complete options chain for a ticker."""
|
||||
return CommandOutput(results=Query(**locals()).execute())
|
||||
|
||||
|
||||
@router.command
|
||||
@@ -22,21 +32,9 @@ def eodchain() -> CommandOutput[Empty]: # type: ignore
|
||||
return CommandOutput(results=Empty())
|
||||
|
||||
|
||||
@router.command
|
||||
def expirations() -> CommandOutput[Empty]: # type: ignore
|
||||
"""Return options expirations."""
|
||||
return CommandOutput(results=Empty())
|
||||
|
||||
|
||||
@router.command
|
||||
def grhist() -> CommandOutput[Empty]: # type: ignore
|
||||
"""Plot option greek history."""
|
||||
return CommandOutput(results=Empty())
|
||||
|
||||
|
||||
@router.command
|
||||
def hist() -> CommandOutput[Empty]: # type: ignore
|
||||
"""Plot option history."""
|
||||
"""Get historical data for a single option contract."""
|
||||
return CommandOutput(results=Empty())
|
||||
|
||||
|
||||
@@ -46,26 +44,9 @@ def info() -> CommandOutput[Empty]: # type: ignore
|
||||
return CommandOutput(results=Empty())
|
||||
|
||||
|
||||
@router.command
|
||||
def last_price() -> CommandOutput[Empty]: # type: ignore
|
||||
"""Return last price of an option."""
|
||||
return CommandOutput(results=Empty())
|
||||
|
||||
|
||||
@router.command
|
||||
def oi() -> CommandOutput[Empty]: # type: ignore
|
||||
"""Plot option open interest."""
|
||||
return CommandOutput(results=Empty())
|
||||
|
||||
|
||||
@router.command
|
||||
def pcr() -> CommandOutput[Empty]: # type: ignore
|
||||
"""Display put/call ratio for ticker."""
|
||||
return CommandOutput(results=Empty())
|
||||
|
||||
|
||||
@router.command
|
||||
def price() -> CommandOutput[Empty]: # type: ignore
|
||||
"""Display historical rolling put/call ratio for ticker over a defined window."""
|
||||
return CommandOutput(results=Empty())
|
||||
|
||||
|
||||
@@ -73,21 +54,3 @@ def price() -> CommandOutput[Empty]: # type: ignore
|
||||
def unu() -> CommandOutput[Empty]: # type: ignore
|
||||
"""Show unusual options activity."""
|
||||
return CommandOutput(results=Empty())
|
||||
|
||||
|
||||
@router.command
|
||||
def voi() -> CommandOutput[Empty]: # type: ignore
|
||||
"""Plot volume and open interest."""
|
||||
return CommandOutput(results=Empty())
|
||||
|
||||
|
||||
@router.command
|
||||
def vol() -> CommandOutput[Empty]: # type: ignore
|
||||
"""Plot volume."""
|
||||
return CommandOutput(results=Empty())
|
||||
|
||||
|
||||
@router.command
|
||||
def vsurf() -> CommandOutput[Empty]: # type: ignore
|
||||
"""Show 3D volatility surface."""
|
||||
return CommandOutput(results=Empty())
|
||||
|
||||
@@ -73,6 +73,17 @@ def tob() -> CommandOutput[Empty]:
|
||||
return CommandOutput(results=Empty())
|
||||
|
||||
|
||||
@router.command(model="StockSearch")
|
||||
def search(
|
||||
cc: CommandContext,
|
||||
provider_choices: ProviderChoices,
|
||||
standard_params: StandardParams,
|
||||
extra_params: ExtraParams,
|
||||
) -> CommandOutput[BaseModel]:
|
||||
"""Search for a company or stock ticker."""
|
||||
return CommandOutput(results=Query(**locals()).execute())
|
||||
|
||||
|
||||
@router.command(model="StockQuote")
|
||||
def quote(
|
||||
cc: CommandContext,
|
||||
@@ -84,7 +95,12 @@ def quote(
|
||||
return CommandOutput(results=Query(**locals()).execute())
|
||||
|
||||
|
||||
@router.command
|
||||
def search() -> CommandOutput[Empty]:
|
||||
"""Search a specific stock ticker for analysis."""
|
||||
return CommandOutput(results=Empty())
|
||||
@router.command(model="StockInfo")
|
||||
def info(
|
||||
cc: CommandContext,
|
||||
provider_choices: ProviderChoices,
|
||||
standard_params: StandardParams,
|
||||
extra_params: ExtraParams,
|
||||
) -> CommandOutput[BaseModel]:
|
||||
"""Get general price and performance metrics of a stock."""
|
||||
return CommandOutput(results=Query(**locals()).execute())
|
||||
|
||||
386
openbb_sdk/poetry.lock
generated
vendored
386
openbb_sdk/poetry.lock
generated
vendored
@@ -1,10 +1,9 @@
|
||||
# This file is automatically @generated by Poetry 1.4.0 and should not be changed by hand.
|
||||
# This file is automatically @generated by Poetry 1.5.1 and should not be changed by hand.
|
||||
|
||||
[[package]]
|
||||
name = "aiohttp"
|
||||
version = "3.8.5"
|
||||
description = "Async http client/server framework (asyncio)"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.6"
|
||||
files = [
|
||||
@@ -113,7 +112,6 @@ speedups = ["Brotli", "aiodns", "cchardet"]
|
||||
name = "aiosignal"
|
||||
version = "1.3.1"
|
||||
description = "aiosignal: a list of registered asynchronous callbacks"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.7"
|
||||
files = [
|
||||
@@ -128,7 +126,6 @@ frozenlist = ">=1.1.0"
|
||||
name = "anyio"
|
||||
version = "3.7.1"
|
||||
description = "High level compatibility layer for multiple asynchronous event loop implementations"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.7"
|
||||
files = [
|
||||
@@ -150,7 +147,6 @@ trio = ["trio (<0.22)"]
|
||||
name = "async-timeout"
|
||||
version = "4.0.2"
|
||||
description = "Timeout context manager for asyncio programs"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.6"
|
||||
files = [
|
||||
@@ -158,11 +154,20 @@ files = [
|
||||
{file = "async_timeout-4.0.2-py3-none-any.whl", hash = "sha256:8ca1e4fcf50d07413d66d1a5e416e42cfdf5851c981d679a09851a6853383b3c"},
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "atomicwrites"
|
||||
version = "1.4.1"
|
||||
description = "Atomic file writes."
|
||||
optional = false
|
||||
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
|
||||
files = [
|
||||
{file = "atomicwrites-1.4.1.tar.gz", hash = "sha256:81b2c9071a49367a7f770170e5eec8cb66567cfbbc8c73d20ce5ca4a8d71cf11"},
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "attrs"
|
||||
version = "23.1.0"
|
||||
description = "Classes Without Boilerplate"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.7"
|
||||
files = [
|
||||
@@ -181,7 +186,6 @@ tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pyte
|
||||
name = "backoff"
|
||||
version = "2.2.1"
|
||||
description = "Function decoration for backoff and retry"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.7,<4.0"
|
||||
files = [
|
||||
@@ -193,7 +197,6 @@ files = [
|
||||
name = "bcrypt"
|
||||
version = "4.0.1"
|
||||
description = "Modern password hashing for your software and your servers"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.6"
|
||||
files = [
|
||||
@@ -228,7 +231,6 @@ typecheck = ["mypy"]
|
||||
name = "certifi"
|
||||
version = "2023.7.22"
|
||||
description = "Python package for providing Mozilla's CA Bundle."
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.6"
|
||||
files = [
|
||||
@@ -240,7 +242,6 @@ files = [
|
||||
name = "charset-normalizer"
|
||||
version = "3.2.0"
|
||||
description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet."
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.7.0"
|
||||
files = [
|
||||
@@ -325,7 +326,6 @@ files = [
|
||||
name = "click"
|
||||
version = "8.1.6"
|
||||
description = "Composable command line interface toolkit"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.7"
|
||||
files = [
|
||||
@@ -340,7 +340,6 @@ colorama = {version = "*", markers = "platform_system == \"Windows\""}
|
||||
name = "colorama"
|
||||
version = "0.4.6"
|
||||
description = "Cross-platform colored terminal text."
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7"
|
||||
files = [
|
||||
@@ -352,7 +351,6 @@ files = [
|
||||
name = "cssselect2"
|
||||
version = "0.7.0"
|
||||
description = "CSS selectors for Python ElementTree"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.7"
|
||||
files = [
|
||||
@@ -370,23 +368,18 @@ test = ["flake8", "isort", "pytest"]
|
||||
|
||||
[[package]]
|
||||
name = "dnspython"
|
||||
version = "2.4.0"
|
||||
version = "2.4.1"
|
||||
description = "DNS toolkit"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.8,<4.0"
|
||||
files = [
|
||||
{file = "dnspython-2.4.0-py3-none-any.whl", hash = "sha256:46b4052a55b56beea3a3bdd7b30295c292bd6827dd442348bc116f2d35b17f0a"},
|
||||
{file = "dnspython-2.4.0.tar.gz", hash = "sha256:758e691dbb454d5ccf4e1b154a19e52847f79e21a42fef17b969144af29a4e6c"},
|
||||
{file = "dnspython-2.4.1-py3-none-any.whl", hash = "sha256:5b7488477388b8c0b70a8ce93b227c5603bc7b77f1565afe8e729c36c51447d7"},
|
||||
{file = "dnspython-2.4.1.tar.gz", hash = "sha256:c33971c79af5be968bb897e95c2448e11a645ee84d93b265ce0b7aabe5dfdca8"},
|
||||
]
|
||||
|
||||
[package.dependencies]
|
||||
httpcore = {version = ">=0.17.3", markers = "python_version >= \"3.8\""}
|
||||
sniffio = ">=1.1,<2.0"
|
||||
|
||||
[package.extras]
|
||||
dnssec = ["cryptography (>=2.6,<42.0)"]
|
||||
doh = ["h2 (>=4.1.0)", "httpx (>=0.24.1)"]
|
||||
doh = ["h2 (>=4.1.0)", "httpcore (>=0.17.3)", "httpx (>=0.24.1)"]
|
||||
doq = ["aioquic (>=0.9.20)"]
|
||||
idna = ["idna (>=2.1,<4.0)"]
|
||||
trio = ["trio (>=0.14,<0.23)"]
|
||||
@@ -396,7 +389,6 @@ wmi = ["wmi (>=1.5.1,<2.0.0)"]
|
||||
name = "ecdsa"
|
||||
version = "0.18.0"
|
||||
description = "ECDSA cryptographic signature library (pure python)"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*"
|
||||
files = [
|
||||
@@ -415,7 +407,6 @@ gmpy2 = ["gmpy2"]
|
||||
name = "exceptiongroup"
|
||||
version = "1.1.2"
|
||||
description = "Backport of PEP 654 (exception groups)"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.7"
|
||||
files = [
|
||||
@@ -430,7 +421,6 @@ test = ["pytest (>=6)"]
|
||||
name = "fastapi"
|
||||
version = "0.95.2"
|
||||
description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.7"
|
||||
files = [
|
||||
@@ -452,7 +442,6 @@ test = ["anyio[trio] (>=3.2.1,<4.0.0)", "black (==23.1.0)", "coverage[toml] (>=6
|
||||
name = "fastjsonschema"
|
||||
version = "2.18.0"
|
||||
description = "Fastest Python implementation of JSON schema"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = "*"
|
||||
files = [
|
||||
@@ -467,7 +456,6 @@ devel = ["colorama", "json-spec", "jsonschema", "pylint", "pytest", "pytest-benc
|
||||
name = "frozenlist"
|
||||
version = "1.4.0"
|
||||
description = "A list-like structure which implements collections.abc.MutableSequence"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.8"
|
||||
files = [
|
||||
@@ -538,7 +526,6 @@ files = [
|
||||
name = "h11"
|
||||
version = "0.14.0"
|
||||
description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.7"
|
||||
files = [
|
||||
@@ -550,7 +537,6 @@ files = [
|
||||
name = "html5lib"
|
||||
version = "1.1"
|
||||
description = "HTML parser based on the WHATWG HTML specification"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
|
||||
files = [
|
||||
@@ -568,33 +554,10 @@ chardet = ["chardet (>=2.2)"]
|
||||
genshi = ["genshi"]
|
||||
lxml = ["lxml"]
|
||||
|
||||
[[package]]
|
||||
name = "httpcore"
|
||||
version = "0.17.3"
|
||||
description = "A minimal low-level HTTP client."
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.7"
|
||||
files = [
|
||||
{file = "httpcore-0.17.3-py3-none-any.whl", hash = "sha256:c2789b767ddddfa2a5782e3199b2b7f6894540b17b16ec26b2c4d8e103510b87"},
|
||||
{file = "httpcore-0.17.3.tar.gz", hash = "sha256:a6f30213335e34c1ade7be6ec7c47f19f50c56db36abef1a9dfa3815b1cb3888"},
|
||||
]
|
||||
|
||||
[package.dependencies]
|
||||
anyio = ">=3.0,<5.0"
|
||||
certifi = "*"
|
||||
h11 = ">=0.13,<0.15"
|
||||
sniffio = ">=1.0.0,<2.0.0"
|
||||
|
||||
[package.extras]
|
||||
http2 = ["h2 (>=3,<5)"]
|
||||
socks = ["socksio (>=1.0.0,<2.0.0)"]
|
||||
|
||||
[[package]]
|
||||
name = "idna"
|
||||
version = "3.4"
|
||||
description = "Internationalized Domain Names in Applications (IDNA)"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.5"
|
||||
files = [
|
||||
@@ -604,14 +567,13 @@ files = [
|
||||
|
||||
[[package]]
|
||||
name = "importlib-resources"
|
||||
version = "6.0.0"
|
||||
version = "6.0.1"
|
||||
description = "Read resources from Python packages"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.8"
|
||||
files = [
|
||||
{file = "importlib_resources-6.0.0-py3-none-any.whl", hash = "sha256:d952faee11004c045f785bb5636e8f885bed30dc3c940d5d42798a2a4541c185"},
|
||||
{file = "importlib_resources-6.0.0.tar.gz", hash = "sha256:4cf94875a8368bd89531a756df9a9ebe1f150e0f885030b461237bc7f2d905f2"},
|
||||
{file = "importlib_resources-6.0.1-py3-none-any.whl", hash = "sha256:134832a506243891221b88b4ae1213327eea96ceb4e407a00d790bb0626f45cf"},
|
||||
{file = "importlib_resources-6.0.1.tar.gz", hash = "sha256:4359457e42708462b9626a04657c6208ad799ceb41e5c58c57ffa0e6a098a5d4"},
|
||||
]
|
||||
|
||||
[package.dependencies]
|
||||
@@ -621,16 +583,26 @@ zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""}
|
||||
docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"]
|
||||
testing = ["pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-ruff"]
|
||||
|
||||
[[package]]
|
||||
name = "iniconfig"
|
||||
version = "2.0.0"
|
||||
description = "brain-dead simple config-ini parsing"
|
||||
optional = false
|
||||
python-versions = ">=3.7"
|
||||
files = [
|
||||
{file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"},
|
||||
{file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"},
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "jsonschema"
|
||||
version = "4.18.4"
|
||||
version = "4.19.0"
|
||||
description = "An implementation of JSON Schema validation for Python"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.8"
|
||||
files = [
|
||||
{file = "jsonschema-4.18.4-py3-none-any.whl", hash = "sha256:971be834317c22daaa9132340a51c01b50910724082c2c1a2ac87eeec153a3fe"},
|
||||
{file = "jsonschema-4.18.4.tar.gz", hash = "sha256:fb3642735399fa958c0d2aad7057901554596c63349f4f6b283c493cf692a25d"},
|
||||
{file = "jsonschema-4.19.0-py3-none-any.whl", hash = "sha256:043dc26a3845ff09d20e4420d6012a9c91c9aa8999fa184e7efcfeccb41e32cb"},
|
||||
{file = "jsonschema-4.19.0.tar.gz", hash = "sha256:6e1e7569ac13be8139b2dd2c21a55d350066ee3f80df06c608b398cdc6f30e8f"},
|
||||
]
|
||||
|
||||
[package.dependencies]
|
||||
@@ -649,7 +621,6 @@ format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-
|
||||
name = "jsonschema-specifications"
|
||||
version = "2023.7.1"
|
||||
description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.8"
|
||||
files = [
|
||||
@@ -665,7 +636,6 @@ referencing = ">=0.28.0"
|
||||
name = "jupyter-core"
|
||||
version = "5.3.1"
|
||||
description = "Jupyter core package. A base package on which Jupyter projects rely."
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.8"
|
||||
files = [
|
||||
@@ -686,7 +656,6 @@ test = ["ipykernel", "pre-commit", "pytest", "pytest-cov", "pytest-timeout"]
|
||||
name = "lxml"
|
||||
version = "4.9.3"
|
||||
description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API."
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, != 3.4.*"
|
||||
files = [
|
||||
@@ -794,7 +763,6 @@ source = ["Cython (>=0.29.35)"]
|
||||
name = "monotonic"
|
||||
version = "1.6"
|
||||
description = "An implementation of time.monotonic() for Python 2 & < 3.3"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = "*"
|
||||
files = [
|
||||
@@ -806,7 +774,6 @@ files = [
|
||||
name = "multidict"
|
||||
version = "6.0.4"
|
||||
description = "multidict implementation"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.7"
|
||||
files = [
|
||||
@@ -888,14 +855,13 @@ files = [
|
||||
|
||||
[[package]]
|
||||
name = "nbformat"
|
||||
version = "5.9.1"
|
||||
version = "5.9.2"
|
||||
description = "The Jupyter Notebook format"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.8"
|
||||
files = [
|
||||
{file = "nbformat-5.9.1-py3-none-any.whl", hash = "sha256:b7968ebf4811178a4108ee837eae1442e3f054132100f0359219e9ed1ce3ca45"},
|
||||
{file = "nbformat-5.9.1.tar.gz", hash = "sha256:3a7f52d040639cbd8a3890218c8b0ffb93211588c57446c90095e32ba5881b5d"},
|
||||
{file = "nbformat-5.9.2-py3-none-any.whl", hash = "sha256:1c5172d786a41b82bcfd0c23f9e6b6f072e8fb49c39250219e4acfff1efe89e9"},
|
||||
{file = "nbformat-5.9.2.tar.gz", hash = "sha256:5f98b5ba1997dff175e77e0c17d5c10a96eaed2cbd1de3533d1fc35d5e111192"},
|
||||
]
|
||||
|
||||
[package.dependencies]
|
||||
@@ -912,7 +878,6 @@ test = ["pep440", "pre-commit", "pytest", "testpath"]
|
||||
name = "numpy"
|
||||
version = "1.24.4"
|
||||
description = "Fundamental package for array computing in Python"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.8"
|
||||
files = [
|
||||
@@ -948,44 +913,42 @@ files = [
|
||||
|
||||
[[package]]
|
||||
name = "numpy"
|
||||
version = "1.25.1"
|
||||
version = "1.25.2"
|
||||
description = "Fundamental package for array computing in Python"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.9"
|
||||
files = [
|
||||
{file = "numpy-1.25.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:77d339465dff3eb33c701430bcb9c325b60354698340229e1dff97745e6b3efa"},
|
||||
{file = "numpy-1.25.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d736b75c3f2cb96843a5c7f8d8ccc414768d34b0a75f466c05f3a739b406f10b"},
|
||||
{file = "numpy-1.25.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a90725800caeaa160732d6b31f3f843ebd45d6b5f3eec9e8cc287e30f2805bf"},
|
||||
{file = "numpy-1.25.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c6c9261d21e617c6dc5eacba35cb68ec36bb72adcff0dee63f8fbc899362588"},
|
||||
{file = "numpy-1.25.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0def91f8af6ec4bb94c370e38c575855bf1d0be8a8fbfba42ef9c073faf2cf19"},
|
||||
{file = "numpy-1.25.1-cp310-cp310-win32.whl", hash = "sha256:fd67b306320dcadea700a8f79b9e671e607f8696e98ec255915c0c6d6b818503"},
|
||||
{file = "numpy-1.25.1-cp310-cp310-win_amd64.whl", hash = "sha256:c1516db588987450b85595586605742879e50dcce923e8973f79529651545b57"},
|
||||
{file = "numpy-1.25.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6b82655dd8efeea69dbf85d00fca40013d7f503212bc5259056244961268b66e"},
|
||||
{file = "numpy-1.25.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e8f6049c4878cb16960fbbfb22105e49d13d752d4d8371b55110941fb3b17800"},
|
||||
{file = "numpy-1.25.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41a56b70e8139884eccb2f733c2f7378af06c82304959e174f8e7370af112e09"},
|
||||
{file = "numpy-1.25.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5154b1a25ec796b1aee12ac1b22f414f94752c5f94832f14d8d6c9ac40bcca6"},
|
||||
{file = "numpy-1.25.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:38eb6548bb91c421261b4805dc44def9ca1a6eef6444ce35ad1669c0f1a3fc5d"},
|
||||
{file = "numpy-1.25.1-cp311-cp311-win32.whl", hash = "sha256:791f409064d0a69dd20579345d852c59822c6aa087f23b07b1b4e28ff5880fcb"},
|
||||
{file = "numpy-1.25.1-cp311-cp311-win_amd64.whl", hash = "sha256:c40571fe966393b212689aa17e32ed905924120737194b5d5c1b20b9ed0fb171"},
|
||||
{file = "numpy-1.25.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3d7abcdd85aea3e6cdddb59af2350c7ab1ed764397f8eec97a038ad244d2d105"},
|
||||
{file = "numpy-1.25.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1a180429394f81c7933634ae49b37b472d343cccb5bb0c4a575ac8bbc433722f"},
|
||||
{file = "numpy-1.25.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d412c1697c3853c6fc3cb9751b4915859c7afe6a277c2bf00acf287d56c4e625"},
|
||||
{file = "numpy-1.25.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20e1266411120a4f16fad8efa8e0454d21d00b8c7cee5b5ccad7565d95eb42dd"},
|
||||
{file = "numpy-1.25.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:f76aebc3358ade9eacf9bc2bb8ae589863a4f911611694103af05346637df1b7"},
|
||||
{file = "numpy-1.25.1-cp39-cp39-win32.whl", hash = "sha256:247d3ffdd7775bdf191f848be8d49100495114c82c2bd134e8d5d075fb386a1c"},
|
||||
{file = "numpy-1.25.1-cp39-cp39-win_amd64.whl", hash = "sha256:1d5d3c68e443c90b38fdf8ef40e60e2538a27548b39b12b73132456847f4b631"},
|
||||
{file = "numpy-1.25.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:35a9527c977b924042170a0887de727cd84ff179e478481404c5dc66b4170009"},
|
||||
{file = "numpy-1.25.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d3fe3dd0506a28493d82dc3cf254be8cd0d26f4008a417385cbf1ae95b54004"},
|
||||
{file = "numpy-1.25.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:012097b5b0d00a11070e8f2e261128c44157a8689f7dedcf35576e525893f4fe"},
|
||||
{file = "numpy-1.25.1.tar.gz", hash = "sha256:9a3a9f3a61480cc086117b426a8bd86869c213fc4072e606f01c4e4b66eb92bf"},
|
||||
{file = "numpy-1.25.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:db3ccc4e37a6873045580d413fe79b68e47a681af8db2e046f1dacfa11f86eb3"},
|
||||
{file = "numpy-1.25.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:90319e4f002795ccfc9050110bbbaa16c944b1c37c0baeea43c5fb881693ae1f"},
|
||||
{file = "numpy-1.25.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dfe4a913e29b418d096e696ddd422d8a5d13ffba4ea91f9f60440a3b759b0187"},
|
||||
{file = "numpy-1.25.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f08f2e037bba04e707eebf4bc934f1972a315c883a9e0ebfa8a7756eabf9e357"},
|
||||
{file = "numpy-1.25.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bec1e7213c7cb00d67093247f8c4db156fd03075f49876957dca4711306d39c9"},
|
||||
{file = "numpy-1.25.2-cp310-cp310-win32.whl", hash = "sha256:7dc869c0c75988e1c693d0e2d5b26034644399dd929bc049db55395b1379e044"},
|
||||
{file = "numpy-1.25.2-cp310-cp310-win_amd64.whl", hash = "sha256:834b386f2b8210dca38c71a6e0f4fd6922f7d3fcff935dbe3a570945acb1b545"},
|
||||
{file = "numpy-1.25.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c5462d19336db4560041517dbb7759c21d181a67cb01b36ca109b2ae37d32418"},
|
||||
{file = "numpy-1.25.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c5652ea24d33585ea39eb6a6a15dac87a1206a692719ff45d53c5282e66d4a8f"},
|
||||
{file = "numpy-1.25.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d60fbae8e0019865fc4784745814cff1c421df5afee233db6d88ab4f14655a2"},
|
||||
{file = "numpy-1.25.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:60e7f0f7f6d0eee8364b9a6304c2845b9c491ac706048c7e8cf47b83123b8dbf"},
|
||||
{file = "numpy-1.25.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:bb33d5a1cf360304754913a350edda36d5b8c5331a8237268c48f91253c3a364"},
|
||||
{file = "numpy-1.25.2-cp311-cp311-win32.whl", hash = "sha256:5883c06bb92f2e6c8181df7b39971a5fb436288db58b5a1c3967702d4278691d"},
|
||||
{file = "numpy-1.25.2-cp311-cp311-win_amd64.whl", hash = "sha256:5c97325a0ba6f9d041feb9390924614b60b99209a71a69c876f71052521d42a4"},
|
||||
{file = "numpy-1.25.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b79e513d7aac42ae918db3ad1341a015488530d0bb2a6abcbdd10a3a829ccfd3"},
|
||||
{file = "numpy-1.25.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:eb942bfb6f84df5ce05dbf4b46673ffed0d3da59f13635ea9b926af3deb76926"},
|
||||
{file = "numpy-1.25.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e0746410e73384e70d286f93abf2520035250aad8c5714240b0492a7302fdca"},
|
||||
{file = "numpy-1.25.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7806500e4f5bdd04095e849265e55de20d8cc4b661b038957354327f6d9b295"},
|
||||
{file = "numpy-1.25.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8b77775f4b7df768967a7c8b3567e309f617dd5e99aeb886fa14dc1a0791141f"},
|
||||
{file = "numpy-1.25.2-cp39-cp39-win32.whl", hash = "sha256:2792d23d62ec51e50ce4d4b7d73de8f67a2fd3ea710dcbc8563a51a03fb07b01"},
|
||||
{file = "numpy-1.25.2-cp39-cp39-win_amd64.whl", hash = "sha256:76b4115d42a7dfc5d485d358728cdd8719be33cc5ec6ec08632a5d6fca2ed380"},
|
||||
{file = "numpy-1.25.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:1a1329e26f46230bf77b02cc19e900db9b52f398d6722ca853349a782d4cff55"},
|
||||
{file = "numpy-1.25.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c3abc71e8b6edba80a01a52e66d83c5d14433cbcd26a40c329ec7ed09f37901"},
|
||||
{file = "numpy-1.25.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:1b9735c27cea5d995496f46a8b1cd7b408b3f34b6d50459d9ac8fe3a20cc17bf"},
|
||||
{file = "numpy-1.25.2.tar.gz", hash = "sha256:fd608e19c8d7c55021dffd43bfe5492fab8cc105cc8986f813f8c3c048b38760"},
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "openbb-benzinga"
|
||||
version = "0.1.1"
|
||||
description = ""
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = "^3.8"
|
||||
files = []
|
||||
@@ -1002,9 +965,8 @@ url = "providers/benzinga"
|
||||
name = "openbb-charting"
|
||||
version = "0.1.0"
|
||||
description = "Charting extension for OpenBB SDK"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.8,<3.12" # scipy forces python <4.0 explicitly
|
||||
python-versions = ">=3.8,<3.12"
|
||||
files = []
|
||||
develop = false
|
||||
|
||||
@@ -1029,7 +991,6 @@ url = "extensions/charting"
|
||||
name = "openbb-core"
|
||||
version = "0.2.0"
|
||||
description = ""
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = "^3.8"
|
||||
files = []
|
||||
@@ -1060,7 +1021,6 @@ url = "sdk/core"
|
||||
name = "openbb-crypto"
|
||||
version = "0.1.1"
|
||||
description = ""
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = "^3.8"
|
||||
files = []
|
||||
@@ -1077,7 +1037,6 @@ url = "extensions/crypto"
|
||||
name = "openbb-economy"
|
||||
version = "0.1.1"
|
||||
description = ""
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = "^3.8"
|
||||
files = []
|
||||
@@ -1094,7 +1053,6 @@ url = "extensions/economy"
|
||||
name = "openbb-fixedincome"
|
||||
version = "0.1.1"
|
||||
description = ""
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = "^3.8"
|
||||
files = []
|
||||
@@ -1111,7 +1069,6 @@ url = "extensions/fixedincome"
|
||||
name = "openbb-fmp"
|
||||
version = "0.1.1"
|
||||
description = ""
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = "^3.8"
|
||||
files = []
|
||||
@@ -1128,7 +1085,6 @@ url = "providers/fmp"
|
||||
name = "openbb-forex"
|
||||
version = "0.1.1"
|
||||
description = ""
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = "^3.8"
|
||||
files = []
|
||||
@@ -1145,7 +1101,6 @@ url = "extensions/forex"
|
||||
name = "openbb-fred"
|
||||
version = "0.1.1"
|
||||
description = ""
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = "^3.8"
|
||||
files = []
|
||||
@@ -1162,7 +1117,6 @@ url = "providers/fred"
|
||||
name = "openbb-news"
|
||||
version = "0.1.1"
|
||||
description = ""
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = "^3.8"
|
||||
files = []
|
||||
@@ -1179,7 +1133,6 @@ url = "extensions/news"
|
||||
name = "openbb-polygon"
|
||||
version = "0.1.1"
|
||||
description = ""
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = "^3.8"
|
||||
files = []
|
||||
@@ -1196,7 +1149,6 @@ url = "providers/polygon"
|
||||
name = "openbb-provider"
|
||||
version = "0.2.0"
|
||||
description = ""
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = "^3.8"
|
||||
files = []
|
||||
@@ -1215,7 +1167,6 @@ url = "sdk/provider"
|
||||
name = "openbb-stocks"
|
||||
version = "0.1.0"
|
||||
description = "Stocks extension for OpenBB SDK"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = "^3.8"
|
||||
files = []
|
||||
@@ -1228,11 +1179,26 @@ openbb-core = {path = "../../sdk/core"}
|
||||
type = "directory"
|
||||
url = "extensions/stocks"
|
||||
|
||||
[[package]]
|
||||
name = "openbb-yfinance"
|
||||
version = "0.1.1"
|
||||
description = ""
|
||||
optional = false
|
||||
python-versions = "^3.8"
|
||||
files = []
|
||||
develop = false
|
||||
|
||||
[package.dependencies]
|
||||
openbb-provider = {path = "../../sdk/provider"}
|
||||
|
||||
[package.source]
|
||||
type = "directory"
|
||||
url = "providers/yfinance"
|
||||
|
||||
[[package]]
|
||||
name = "packaging"
|
||||
version = "23.1"
|
||||
description = "Core utilities for Python packages"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.7"
|
||||
files = [
|
||||
@@ -1244,7 +1210,6 @@ files = [
|
||||
name = "pandas"
|
||||
version = "2.0.3"
|
||||
description = "Powerful data structures for data analysis, time series, and statistics"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.8"
|
||||
files = [
|
||||
@@ -1312,7 +1277,6 @@ xml = ["lxml (>=4.6.3)"]
|
||||
name = "pandas-ta"
|
||||
version = "0.3.14b"
|
||||
description = "An easy to use Python 3 Pandas Extension with 130+ Technical Analysis Indicators. Can be called from a Pandas DataFrame or standalone like TA-Lib. Correlation tested with TA-Lib."
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = "*"
|
||||
files = [
|
||||
@@ -1330,7 +1294,6 @@ test = ["ta-lib"]
|
||||
name = "passlib"
|
||||
version = "1.7.4"
|
||||
description = "comprehensive password hashing framework supporting over 30 schemes"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = "*"
|
||||
files = [
|
||||
@@ -1348,7 +1311,6 @@ totp = ["cryptography"]
|
||||
name = "patsy"
|
||||
version = "0.5.3"
|
||||
description = "A Python package for describing statistical models and for building design matrices."
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = "*"
|
||||
files = [
|
||||
@@ -1367,7 +1329,6 @@ test = ["pytest", "pytest-cov", "scipy"]
|
||||
name = "pillow"
|
||||
version = "10.0.0"
|
||||
description = "Python Imaging Library (Fork)"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.8"
|
||||
files = [
|
||||
@@ -1437,7 +1398,6 @@ tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "pa
|
||||
name = "pkgutil-resolve-name"
|
||||
version = "1.3.10"
|
||||
description = "Resolve a name to an object."
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.6"
|
||||
files = [
|
||||
@@ -1447,25 +1407,23 @@ files = [
|
||||
|
||||
[[package]]
|
||||
name = "platformdirs"
|
||||
version = "3.9.1"
|
||||
version = "3.10.0"
|
||||
description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"."
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.7"
|
||||
files = [
|
||||
{file = "platformdirs-3.9.1-py3-none-any.whl", hash = "sha256:ad8291ae0ae5072f66c16945166cb11c63394c7a3ad1b1bc9828ca3162da8c2f"},
|
||||
{file = "platformdirs-3.9.1.tar.gz", hash = "sha256:1b42b450ad933e981d56e59f1b97495428c9bd60698baab9f3eb3d00d5822421"},
|
||||
{file = "platformdirs-3.10.0-py3-none-any.whl", hash = "sha256:d7c24979f292f916dc9cbf8648319032f551ea8c49a4c9bf2fb556a02070ec1d"},
|
||||
{file = "platformdirs-3.10.0.tar.gz", hash = "sha256:b45696dab2d7cc691a3226759c0d3b00c47c8b6e293d96f6436f733303f77f6d"},
|
||||
]
|
||||
|
||||
[package.extras]
|
||||
docs = ["furo (>=2023.5.20)", "proselint (>=0.13)", "sphinx (>=7.0.1)", "sphinx-autodoc-typehints (>=1.23,!=1.23.4)"]
|
||||
test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.3.1)", "pytest-cov (>=4.1)", "pytest-mock (>=3.10)"]
|
||||
docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.1)", "sphinx-autodoc-typehints (>=1.24)"]
|
||||
test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)"]
|
||||
|
||||
[[package]]
|
||||
name = "plotly"
|
||||
version = "5.15.0"
|
||||
description = "An open-source, interactive data visualization library for Python"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.6"
|
||||
files = [
|
||||
@@ -1477,11 +1435,25 @@ files = [
|
||||
packaging = "*"
|
||||
tenacity = ">=6.2.0"
|
||||
|
||||
[[package]]
|
||||
name = "pluggy"
|
||||
version = "1.2.0"
|
||||
description = "plugin and hook calling mechanisms for python"
|
||||
optional = false
|
||||
python-versions = ">=3.7"
|
||||
files = [
|
||||
{file = "pluggy-1.2.0-py3-none-any.whl", hash = "sha256:c2fd55a7d7a3863cba1a013e4e2414658b1d07b6bc57b3919e0c63c9abb99849"},
|
||||
{file = "pluggy-1.2.0.tar.gz", hash = "sha256:d12f0c4b579b15f5e054301bb226ee85eeeba08ffec228092f8defbaa3a4c4b3"},
|
||||
]
|
||||
|
||||
[package.extras]
|
||||
dev = ["pre-commit", "tox"]
|
||||
testing = ["pytest", "pytest-benchmark"]
|
||||
|
||||
[[package]]
|
||||
name = "posthog"
|
||||
version = "3.0.1"
|
||||
description = "Integrate PostHog into any python application."
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = "*"
|
||||
files = [
|
||||
@@ -1501,11 +1473,21 @@ dev = ["black", "flake8", "flake8-print", "isort", "pre-commit"]
|
||||
sentry = ["django", "sentry-sdk"]
|
||||
test = ["coverage", "flake8", "freezegun (==0.3.15)", "mock (>=2.0.0)", "pylint", "pytest"]
|
||||
|
||||
[[package]]
|
||||
name = "py"
|
||||
version = "1.11.0"
|
||||
description = "library with cross-python path, ini-parsing, io, code, log facilities"
|
||||
optional = false
|
||||
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
|
||||
files = [
|
||||
{file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"},
|
||||
{file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"},
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "pyasn1"
|
||||
version = "0.5.0"
|
||||
description = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208)"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7"
|
||||
files = [
|
||||
@@ -1515,48 +1497,47 @@ files = [
|
||||
|
||||
[[package]]
|
||||
name = "pydantic"
|
||||
version = "1.10.11"
|
||||
version = "1.10.12"
|
||||
description = "Data validation and settings management using python type hints"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.7"
|
||||
files = [
|
||||
{file = "pydantic-1.10.11-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ff44c5e89315b15ff1f7fdaf9853770b810936d6b01a7bcecaa227d2f8fe444f"},
|
||||
{file = "pydantic-1.10.11-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a6c098d4ab5e2d5b3984d3cb2527e2d6099d3de85630c8934efcfdc348a9760e"},
|
||||
{file = "pydantic-1.10.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:16928fdc9cb273c6af00d9d5045434c39afba5f42325fb990add2c241402d151"},
|
||||
{file = "pydantic-1.10.11-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0588788a9a85f3e5e9ebca14211a496409cb3deca5b6971ff37c556d581854e7"},
|
||||
{file = "pydantic-1.10.11-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e9baf78b31da2dc3d3f346ef18e58ec5f12f5aaa17ac517e2ffd026a92a87588"},
|
||||
{file = "pydantic-1.10.11-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:373c0840f5c2b5b1ccadd9286782852b901055998136287828731868027a724f"},
|
||||
{file = "pydantic-1.10.11-cp310-cp310-win_amd64.whl", hash = "sha256:c3339a46bbe6013ef7bdd2844679bfe500347ac5742cd4019a88312aa58a9847"},
|
||||
{file = "pydantic-1.10.11-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:08a6c32e1c3809fbc49debb96bf833164f3438b3696abf0fbeceb417d123e6eb"},
|
||||
{file = "pydantic-1.10.11-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a451ccab49971af043ec4e0d207cbc8cbe53dbf148ef9f19599024076fe9c25b"},
|
||||
{file = "pydantic-1.10.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5b02d24f7b2b365fed586ed73582c20f353a4c50e4be9ba2c57ab96f8091ddae"},
|
||||
{file = "pydantic-1.10.11-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3f34739a89260dfa420aa3cbd069fbcc794b25bbe5c0a214f8fb29e363484b66"},
|
||||
{file = "pydantic-1.10.11-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:e297897eb4bebde985f72a46a7552a7556a3dd11e7f76acda0c1093e3dbcf216"},
|
||||
{file = "pydantic-1.10.11-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d185819a7a059550ecb85d5134e7d40f2565f3dd94cfd870132c5f91a89cf58c"},
|
||||
{file = "pydantic-1.10.11-cp311-cp311-win_amd64.whl", hash = "sha256:4400015f15c9b464c9db2d5d951b6a780102cfa5870f2c036d37c23b56f7fc1b"},
|
||||
{file = "pydantic-1.10.11-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2417de68290434461a266271fc57274a138510dca19982336639484c73a07af6"},
|
||||
{file = "pydantic-1.10.11-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:331c031ba1554b974c98679bd0780d89670d6fd6f53f5d70b10bdc9addee1713"},
|
||||
{file = "pydantic-1.10.11-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8268a735a14c308923e8958363e3a3404f6834bb98c11f5ab43251a4e410170c"},
|
||||
{file = "pydantic-1.10.11-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:44e51ba599c3ef227e168424e220cd3e544288c57829520dc90ea9cb190c3248"},
|
||||
{file = "pydantic-1.10.11-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d7781f1d13b19700b7949c5a639c764a077cbbdd4322ed505b449d3ca8edcb36"},
|
||||
{file = "pydantic-1.10.11-cp37-cp37m-win_amd64.whl", hash = "sha256:7522a7666157aa22b812ce14c827574ddccc94f361237ca6ea8bb0d5c38f1629"},
|
||||
{file = "pydantic-1.10.11-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bc64eab9b19cd794a380179ac0e6752335e9555d214cfcb755820333c0784cb3"},
|
||||
{file = "pydantic-1.10.11-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8dc77064471780262b6a68fe67e013298d130414d5aaf9b562c33987dbd2cf4f"},
|
||||
{file = "pydantic-1.10.11-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe429898f2c9dd209bd0632a606bddc06f8bce081bbd03d1c775a45886e2c1cb"},
|
||||
{file = "pydantic-1.10.11-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:192c608ad002a748e4a0bed2ddbcd98f9b56df50a7c24d9a931a8c5dd053bd3d"},
|
||||
{file = "pydantic-1.10.11-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ef55392ec4bb5721f4ded1096241e4b7151ba6d50a50a80a2526c854f42e6a2f"},
|
||||
{file = "pydantic-1.10.11-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:41e0bb6efe86281623abbeeb0be64eab740c865388ee934cd3e6a358784aca6e"},
|
||||
{file = "pydantic-1.10.11-cp38-cp38-win_amd64.whl", hash = "sha256:265a60da42f9f27e0b1014eab8acd3e53bd0bad5c5b4884e98a55f8f596b2c19"},
|
||||
{file = "pydantic-1.10.11-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:469adf96c8e2c2bbfa655fc7735a2a82f4c543d9fee97bd113a7fb509bf5e622"},
|
||||
{file = "pydantic-1.10.11-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e6cbfbd010b14c8a905a7b10f9fe090068d1744d46f9e0c021db28daeb8b6de1"},
|
||||
{file = "pydantic-1.10.11-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:abade85268cc92dff86d6effcd917893130f0ff516f3d637f50dadc22ae93999"},
|
||||
{file = "pydantic-1.10.11-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e9738b0f2e6c70f44ee0de53f2089d6002b10c33264abee07bdb5c7f03038303"},
|
||||
{file = "pydantic-1.10.11-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:787cf23e5a0cde753f2eabac1b2e73ae3844eb873fd1f5bdbff3048d8dbb7604"},
|
||||
{file = "pydantic-1.10.11-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:174899023337b9fc685ac8adaa7b047050616136ccd30e9070627c1aaab53a13"},
|
||||
{file = "pydantic-1.10.11-cp39-cp39-win_amd64.whl", hash = "sha256:1954f8778489a04b245a1e7b8b22a9d3ea8ef49337285693cf6959e4b757535e"},
|
||||
{file = "pydantic-1.10.11-py3-none-any.whl", hash = "sha256:008c5e266c8aada206d0627a011504e14268a62091450210eda7c07fabe6963e"},
|
||||
{file = "pydantic-1.10.11.tar.gz", hash = "sha256:f66d479cf7eb331372c470614be6511eae96f1f120344c25f3f9bb59fb1b5528"},
|
||||
{file = "pydantic-1.10.12-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a1fcb59f2f355ec350073af41d927bf83a63b50e640f4dbaa01053a28b7a7718"},
|
||||
{file = "pydantic-1.10.12-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b7ccf02d7eb340b216ec33e53a3a629856afe1c6e0ef91d84a4e6f2fb2ca70fe"},
|
||||
{file = "pydantic-1.10.12-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8fb2aa3ab3728d950bcc885a2e9eff6c8fc40bc0b7bb434e555c215491bcf48b"},
|
||||
{file = "pydantic-1.10.12-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:771735dc43cf8383959dc9b90aa281f0b6092321ca98677c5fb6125a6f56d58d"},
|
||||
{file = "pydantic-1.10.12-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ca48477862372ac3770969b9d75f1bf66131d386dba79506c46d75e6b48c1e09"},
|
||||
{file = "pydantic-1.10.12-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a5e7add47a5b5a40c49b3036d464e3c7802f8ae0d1e66035ea16aa5b7a3923ed"},
|
||||
{file = "pydantic-1.10.12-cp310-cp310-win_amd64.whl", hash = "sha256:e4129b528c6baa99a429f97ce733fff478ec955513630e61b49804b6cf9b224a"},
|
||||
{file = "pydantic-1.10.12-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b0d191db0f92dfcb1dec210ca244fdae5cbe918c6050b342d619c09d31eea0cc"},
|
||||
{file = "pydantic-1.10.12-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:795e34e6cc065f8f498c89b894a3c6da294a936ee71e644e4bd44de048af1405"},
|
||||
{file = "pydantic-1.10.12-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:69328e15cfda2c392da4e713443c7dbffa1505bc9d566e71e55abe14c97ddc62"},
|
||||
{file = "pydantic-1.10.12-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2031de0967c279df0d8a1c72b4ffc411ecd06bac607a212892757db7462fc494"},
|
||||
{file = "pydantic-1.10.12-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:ba5b2e6fe6ca2b7e013398bc7d7b170e21cce322d266ffcd57cca313e54fb246"},
|
||||
{file = "pydantic-1.10.12-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:2a7bac939fa326db1ab741c9d7f44c565a1d1e80908b3797f7f81a4f86bc8d33"},
|
||||
{file = "pydantic-1.10.12-cp311-cp311-win_amd64.whl", hash = "sha256:87afda5539d5140cb8ba9e8b8c8865cb5b1463924d38490d73d3ccfd80896b3f"},
|
||||
{file = "pydantic-1.10.12-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:549a8e3d81df0a85226963611950b12d2d334f214436a19537b2efed61b7639a"},
|
||||
{file = "pydantic-1.10.12-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:598da88dfa127b666852bef6d0d796573a8cf5009ffd62104094a4fe39599565"},
|
||||
{file = "pydantic-1.10.12-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba5c4a8552bff16c61882db58544116d021d0b31ee7c66958d14cf386a5b5350"},
|
||||
{file = "pydantic-1.10.12-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c79e6a11a07da7374f46970410b41d5e266f7f38f6a17a9c4823db80dadf4303"},
|
||||
{file = "pydantic-1.10.12-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ab26038b8375581dc832a63c948f261ae0aa21f1d34c1293469f135fa92972a5"},
|
||||
{file = "pydantic-1.10.12-cp37-cp37m-win_amd64.whl", hash = "sha256:e0a16d274b588767602b7646fa05af2782576a6cf1022f4ba74cbb4db66f6ca8"},
|
||||
{file = "pydantic-1.10.12-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6a9dfa722316f4acf4460afdf5d41d5246a80e249c7ff475c43a3a1e9d75cf62"},
|
||||
{file = "pydantic-1.10.12-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a73f489aebd0c2121ed974054cb2759af8a9f747de120acd2c3394cf84176ccb"},
|
||||
{file = "pydantic-1.10.12-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b30bcb8cbfccfcf02acb8f1a261143fab622831d9c0989707e0e659f77a18e0"},
|
||||
{file = "pydantic-1.10.12-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2fcfb5296d7877af406ba1547dfde9943b1256d8928732267e2653c26938cd9c"},
|
||||
{file = "pydantic-1.10.12-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:2f9a6fab5f82ada41d56b0602606a5506aab165ca54e52bc4545028382ef1c5d"},
|
||||
{file = "pydantic-1.10.12-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:dea7adcc33d5d105896401a1f37d56b47d443a2b2605ff8a969a0ed5543f7e33"},
|
||||
{file = "pydantic-1.10.12-cp38-cp38-win_amd64.whl", hash = "sha256:1eb2085c13bce1612da8537b2d90f549c8cbb05c67e8f22854e201bde5d98a47"},
|
||||
{file = "pydantic-1.10.12-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ef6c96b2baa2100ec91a4b428f80d8f28a3c9e53568219b6c298c1125572ebc6"},
|
||||
{file = "pydantic-1.10.12-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6c076be61cd0177a8433c0adcb03475baf4ee91edf5a4e550161ad57fc90f523"},
|
||||
{file = "pydantic-1.10.12-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d5a58feb9a39f481eda4d5ca220aa8b9d4f21a41274760b9bc66bfd72595b86"},
|
||||
{file = "pydantic-1.10.12-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5f805d2d5d0a41633651a73fa4ecdd0b3d7a49de4ec3fadf062fe16501ddbf1"},
|
||||
{file = "pydantic-1.10.12-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:1289c180abd4bd4555bb927c42ee42abc3aee02b0fb2d1223fb7c6e5bef87dbe"},
|
||||
{file = "pydantic-1.10.12-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5d1197e462e0364906cbc19681605cb7c036f2475c899b6f296104ad42b9f5fb"},
|
||||
{file = "pydantic-1.10.12-cp39-cp39-win_amd64.whl", hash = "sha256:fdbdd1d630195689f325c9ef1a12900524dceb503b00a987663ff4f58669b93d"},
|
||||
{file = "pydantic-1.10.12-py3-none-any.whl", hash = "sha256:b749a43aa51e32839c9d71dc67eb1e4221bb04af1033a32e3923d46f9effa942"},
|
||||
{file = "pydantic-1.10.12.tar.gz", hash = "sha256:0fe8a415cea8f340e7a9af9c54fc71a649b43e8ca3cc732986116b3cb135d303"},
|
||||
]
|
||||
|
||||
[package.dependencies]
|
||||
@@ -1571,7 +1552,6 @@ email = ["email-validator (>=1.0.3)"]
|
||||
name = "pymongo"
|
||||
version = "4.4.1"
|
||||
description = "Python driver for MongoDB <http://www.mongodb.org>"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.7"
|
||||
files = [
|
||||
@@ -1662,11 +1642,34 @@ ocsp = ["certifi", "pyopenssl (>=17.2.0)", "requests (<3.0.0)", "service-identit
|
||||
snappy = ["python-snappy"]
|
||||
zstd = ["zstandard"]
|
||||
|
||||
[[package]]
|
||||
name = "pytest"
|
||||
version = "6.2.5"
|
||||
description = "pytest: simple powerful testing with Python"
|
||||
optional = false
|
||||
python-versions = ">=3.6"
|
||||
files = [
|
||||
{file = "pytest-6.2.5-py3-none-any.whl", hash = "sha256:7310f8d27bc79ced999e760ca304d69f6ba6c6649c0b60fb0e04a4a77cacc134"},
|
||||
{file = "pytest-6.2.5.tar.gz", hash = "sha256:131b36680866a76e6781d13f101efb86cf674ebb9762eb70d3082b6f29889e89"},
|
||||
]
|
||||
|
||||
[package.dependencies]
|
||||
atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""}
|
||||
attrs = ">=19.2.0"
|
||||
colorama = {version = "*", markers = "sys_platform == \"win32\""}
|
||||
iniconfig = "*"
|
||||
packaging = "*"
|
||||
pluggy = ">=0.12,<2.0"
|
||||
py = ">=1.8.2"
|
||||
toml = "*"
|
||||
|
||||
[package.extras]
|
||||
testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"]
|
||||
|
||||
[[package]]
|
||||
name = "python-dateutil"
|
||||
version = "2.8.2"
|
||||
description = "Extensions to the standard Python datetime module"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7"
|
||||
files = [
|
||||
@@ -1681,7 +1684,6 @@ six = ">=1.5"
|
||||
name = "python-dotenv"
|
||||
version = "1.0.0"
|
||||
description = "Read key-value pairs from a .env file and set them as environment variables"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.8"
|
||||
files = [
|
||||
@@ -1696,7 +1698,6 @@ cli = ["click (>=5.0)"]
|
||||
name = "python-jose"
|
||||
version = "3.3.0"
|
||||
description = "JOSE implementation in Python"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = "*"
|
||||
files = [
|
||||
@@ -1718,7 +1719,6 @@ pycryptodome = ["pyasn1", "pycryptodome (>=3.3.1,<4.0.0)"]
|
||||
name = "python-multipart"
|
||||
version = "0.0.6"
|
||||
description = "A streaming multipart parser for Python"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.7"
|
||||
files = [
|
||||
@@ -1733,7 +1733,6 @@ dev = ["atomicwrites (==1.2.1)", "attrs (==19.2.0)", "coverage (==6.5.0)", "hatc
|
||||
name = "pytz"
|
||||
version = "2023.3"
|
||||
description = "World timezone definitions, modern and historical"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = "*"
|
||||
files = [
|
||||
@@ -1745,7 +1744,6 @@ files = [
|
||||
name = "pywin32"
|
||||
version = "306"
|
||||
description = "Python for Window Extensions"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = "*"
|
||||
files = [
|
||||
@@ -1769,7 +1767,6 @@ files = [
|
||||
name = "pywry"
|
||||
version = "0.5.13"
|
||||
description = ""
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.8"
|
||||
files = [
|
||||
@@ -1796,14 +1793,13 @@ dev = ["auditwheel", "wheel"]
|
||||
|
||||
[[package]]
|
||||
name = "referencing"
|
||||
version = "0.30.0"
|
||||
version = "0.30.2"
|
||||
description = "JSON Referencing + Python"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.8"
|
||||
files = [
|
||||
{file = "referencing-0.30.0-py3-none-any.whl", hash = "sha256:c257b08a399b6c2f5a3510a50d28ab5dbc7bbde049bcaf954d43c446f83ab548"},
|
||||
{file = "referencing-0.30.0.tar.gz", hash = "sha256:47237742e990457f7512c7d27486394a9aadaf876cbfaa4be65b27b4f4d47c6b"},
|
||||
{file = "referencing-0.30.2-py3-none-any.whl", hash = "sha256:449b6669b6121a9e96a7f9e410b245d471e8d48964c67113ce9afe50c8dd7bdf"},
|
||||
{file = "referencing-0.30.2.tar.gz", hash = "sha256:794ad8003c65938edcdbc027f1933215e0d0ccc0291e3ce20a4d87432b59efc0"},
|
||||
]
|
||||
|
||||
[package.dependencies]
|
||||
@@ -1814,7 +1810,6 @@ rpds-py = ">=0.7.0"
|
||||
name = "reportlab"
|
||||
version = "4.0.4"
|
||||
description = "The Reportlab Toolkit"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.7,<4"
|
||||
files = [
|
||||
@@ -1834,7 +1829,6 @@ renderpm = ["rl-renderPM (>=4.0.3,<4.1)"]
|
||||
name = "requests"
|
||||
version = "2.31.0"
|
||||
description = "Python HTTP for Humans."
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.7"
|
||||
files = [
|
||||
@@ -1856,7 +1850,6 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"]
|
||||
name = "rpds-py"
|
||||
version = "0.9.2"
|
||||
description = "Python bindings to Rust's persistent data structures (rpds)"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.8"
|
||||
files = [
|
||||
@@ -1963,7 +1956,6 @@ files = [
|
||||
name = "rsa"
|
||||
version = "4.9"
|
||||
description = "Pure-Python RSA implementation"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.6,<4"
|
||||
files = [
|
||||
@@ -1978,7 +1970,6 @@ pyasn1 = ">=0.1.3"
|
||||
name = "scipy"
|
||||
version = "1.10.1"
|
||||
description = "Fundamental algorithms for scientific computing in Python"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = "<3.12,>=3.8"
|
||||
files = [
|
||||
@@ -2017,7 +2008,6 @@ test = ["asv", "gmpy2", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeo
|
||||
name = "setproctitle"
|
||||
version = "1.3.2"
|
||||
description = "A Python module to customize the process title"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.7"
|
||||
files = [
|
||||
@@ -2102,7 +2092,6 @@ test = ["pytest"]
|
||||
name = "six"
|
||||
version = "1.16.0"
|
||||
description = "Python 2 and 3 compatibility utilities"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*"
|
||||
files = [
|
||||
@@ -2114,7 +2103,6 @@ files = [
|
||||
name = "sniffio"
|
||||
version = "1.3.0"
|
||||
description = "Sniff out which async library your code is running under"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.7"
|
||||
files = [
|
||||
@@ -2126,7 +2114,6 @@ files = [
|
||||
name = "starlette"
|
||||
version = "0.27.0"
|
||||
description = "The little ASGI library that shines."
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.7"
|
||||
files = [
|
||||
@@ -2145,7 +2132,6 @@ full = ["httpx (>=0.22.0)", "itsdangerous", "jinja2", "python-multipart", "pyyam
|
||||
name = "statsmodels"
|
||||
version = "0.14.0"
|
||||
description = "Statistical computations and models for Python"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.8"
|
||||
files = [
|
||||
@@ -2191,7 +2177,6 @@ docs = ["ipykernel", "jupyter-client", "matplotlib", "nbconvert", "nbformat", "n
|
||||
name = "svglib"
|
||||
version = "1.5.1"
|
||||
description = "A pure-Python library for reading and converting SVG"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.7"
|
||||
files = [
|
||||
@@ -2208,7 +2193,6 @@ tinycss2 = ">=0.6.0"
|
||||
name = "tenacity"
|
||||
version = "8.2.2"
|
||||
description = "Retry code until it succeeds"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.6"
|
||||
files = [
|
||||
@@ -2223,7 +2207,6 @@ doc = ["reno", "sphinx", "tornado (>=4.5)"]
|
||||
name = "tinycss2"
|
||||
version = "1.2.1"
|
||||
description = "A tiny CSS parser"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.7"
|
||||
files = [
|
||||
@@ -2238,11 +2221,21 @@ webencodings = ">=0.4"
|
||||
doc = ["sphinx", "sphinx_rtd_theme"]
|
||||
test = ["flake8", "isort", "pytest"]
|
||||
|
||||
[[package]]
|
||||
name = "toml"
|
||||
version = "0.10.2"
|
||||
description = "Python Library for Tom's Obvious, Minimal Language"
|
||||
optional = false
|
||||
python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*"
|
||||
files = [
|
||||
{file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"},
|
||||
{file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"},
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "traitlets"
|
||||
version = "5.9.0"
|
||||
description = "Traitlets Python configuration system"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.7"
|
||||
files = [
|
||||
@@ -2258,7 +2251,6 @@ test = ["argcomplete (>=2.0)", "pre-commit", "pytest", "pytest-mock"]
|
||||
name = "typing-extensions"
|
||||
version = "4.7.1"
|
||||
description = "Backported and Experimental Type Hints for Python 3.7+"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.7"
|
||||
files = [
|
||||
@@ -2270,7 +2262,6 @@ files = [
|
||||
name = "tzdata"
|
||||
version = "2023.3"
|
||||
description = "Provider of IANA time zone data"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=2"
|
||||
files = [
|
||||
@@ -2282,7 +2273,6 @@ files = [
|
||||
name = "urllib3"
|
||||
version = "1.26.16"
|
||||
description = "HTTP library with thread-safe connection pooling, file post, and more."
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*"
|
||||
files = [
|
||||
@@ -2299,7 +2289,6 @@ socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"]
|
||||
name = "uuid7"
|
||||
version = "0.1.0"
|
||||
description = "UUID version 7, generating time-sorted UUIDs with 200ns time resolution and 48 bits of randomness"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.7"
|
||||
files = [
|
||||
@@ -2311,7 +2300,6 @@ files = [
|
||||
name = "uvicorn"
|
||||
version = "0.20.0"
|
||||
description = "The lightning-fast ASGI server."
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.7"
|
||||
files = [
|
||||
@@ -2330,7 +2318,6 @@ standard = ["colorama (>=0.4)", "httptools (>=0.5.0)", "python-dotenv (>=0.13)",
|
||||
name = "webencodings"
|
||||
version = "0.5.1"
|
||||
description = "Character encoding aliases for legacy web content"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = "*"
|
||||
files = [
|
||||
@@ -2342,7 +2329,6 @@ files = [
|
||||
name = "websockets"
|
||||
version = "10.4"
|
||||
description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.7"
|
||||
files = [
|
||||
@@ -2421,7 +2407,6 @@ files = [
|
||||
name = "yarl"
|
||||
version = "1.9.2"
|
||||
description = "Yet another URL library"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.7"
|
||||
files = [
|
||||
@@ -2509,7 +2494,6 @@ multidict = ">=4.0"
|
||||
name = "zipp"
|
||||
version = "3.16.2"
|
||||
description = "Backport of pathlib-compatible object wrapper for zip files"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.8"
|
||||
files = [
|
||||
@@ -2524,4 +2508,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p
|
||||
[metadata]
|
||||
lock-version = "2.0"
|
||||
python-versions = ">=3.8,<3.12"
|
||||
content-hash = "2fcad28b96b1bff28287f2db683226b75e7d347c570fd56a3b2f193bbb7b0dab"
|
||||
content-hash = "bde8c6323f63b941db0d777b634bf835aad0c8c016a23b132b3dfd4b492d3a3f"
|
||||
|
||||
12
openbb_sdk/providers/cboe/README.md
vendored
Normal file
12
openbb_sdk/providers/cboe/README.md
vendored
Normal file
@@ -0,0 +1,12 @@
|
||||
# OpenBB CBOE Provider
|
||||
|
||||
This extension integrates the CBOE (Chicago Board Options Exchange) data provider
|
||||
into the OpenBB SDK.
|
||||
|
||||
## Installation
|
||||
|
||||
To install the extension, run the following command in this folder:
|
||||
|
||||
```bash
|
||||
pip install .
|
||||
```
|
||||
20
openbb_sdk/providers/cboe/openbb_cboe/__init__.py
Normal file
20
openbb_sdk/providers/cboe/openbb_cboe/__init__.py
Normal file
@@ -0,0 +1,20 @@
|
||||
"""cboe provider module."""
|
||||
from openbb_provider.abstract.provider import Provider
|
||||
|
||||
from openbb_cboe.models.options_chains import CboeOptionsChainsFetcher
|
||||
from openbb_cboe.models.stock_eod import CboeStockEODFetcher
|
||||
from openbb_cboe.models.stock_info import CboeStockInfoFetcher
|
||||
from openbb_cboe.models.stock_search import CboeStockSearchFetcher
|
||||
|
||||
cboe_provider = Provider(
|
||||
name="cboe",
|
||||
website="https://www.cboe.com/",
|
||||
description="""Provider for CBOE.""",
|
||||
required_credentials=None,
|
||||
fetcher_dict={
|
||||
"StockSearch": CboeStockSearchFetcher,
|
||||
"OptionsChains": CboeOptionsChainsFetcher,
|
||||
"StockEOD": CboeStockEODFetcher,
|
||||
"StockInfo": CboeStockInfoFetcher,
|
||||
},
|
||||
)
|
||||
119
openbb_sdk/providers/cboe/openbb_cboe/models/options_chains.py
Normal file
119
openbb_sdk/providers/cboe/openbb_cboe/models/options_chains.py
Normal file
@@ -0,0 +1,119 @@
|
||||
"""CBOE Options Chains fetcher."""
|
||||
|
||||
# IMPORT STANDARD
|
||||
from datetime import datetime
|
||||
from typing import Any, Dict, List, Optional
|
||||
|
||||
from openbb_provider.abstract.fetcher import Fetcher
|
||||
from openbb_provider.models.options_chains import (
|
||||
OptionsChainsData,
|
||||
OptionsChainsQueryParams,
|
||||
)
|
||||
from pydantic import Field, validator
|
||||
|
||||
from openbb_cboe.utils.helpers import get_chains
|
||||
|
||||
|
||||
class CboeOptionsChainsQueryParams(OptionsChainsQueryParams):
|
||||
"""CBOE Options Chains query.
|
||||
|
||||
Source: https://www.cboe.com/
|
||||
"""
|
||||
|
||||
|
||||
class CboeOptionsChainsData(OptionsChainsData):
|
||||
"""CBOE Options Chains Data."""
|
||||
|
||||
contractSymbol: str = Field(
|
||||
description="The contract symbol for the option.",
|
||||
)
|
||||
dte: int = Field(
|
||||
description="The days to expiration for the option.",
|
||||
)
|
||||
bidSize: int = Field(
|
||||
description="The bid size for the option.",
|
||||
)
|
||||
askSize: int = Field(
|
||||
description="The ask size for the option.",
|
||||
)
|
||||
impliedVolatility: float = Field(
|
||||
description="The implied volatility of the option.",
|
||||
)
|
||||
delta: float = Field(
|
||||
description="The delta of the option.",
|
||||
)
|
||||
gamma: float = Field(
|
||||
description="The gamma of the option.",
|
||||
)
|
||||
theta: float = Field(
|
||||
description="The theta of the option.",
|
||||
)
|
||||
rho: float = Field(
|
||||
description="The rho of the option.",
|
||||
)
|
||||
vega: float = Field(
|
||||
description="The vega of the option.",
|
||||
)
|
||||
theoretical: float = Field(
|
||||
description="The theoretical value of the option.",
|
||||
)
|
||||
open: float = Field(
|
||||
description="The opening price of the option.",
|
||||
)
|
||||
high: float = Field(
|
||||
description="The high price of the option.",
|
||||
)
|
||||
low: float = Field(
|
||||
description="The low price of the option.",
|
||||
)
|
||||
lastTradePrice: float = Field(
|
||||
description="The last trade price of the option.",
|
||||
)
|
||||
tick: str = Field(
|
||||
description="Whether the last tick was up or down in price.",
|
||||
)
|
||||
previousClose: float = Field(
|
||||
description="The previous closing price of the option.",
|
||||
)
|
||||
change: float = Field(
|
||||
description="The change in price of the option.",
|
||||
)
|
||||
changePercent: float = Field(
|
||||
description="The change, in percent, of the option.",
|
||||
)
|
||||
lastTradeTimestamp: datetime = Field(
|
||||
description="The last trade timestamp of the option.",
|
||||
)
|
||||
|
||||
@validator("expiration", pre=True, check_fields=False)
|
||||
def date_validate(cls, v): # pylint: disable=E0213
|
||||
return datetime.strptime(v, "%Y-%m-%d")
|
||||
|
||||
|
||||
class CboeOptionsChainsFetcher(
|
||||
Fetcher[
|
||||
CboeOptionsChainsQueryParams,
|
||||
CboeOptionsChainsData,
|
||||
]
|
||||
):
|
||||
@staticmethod
|
||||
def transform_query(params: Dict[str, Any]) -> CboeOptionsChainsQueryParams:
|
||||
return CboeOptionsChainsQueryParams(**params)
|
||||
|
||||
@staticmethod
|
||||
def extract_data(
|
||||
query: CboeOptionsChainsQueryParams,
|
||||
credentials: Optional[Dict[str, str]],
|
||||
**kwargs: Any,
|
||||
) -> List[CboeOptionsChainsData]:
|
||||
data = get_chains(query.symbol).to_dict("records")
|
||||
|
||||
data_ = {}
|
||||
data_.update({"results": data})
|
||||
return [CboeOptionsChainsData.parse_obj(d) for d in data_.get("results", [])]
|
||||
|
||||
@staticmethod
|
||||
def transform_data(
|
||||
data: List[CboeOptionsChainsData],
|
||||
) -> List[CboeOptionsChainsData]:
|
||||
return data
|
||||
60
openbb_sdk/providers/cboe/openbb_cboe/models/stock_eod.py
Normal file
60
openbb_sdk/providers/cboe/openbb_cboe/models/stock_eod.py
Normal file
@@ -0,0 +1,60 @@
|
||||
"""CBOE Stock EOD fetcher."""
|
||||
|
||||
# IMPORT STANDARD
|
||||
from datetime import datetime, timedelta
|
||||
from typing import Any, Dict, List, Optional
|
||||
|
||||
from openbb_provider.abstract.fetcher import Fetcher
|
||||
from openbb_provider.models.stock_eod import StockEODData, StockEODQueryParams
|
||||
from pydantic import validator
|
||||
|
||||
from openbb_cboe.utils.helpers import get_eod_prices
|
||||
|
||||
|
||||
class CboeStockEODQueryParams(StockEODQueryParams):
|
||||
"""CBOE Stock end of day query.
|
||||
|
||||
Source: https://www.cboe.com/
|
||||
"""
|
||||
|
||||
|
||||
class CboeStockEODData(StockEODData):
|
||||
"""CBOE stocks end of day Data."""
|
||||
|
||||
@validator("date", pre=True, check_fields=False)
|
||||
def date_validate(cls, v): # pylint: disable=E0213
|
||||
return datetime.strptime(v, "%Y-%m-%d")
|
||||
|
||||
|
||||
class CboeStockEODFetcher(
|
||||
Fetcher[
|
||||
CboeStockEODQueryParams,
|
||||
CboeStockEODData,
|
||||
]
|
||||
):
|
||||
@staticmethod
|
||||
def transform_query(params: Dict[str, Any]) -> CboeStockEODQueryParams:
|
||||
now = datetime.now()
|
||||
transformed_params = params
|
||||
if params.get("start_date") is None:
|
||||
transformed_params["start_date"] = now - timedelta(days=50000)
|
||||
if params.get("end_date") is None:
|
||||
transformed_params["end_date"] = now
|
||||
return CboeStockEODQueryParams(**transformed_params)
|
||||
|
||||
@staticmethod
|
||||
def extract_data(
|
||||
query: CboeStockEODQueryParams,
|
||||
credentials: Optional[Dict[str, str]],
|
||||
**kwargs: Any,
|
||||
) -> List[CboeStockEODData]:
|
||||
data = get_eod_prices(query.symbol, query.start_date, query.end_date).to_dict(
|
||||
"records"
|
||||
)
|
||||
data_ = {}
|
||||
data_.update({"results": data})
|
||||
return [CboeStockEODData.parse_obj(d) for d in data_.get("results", [])]
|
||||
|
||||
@staticmethod
|
||||
def transform_data(data: List[CboeStockEODData]) -> List[CboeStockEODData]:
|
||||
return data
|
||||
101
openbb_sdk/providers/cboe/openbb_cboe/models/stock_info.py
Normal file
101
openbb_sdk/providers/cboe/openbb_cboe/models/stock_info.py
Normal file
@@ -0,0 +1,101 @@
|
||||
"""CBOE Stock Info fetcher."""
|
||||
|
||||
# IMPORT STANDARD
|
||||
from datetime import datetime
|
||||
from typing import Any, Dict, List, Optional
|
||||
|
||||
from openbb_provider.abstract.fetcher import Fetcher
|
||||
from openbb_provider.models.stock_info import StockInfoData, StockInfoQueryParams
|
||||
from pydantic import Field, validator
|
||||
|
||||
from openbb_cboe.utils.helpers import get_info
|
||||
|
||||
|
||||
class CboeStockInfoQueryParams(StockInfoQueryParams):
|
||||
"""CBOE Company Search query.
|
||||
|
||||
Source: https://www.cboe.com/
|
||||
"""
|
||||
|
||||
|
||||
class CboeStockInfoData(StockInfoData):
|
||||
"""CBOE Company Search Data."""
|
||||
|
||||
type: Optional[str] = Field(description="The type of asset.")
|
||||
tick: Optional[str] = Field(
|
||||
description="Whether the last sale was an up or down tick."
|
||||
)
|
||||
bid: Optional[float] = Field(description="The current bid price.")
|
||||
bid_size: Optional[float] = Field(description="The bid lot size.")
|
||||
ask: Optional[float] = Field(description="The current ask price.")
|
||||
ask_size: Optional[float] = Field(description="The ask lot size.")
|
||||
volume: Optional[float] = Field(
|
||||
description="The stock volume for the current trading day."
|
||||
)
|
||||
iv_thirty: Optional[float] = Field(
|
||||
description="The 30-day implied volatility of the stock."
|
||||
)
|
||||
iv_thirty_change: Optional[float] = Field(
|
||||
description="The change in 30-day implied volatility of the stock."
|
||||
)
|
||||
last_trade_timestamp: Optional[datetime] = Field(
|
||||
description="The last trade timestamp for the stock."
|
||||
)
|
||||
iv_thirty_one_year_high: Optional[float] = Field(
|
||||
description="The 1-year high of implied volatility."
|
||||
)
|
||||
hv_thirty_one_year_high: Optional[float] = Field(
|
||||
description="The 1-year high of realized volatility."
|
||||
)
|
||||
iv_thirty_one_year_low: Optional[float] = Field(
|
||||
description="The 1-year low of implied volatility."
|
||||
)
|
||||
hv_thirty_one_year_low: Optional[float] = Field(
|
||||
description="The 1-year low of realized volatility."
|
||||
)
|
||||
iv_sixty_one_year_high: Optional[float] = Field(
|
||||
description="The 60-day high of implied volatility."
|
||||
)
|
||||
hv_sixty_one_year_high: Optional[float] = Field(
|
||||
description="The 60-day high of realized volatility."
|
||||
)
|
||||
iv_sixty_one_year_low: Optional[float] = Field(
|
||||
description="The 60-day low of implied volatility."
|
||||
)
|
||||
hv_sixty_one_year_low: Optional[float] = Field(
|
||||
description="The 60-day low of realized volatility."
|
||||
)
|
||||
iv_ninety_one_year_high: Optional[float] = Field(
|
||||
description="The 90-day high of implied volatility."
|
||||
)
|
||||
hv_ninety_one_year_high: Optional[float] = Field(
|
||||
description="The 90-day high of realized volatility."
|
||||
)
|
||||
|
||||
@validator("symbol", pre=True, check_fields=False)
|
||||
def name_validate(cls, v): # pylint: disable=E0213
|
||||
return v.upper()
|
||||
|
||||
|
||||
class CboeStockInfoFetcher(
|
||||
Fetcher[
|
||||
CboeStockInfoQueryParams,
|
||||
CboeStockInfoData,
|
||||
]
|
||||
):
|
||||
@staticmethod
|
||||
def transform_query(params: Dict[str, Any]) -> CboeStockInfoQueryParams:
|
||||
return CboeStockInfoQueryParams(**params)
|
||||
|
||||
@staticmethod
|
||||
def extract_data(
|
||||
query: CboeStockInfoQueryParams,
|
||||
credentials: Optional[Dict[str, str]],
|
||||
**kwargs: Any,
|
||||
) -> List[CboeStockInfoData]:
|
||||
data = get_info(query.symbol).to_dict()
|
||||
return CboeStockInfoData.parse_obj(data)
|
||||
|
||||
@staticmethod
|
||||
def transform_data(data: List[CboeStockInfoData]) -> List[CboeStockInfoData]:
|
||||
return data
|
||||
68
openbb_sdk/providers/cboe/openbb_cboe/models/stock_search.py
Normal file
68
openbb_sdk/providers/cboe/openbb_cboe/models/stock_search.py
Normal file
@@ -0,0 +1,68 @@
|
||||
"""CBOE Company Search fetcher."""
|
||||
|
||||
# IMPORT STANDARD
|
||||
from typing import Any, Dict, List, Optional
|
||||
|
||||
from openbb_provider.abstract.fetcher import Fetcher
|
||||
from openbb_provider.models.stock_search import (
|
||||
StockSearchData,
|
||||
StockSearchQueryParams,
|
||||
)
|
||||
from pydantic import Field, validator
|
||||
|
||||
from openbb_cboe.utils.helpers import stock_search
|
||||
|
||||
|
||||
class CboeStockSearchQueryParams(StockSearchQueryParams):
|
||||
"""CBOE Company Search query.
|
||||
|
||||
Source: https://www.cboe.com/
|
||||
"""
|
||||
|
||||
|
||||
class CboeStockSearchData(StockSearchData):
|
||||
"""CBOE Company Search Data."""
|
||||
|
||||
class Config:
|
||||
fields = {
|
||||
"name": "Company Name",
|
||||
"symbol": "Symbol",
|
||||
}
|
||||
|
||||
dpmName: Optional[str] = Field(
|
||||
description="The name of the primary market maker.",
|
||||
alias="DPM Name",
|
||||
)
|
||||
postStation: Optional[str] = Field(
|
||||
description="The post and station location on the CBOE trading floor.",
|
||||
alias="Post/Station",
|
||||
)
|
||||
|
||||
@validator("symbol", pre=True, check_fields=False)
|
||||
def name_validate(cls, v): # pylint: disable=E0213
|
||||
return v.upper()
|
||||
|
||||
|
||||
class CboeStockSearchFetcher(
|
||||
Fetcher[
|
||||
CboeStockSearchQueryParams,
|
||||
CboeStockSearchData,
|
||||
]
|
||||
):
|
||||
@staticmethod
|
||||
def transform_query(params: Dict[str, Any]) -> CboeStockSearchQueryParams:
|
||||
return CboeStockSearchQueryParams(**params)
|
||||
|
||||
@staticmethod
|
||||
def extract_data(
|
||||
query: CboeStockSearchQueryParams,
|
||||
credentials: Optional[Dict[str, str]],
|
||||
**kwargs: Any,
|
||||
) -> List[CboeStockSearchData]:
|
||||
data = stock_search(query.query, ticker=query.ticker)
|
||||
|
||||
return [CboeStockSearchData.parse_obj(d) for d in data.get("results", [])]
|
||||
|
||||
@staticmethod
|
||||
def transform_data(data: List[CboeStockSearchData]) -> List[CboeStockSearchData]:
|
||||
return data
|
||||
1
openbb_sdk/providers/cboe/openbb_cboe/utils/cboe_companies.json
vendored
Normal file
1
openbb_sdk/providers/cboe/openbb_cboe/utils/cboe_companies.json
vendored
Normal file
File diff suppressed because one or more lines are too long
702
openbb_sdk/providers/cboe/openbb_cboe/utils/helpers.py
Normal file
702
openbb_sdk/providers/cboe/openbb_cboe/utils/helpers.py
Normal file
@@ -0,0 +1,702 @@
|
||||
"""CBOE Helpers Module"""
|
||||
|
||||
import os
|
||||
from datetime import date, datetime, timedelta
|
||||
from pathlib import Path
|
||||
from typing import Optional, Tuple
|
||||
|
||||
import numpy as np
|
||||
import pandas as pd
|
||||
import requests
|
||||
from requests import HTTPError
|
||||
|
||||
TICKER_EXCEPTIONS = ["NDX", "RUT"]
|
||||
|
||||
|
||||
def get_user_agent() -> str:
|
||||
"""Get a not very random user agent."""
|
||||
user_agent_strings = [
|
||||
"Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.10; rv:86.1) Gecko/20100101 Firefox/86.1",
|
||||
"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:86.1) Gecko/20100101 Firefox/86.1",
|
||||
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:82.1) Gecko/20100101 Firefox/82.1",
|
||||
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:86.0) Gecko/20100101 Firefox/86.0",
|
||||
"Mozilla/5.0 (Windows NT 10.0; WOW64; rv:86.0) Gecko/20100101 Firefox/86.0",
|
||||
"Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.10; rv:83.0) Gecko/20100101 Firefox/83.0",
|
||||
"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:84.0) Gecko/20100101 Firefox/84.0",
|
||||
]
|
||||
|
||||
return np.random.choice(user_agent_strings) # nosec
|
||||
|
||||
|
||||
def request(
|
||||
url: str, method: str = "GET", timeout: int = 10, **kwargs
|
||||
) -> requests.Response:
|
||||
"""Abstract helper to make requests from a url with potential headers and params.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
url : str
|
||||
Url to make the request to
|
||||
method : str, optional
|
||||
HTTP method to use. Can be "GET" or "POST", by default "GET"
|
||||
|
||||
Returns
|
||||
-------
|
||||
requests.Response
|
||||
Request response object
|
||||
|
||||
Raises
|
||||
------
|
||||
ValueError
|
||||
If invalid method is passed
|
||||
"""
|
||||
|
||||
# If there are headers, check if there is a user agent, if not add one.
|
||||
# Some requests seem to work only with a specific user agent, so we want to be able to override it.
|
||||
headers = kwargs.pop("headers", {})
|
||||
|
||||
if "User-Agent" not in headers:
|
||||
headers["User-Agent"] = get_user_agent()
|
||||
if method.upper() == "GET":
|
||||
return requests.get(
|
||||
url,
|
||||
headers=headers,
|
||||
timeout=timeout,
|
||||
**kwargs,
|
||||
)
|
||||
if method.upper() == "POST":
|
||||
return requests.post(
|
||||
url,
|
||||
headers=headers,
|
||||
timeout=timeout,
|
||||
**kwargs,
|
||||
)
|
||||
raise ValueError("Method must be GET or POST")
|
||||
|
||||
|
||||
def camel_to_snake(str):
|
||||
"""Convert camelCase to snake_case."""
|
||||
return "".join(["_" + i.lower() if i.isupper() else i for i in str]).lstrip("_")
|
||||
|
||||
|
||||
def get_cboe_directory() -> pd.DataFrame:
|
||||
"""Gets the US Listings Directory for the CBOE.
|
||||
|
||||
Returns
|
||||
-------
|
||||
pd.DataFrame: CBOE_DIRECTORY
|
||||
DataFrame of the CBOE listings directory
|
||||
"""
|
||||
try:
|
||||
CBOE_DIRECTORY: pd.DataFrame = pd.read_csv(
|
||||
"https://www.cboe.com/us/options/symboldir/equity_index_options/?download=csv"
|
||||
)
|
||||
CBOE_DIRECTORY = CBOE_DIRECTORY.rename(
|
||||
columns={
|
||||
" Stock Symbol": "Symbol",
|
||||
" DPM Name": "DPM Name",
|
||||
" Post/Station": "Post/Station",
|
||||
}
|
||||
).set_index("Symbol")
|
||||
return CBOE_DIRECTORY
|
||||
except HTTPError:
|
||||
return pd.DataFrame()
|
||||
|
||||
|
||||
def get_cboe_index_directory() -> pd.DataFrame:
|
||||
"""Gets the US Listings Directory for the CBOE
|
||||
|
||||
Returns
|
||||
-------
|
||||
pd.DataFrame: CBOE_INDEXES
|
||||
"""
|
||||
try:
|
||||
r = request(
|
||||
"https://cdn.cboe.com/api/global/us_indices/definitions/all_indices.json"
|
||||
)
|
||||
|
||||
if r.status_code != 200:
|
||||
raise HTTPError
|
||||
|
||||
CBOE_INDEXES = pd.DataFrame(r.json())
|
||||
|
||||
CBOE_INDEXES = CBOE_INDEXES.rename(
|
||||
columns={
|
||||
"calc_end_time": "Close Time",
|
||||
"calc_start_time": "Open Time",
|
||||
"currency": "Currency",
|
||||
"description": "Description",
|
||||
"display": "Display",
|
||||
"featured": "Featured",
|
||||
"featured_order": "Featured Order",
|
||||
"index_symbol": "Ticker",
|
||||
"mkt_data_delay": "Data Delay",
|
||||
"name": "Name",
|
||||
"tick_days": "Tick Days",
|
||||
"tick_frequency": "Frequency",
|
||||
"tick_period": "Period",
|
||||
"time_zone": "Time Zone",
|
||||
},
|
||||
)
|
||||
|
||||
indices_order: list[str] = [
|
||||
"Ticker",
|
||||
"Name",
|
||||
"Description",
|
||||
"Currency",
|
||||
"Tick Days",
|
||||
"Frequency",
|
||||
"Period",
|
||||
"Time Zone",
|
||||
]
|
||||
|
||||
CBOE_INDEXES = pd.DataFrame(CBOE_INDEXES, columns=indices_order).set_index(
|
||||
"Ticker"
|
||||
)
|
||||
|
||||
return CBOE_INDEXES
|
||||
|
||||
except HTTPError:
|
||||
return pd.DataFrame()
|
||||
|
||||
|
||||
INDEXES = get_cboe_index_directory().index.tolist()
|
||||
SYMBOLS = pd.DataFrame()
|
||||
try:
|
||||
SYMBOLS = get_cboe_directory()
|
||||
except SYMBOLS.empty:
|
||||
current_dir = os.path.dirname(os.path.realpath(__file__))
|
||||
file = "cboe_companies.json"
|
||||
SYMBOLS = pd.read_json(Path(current_dir, file))
|
||||
|
||||
|
||||
def stock_search(query: str, ticker: bool = False) -> dict:
|
||||
"""Search the CBOE company directory by name or ticker.
|
||||
Parameters
|
||||
-----------
|
||||
query: str
|
||||
The search query
|
||||
ticker: bool
|
||||
Whether to search by ticker. Default is False.
|
||||
|
||||
Returns
|
||||
-------
|
||||
dict
|
||||
Dictionary of the results.
|
||||
"""
|
||||
data = {}
|
||||
symbols = SYMBOLS.copy() if not SYMBOLS.empty else get_cboe_directory()
|
||||
symbols = symbols.reset_index()
|
||||
target = "Company Name" if not ticker else "Symbol"
|
||||
idx = symbols[target].str.contains(query, case=False)
|
||||
result = symbols[idx].to_dict("records")
|
||||
if len(result) > 0:
|
||||
data.update({"results": result})
|
||||
return data
|
||||
print(f"No results found for: {query}. Try another search query.")
|
||||
return pd.DataFrame()
|
||||
|
||||
|
||||
def get_ticker_info(symbol: str) -> Tuple[pd.DataFrame, list[str]]:
|
||||
"""Gets basic info for the symbol and expiration dates
|
||||
|
||||
Parameters
|
||||
----------
|
||||
symbol: str
|
||||
The ticker to lookup
|
||||
|
||||
Returns
|
||||
-------
|
||||
Tuple: [pd.DataFrame, pd.Series]
|
||||
ticker_details
|
||||
ticker_expirations
|
||||
"""
|
||||
|
||||
stock = "stock"
|
||||
index = "index"
|
||||
symbol = symbol.upper()
|
||||
new_ticker: str = ""
|
||||
ticker_details = pd.DataFrame()
|
||||
ticker_expirations: list = []
|
||||
try:
|
||||
if symbol in TICKER_EXCEPTIONS:
|
||||
new_ticker = "^" + symbol
|
||||
else:
|
||||
if symbol not in INDEXES:
|
||||
new_ticker = symbol
|
||||
|
||||
elif symbol in INDEXES:
|
||||
new_ticker = "^" + symbol
|
||||
|
||||
# Gets the data to return, and if none returns empty Tuple #
|
||||
|
||||
symbol_info_url = (
|
||||
"https://www.cboe.com/education/tools/trade-optimizer/symbol-info/?symbol="
|
||||
f"{new_ticker}"
|
||||
)
|
||||
|
||||
symbol_info = request(symbol_info_url)
|
||||
symbol_info_json = pd.Series(symbol_info.json())
|
||||
|
||||
if symbol_info_json.success is False:
|
||||
ticker_details = pd.DataFrame()
|
||||
ticker_expirations = []
|
||||
print("No data found for the symbol: " f"{symbol}" "")
|
||||
else:
|
||||
symbol_details = pd.Series(symbol_info_json["details"])
|
||||
symbol_details = pd.DataFrame(symbol_details).transpose()
|
||||
symbol_details = symbol_details.reset_index()
|
||||
ticker_expirations = symbol_info_json["expirations"]
|
||||
|
||||
# Cleans columns depending on if the security type is a stock or an index
|
||||
|
||||
type_ = symbol_details.security_type
|
||||
|
||||
if stock[0] in type_[0]:
|
||||
stock_details = symbol_details
|
||||
ticker_details = pd.DataFrame(stock_details).rename(
|
||||
columns={
|
||||
"current_price": "price",
|
||||
"bid_size": "bidSize",
|
||||
"ask_size": "askSize",
|
||||
"iv30": "ivThirty",
|
||||
"prev_day_close": "previousClose",
|
||||
"price_change": "change",
|
||||
"price_change_percent": "changePercent",
|
||||
"iv30_change": "ivThirtyChange",
|
||||
"iv30_percent_change": "ivThirtyChangePercent",
|
||||
"last_trade_time": "lastTradeTimestamp",
|
||||
"exchange_id": "exchangeID",
|
||||
"tick": "tick",
|
||||
"security_type": "type",
|
||||
}
|
||||
)
|
||||
details_columns = [
|
||||
"symbol",
|
||||
"type",
|
||||
"tick",
|
||||
"bid",
|
||||
"bidSize",
|
||||
"askSize",
|
||||
"ask",
|
||||
"price",
|
||||
"open",
|
||||
"high",
|
||||
"low",
|
||||
"close",
|
||||
"volume",
|
||||
"previousClose",
|
||||
"change",
|
||||
"changePercent",
|
||||
"ivThirty",
|
||||
"ivThirtyChange",
|
||||
"ivThirtyChangePercent",
|
||||
"lastTradeTimestamp",
|
||||
]
|
||||
ticker_details = (
|
||||
pd.DataFrame(ticker_details, columns=details_columns)
|
||||
.set_index(keys="symbol")
|
||||
.dropna(axis=1)
|
||||
.transpose()
|
||||
)
|
||||
|
||||
if index[0] in type_[0]:
|
||||
index_details = symbol_details
|
||||
ticker_details = pd.DataFrame(index_details).rename(
|
||||
columns={
|
||||
"symbol": "symbol",
|
||||
"security_type": "type",
|
||||
"current_price": "price",
|
||||
"price_change": "change",
|
||||
"price_change_percent": "changePercent",
|
||||
"prev_day_close": "previousClose",
|
||||
"iv30": "ivThirty",
|
||||
"iv30_change": "ivThirtyChange",
|
||||
"iv30_change_percent": "ivThirtyChangePercent",
|
||||
"last_trade_time": "lastTradeTimestamp",
|
||||
}
|
||||
)
|
||||
|
||||
index_columns = [
|
||||
"symbol",
|
||||
"type",
|
||||
"tick",
|
||||
"price",
|
||||
"open",
|
||||
"high",
|
||||
"low",
|
||||
"close",
|
||||
"previousClose",
|
||||
"change",
|
||||
"changePercent",
|
||||
"ivThirty",
|
||||
"ivThirtyChange",
|
||||
"ivThirtyChangePercent",
|
||||
"lastTradeTimestamp",
|
||||
]
|
||||
|
||||
ticker_details = (
|
||||
pd.DataFrame(ticker_details, columns=index_columns)
|
||||
.set_index(keys="symbol")
|
||||
.dropna(axis=1)
|
||||
.transpose()
|
||||
).rename(columns={f"{new_ticker}": f"{symbol}"})
|
||||
|
||||
except HTTPError:
|
||||
print("There was an error with the request'\n")
|
||||
ticker_details = pd.DataFrame()
|
||||
ticker_expirations = list()
|
||||
return ticker_details, ticker_expirations
|
||||
|
||||
return ticker_details, ticker_expirations
|
||||
|
||||
|
||||
def get_ticker_iv(symbol: str) -> pd.DataFrame:
|
||||
"""Gets annualized high/low historical and implied volatility over 30/60/90 day windows.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
symbol: str
|
||||
The loaded ticker
|
||||
|
||||
Returns
|
||||
-------
|
||||
pd.DataFrame: ticker_iv
|
||||
"""
|
||||
|
||||
# Checks ticker to determine if ticker is an index or an exception that requires modifying the request's URLs
|
||||
|
||||
try:
|
||||
if symbol in TICKER_EXCEPTIONS:
|
||||
quotes_iv_url = (
|
||||
"https://cdn.cboe.com/api/global/delayed_quotes/historical_data/_"
|
||||
f"{symbol}"
|
||||
".json"
|
||||
)
|
||||
else:
|
||||
if symbol not in INDEXES:
|
||||
quotes_iv_url = (
|
||||
"https://cdn.cboe.com/api/global/delayed_quotes/historical_data/"
|
||||
f"{symbol}"
|
||||
".json"
|
||||
)
|
||||
|
||||
elif symbol in INDEXES:
|
||||
quotes_iv_url = (
|
||||
"https://cdn.cboe.com/api/global/delayed_quotes/historical_data/_"
|
||||
f"{symbol}"
|
||||
".json"
|
||||
)
|
||||
h_iv = request(quotes_iv_url)
|
||||
|
||||
if h_iv.status_code != 200:
|
||||
print("No data found for the symbol: " f"{symbol}" "")
|
||||
return pd.DataFrame()
|
||||
|
||||
data = h_iv.json()
|
||||
h_data = pd.DataFrame(data)[2:-1]["data"].rename(f"{symbol}")
|
||||
h_data.rename(
|
||||
{
|
||||
"hv30_annual_high": "hvThirtyOneYearHigh",
|
||||
"hv30_annual_low": "hvThirtyOneYearLow",
|
||||
"hv60_annual_high": "hvSixtyOneYearHigh",
|
||||
"hv60_annual_low": "hvSixtyOneYearLow",
|
||||
"hv90_annual_high": "hvNinetyOneYearHigh",
|
||||
"hv90_annual_low": "hvNinetyOneYearLow",
|
||||
"iv30_annual_high": "ivThirtyOneYearHigh",
|
||||
"iv30_annual_low": "ivThirtyOneYearLow",
|
||||
"iv60_annual_high": "ivSixtyOneYearHigh",
|
||||
"iv60_annual_low": "ivSixtyOneYearLow",
|
||||
"iv90_annual_high": "ivNinetyOneYearHigh",
|
||||
"iv90_annual_low": "ivNinetyOneYearLow",
|
||||
},
|
||||
inplace=True,
|
||||
)
|
||||
|
||||
iv_order = [
|
||||
"ivThirtyOneYearHigh",
|
||||
"hvThirtyOneYearHigh",
|
||||
"ivThirtyOneYearLow",
|
||||
"hvThirtyOneYearLow",
|
||||
"ivSixtyOneYearHigh",
|
||||
"hvSixtyOneYearHigh",
|
||||
"ivSixtyOneYearLow",
|
||||
"hvSixtyOneYearLow",
|
||||
"ivNinetyOneYearHigh",
|
||||
"hvNinetyOneYearHigh",
|
||||
"ivNinetyOneYearLow",
|
||||
"hvNinetyOneYearLow",
|
||||
]
|
||||
|
||||
ticker_iv = pd.DataFrame(h_data).transpose()
|
||||
except HTTPError:
|
||||
print("There was an error with the request'\n")
|
||||
|
||||
return pd.DataFrame(ticker_iv, columns=iv_order).transpose()
|
||||
|
||||
|
||||
def get_chains(symbol: str) -> pd.DataFrame:
|
||||
"""Gets the complete options chains for a ticker.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
symbol: str
|
||||
The ticker get options data for
|
||||
|
||||
Returns
|
||||
-------
|
||||
pd.DataFrame
|
||||
DataFrame with all active options contracts for the underlying symbol.
|
||||
"""
|
||||
|
||||
# Checks ticker to determine if ticker is an index or an exception that requires modifying the request's URLs.
|
||||
symbol = symbol.upper()
|
||||
try:
|
||||
if symbol in TICKER_EXCEPTIONS:
|
||||
quotes_url = (
|
||||
"https://cdn.cboe.com/api/global/delayed_quotes/options/_"
|
||||
f"{symbol}"
|
||||
".json"
|
||||
)
|
||||
else:
|
||||
if symbol not in INDEXES:
|
||||
quotes_url = (
|
||||
"https://cdn.cboe.com/api/global/delayed_quotes/options/"
|
||||
f"{symbol}"
|
||||
".json"
|
||||
)
|
||||
if symbol in INDEXES:
|
||||
quotes_url = (
|
||||
"https://cdn.cboe.com/api/global/delayed_quotes/options/_"
|
||||
f"{symbol}"
|
||||
".json"
|
||||
)
|
||||
|
||||
r = request(quotes_url)
|
||||
if r.status_code != 200:
|
||||
print("No data found for the symbol: " f"{symbol}" "")
|
||||
return pd.DataFrame()
|
||||
|
||||
r_json = r.json()
|
||||
data = pd.DataFrame(r_json["data"])
|
||||
options = pd.Series(data.options, index=data.index)
|
||||
options_columns = list(options[0])
|
||||
options_data = list(options[:])
|
||||
options_df = pd.DataFrame(options_data, columns=options_columns)
|
||||
|
||||
options_df = options_df.rename(
|
||||
columns={
|
||||
"option": "contractSymbol",
|
||||
"bid_size": "bidSize",
|
||||
"ask_size": "askSize",
|
||||
"iv": "impliedVolatility",
|
||||
"open_interest": "openInterest",
|
||||
"theo": "theoretical",
|
||||
"last_trade_price": "lastTradePrice",
|
||||
"last_trade_time": "lastTradeTimestamp",
|
||||
"percent_change": "changePercent",
|
||||
"prev_day_close": "previousClose",
|
||||
}
|
||||
)
|
||||
|
||||
# Parses the option symbols into columns for expiration, strike, and optionType
|
||||
|
||||
option_df_index = options_df["contractSymbol"].str.extractall(
|
||||
r"^(?P<Ticker>\D*)(?P<expiration>\d*)(?P<optionType>\D*)(?P<strike>\d*)"
|
||||
)
|
||||
option_df_index = option_df_index.reset_index().drop(
|
||||
columns=["match", "level_0"]
|
||||
)
|
||||
option_df_index.optionType = option_df_index.optionType.str.replace(
|
||||
"C", "call"
|
||||
).str.replace("P", "put")
|
||||
option_df_index.strike = [ele.lstrip("0") for ele in option_df_index.strike]
|
||||
option_df_index.strike = pd.Series(option_df_index.strike).astype(float)
|
||||
option_df_index.strike = option_df_index.strike * (1 / 1000)
|
||||
option_df_index.strike = option_df_index.strike.to_list()
|
||||
option_df_index.expiration = [
|
||||
ele.lstrip("1") for ele in option_df_index.expiration
|
||||
]
|
||||
option_df_index.expiration = pd.DatetimeIndex(
|
||||
option_df_index.expiration, yearfirst=True
|
||||
).astype(str)
|
||||
option_df_index = option_df_index.drop(columns=["Ticker"])
|
||||
|
||||
# Joins the parsed symbol into the dataframe.
|
||||
|
||||
quotes = option_df_index.join(options_df)
|
||||
|
||||
now = datetime.now()
|
||||
temp = pd.DatetimeIndex(quotes.expiration)
|
||||
temp_ = (temp - now).days + 1
|
||||
quotes["dte"] = temp_
|
||||
|
||||
quotes["lastTradeTimestamp"] = pd.to_datetime(quotes["lastTradeTimestamp"])
|
||||
quotes = quotes.set_index(
|
||||
keys=["expiration", "strike", "optionType"]
|
||||
).sort_index()
|
||||
quotes["openInterest"] = quotes["openInterest"].astype("int64")
|
||||
quotes["volume"] = quotes["volume"].astype("int64")
|
||||
quotes["bidSize"] = quotes["bidSize"].astype("int64")
|
||||
quotes["askSize"] = quotes["askSize"].astype("int64")
|
||||
quotes["previousClose"] = round(quotes["previousClose"], 2)
|
||||
quotes["changePercent"] = round(quotes["changePercent"], 2)
|
||||
|
||||
except HTTPError:
|
||||
print("There was an error with the request'\n")
|
||||
return pd.DataFrame()
|
||||
|
||||
return quotes.reset_index()
|
||||
|
||||
|
||||
def __generate_historical_prices_url(
|
||||
symbol, data_type: Optional[str] = "historical"
|
||||
) -> str:
|
||||
"""Generates the final URL for historical prices data."""
|
||||
|
||||
url: str = ""
|
||||
|
||||
if data_type not in ["historical", "intraday"]:
|
||||
print(
|
||||
"Invalid data_type. Must be either 'historical' or 'intraday'. Defaulting to 'historical'."
|
||||
)
|
||||
data_type = "historical"
|
||||
|
||||
if symbol in TICKER_EXCEPTIONS:
|
||||
url = (
|
||||
f"https://cdn.cboe.com/api/global/delayed_quotes/charts/{data_type}/_"
|
||||
f"{symbol}"
|
||||
".json"
|
||||
)
|
||||
else:
|
||||
if symbol not in INDEXES:
|
||||
url = (
|
||||
f"https://cdn.cboe.com/api/global/delayed_quotes/charts/{data_type}/"
|
||||
f"{symbol}"
|
||||
".json"
|
||||
)
|
||||
|
||||
elif symbol in INDEXES:
|
||||
url = (
|
||||
f"https://cdn.cboe.com/api/global/delayed_quotes/charts/{data_type}/_"
|
||||
f"{symbol}"
|
||||
".json"
|
||||
)
|
||||
return url
|
||||
|
||||
|
||||
def get_eod_prices(
|
||||
symbol: str,
|
||||
start_date: Optional[date] = None,
|
||||
end_date: Optional[date] = None,
|
||||
) -> pd.DataFrame:
|
||||
"""Gets EOD data from CBOE.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
symbol: str
|
||||
The symbol of the company.
|
||||
start_date: Optional[date]
|
||||
The start date. [YYYY-MM-DD]
|
||||
end_date: Optional[date]
|
||||
The end date. [YYYY-MM-DD]
|
||||
|
||||
Returns
|
||||
-------
|
||||
pd.DataFrame
|
||||
DataFrame of daily EOD OHLC+V prices.
|
||||
"""
|
||||
|
||||
symbol = symbol.upper()
|
||||
if symbol == ("NDX", "^NDX"):
|
||||
print("NDX time series data is not currently supported by the CBOE provider.")
|
||||
return pd.DataFrame()
|
||||
if "^" in symbol:
|
||||
symbol = symbol.replace("^", "")
|
||||
now = datetime.now()
|
||||
start_date = start_date if start_date else now - timedelta(days=50000)
|
||||
end_date = end_date if end_date else now
|
||||
if symbol not in SYMBOLS.index:
|
||||
print("The symbol, " f"{symbol}" ", was not found in the CBOE directory.")
|
||||
return pd.DataFrame()
|
||||
|
||||
url = __generate_historical_prices_url(symbol)
|
||||
r = request(url)
|
||||
|
||||
if r.status_code != 200:
|
||||
print(f"Error: {r.status_code}")
|
||||
return pd.DataFrame()
|
||||
|
||||
data = (
|
||||
pd.DataFrame(r.json()["data"])[
|
||||
["date", "open", "high", "low", "close", "volume"]
|
||||
]
|
||||
).set_index("date")
|
||||
|
||||
# Fill in missing data from current or most recent trading session.
|
||||
|
||||
today = pd.to_datetime(datetime.now().date())
|
||||
if today.weekday() > 4:
|
||||
day_minus = today.weekday() - 4
|
||||
today = pd.to_datetime(today - timedelta(days=day_minus))
|
||||
if today != data.index[-1]:
|
||||
_today, _ = get_ticker_info(symbol)
|
||||
today_df = pd.DataFrame()
|
||||
today_df["open"] = round(_today.loc["open"].astype(float), 2)
|
||||
today_df["high"] = round(_today.loc["high"].astype(float), 2)
|
||||
today_df["low"] = round(_today.loc["low"].astype(float), 2)
|
||||
today_df["close"] = round(_today.loc["close"].astype(float), 2)
|
||||
if symbol not in INDEXES and symbol not in TICKER_EXCEPTIONS:
|
||||
data = data[data["volume"] > 0]
|
||||
today_df["volume"] = _today.loc["volume"]
|
||||
today_df["date"] = today
|
||||
today_df = today_df.reset_index(drop=True).set_index("date")
|
||||
|
||||
data = pd.concat([data, today_df], axis=0)
|
||||
|
||||
# If ticker is an index there is no volume data and the types must be set.
|
||||
|
||||
if symbol in INDEXES or symbol in TICKER_EXCEPTIONS:
|
||||
data = data[["open", "high", "low", "close", "volume"]]
|
||||
data["open"] = round(data.open.astype(float), 2)
|
||||
data["high"] = round(data.high.astype(float), 2)
|
||||
data["low"] = round(data.low.astype(float), 2)
|
||||
data["close"] = round(data.close.astype(float), 2)
|
||||
data["volume"] = 0
|
||||
|
||||
data.index = pd.to_datetime(data.index, format="%Y-%m-%d")
|
||||
data = data[data["open"] > 0]
|
||||
|
||||
data = data[
|
||||
(data.index >= pd.to_datetime(start_date, format="%Y-%m-%d"))
|
||||
& (data.index <= pd.to_datetime(end_date, format="%Y-%m-%d"))
|
||||
]
|
||||
data.index = data.index.strftime("%Y-%m-%d")
|
||||
return data.reset_index()
|
||||
|
||||
|
||||
def get_info(symbol: str) -> pd.DataFrame:
|
||||
"""Gets information and current statistics for a ticker.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
symbol: str
|
||||
The symbol of the company.
|
||||
|
||||
Returns
|
||||
-------
|
||||
pd.DataFrame
|
||||
Pandas DataFrame with results.
|
||||
"""
|
||||
|
||||
symbol = symbol.upper()
|
||||
info = pd.DataFrame()
|
||||
|
||||
_info = get_ticker_info(symbol)[0]
|
||||
_iv = get_ticker_iv(symbol)
|
||||
info = pd.concat([_info, _iv])
|
||||
info.index = [camel_to_snake(c) for c in info.index]
|
||||
info.loc["symbol", symbol] = symbol
|
||||
info.loc["name", symbol] = SYMBOLS[SYMBOLS.index == symbol]["Company Name"][0]
|
||||
|
||||
return info[symbol]
|
||||
245
openbb_sdk/providers/cboe/poetry.lock
generated
vendored
Normal file
245
openbb_sdk/providers/cboe/poetry.lock
generated
vendored
Normal file
@@ -0,0 +1,245 @@
|
||||
# This file is automatically @generated by Poetry 1.5.1 and should not be changed by hand.
|
||||
|
||||
[[package]]
|
||||
name = "certifi"
|
||||
version = "2023.5.7"
|
||||
description = "Python package for providing Mozilla's CA Bundle."
|
||||
optional = false
|
||||
python-versions = ">=3.6"
|
||||
files = [
|
||||
{file = "certifi-2023.5.7-py3-none-any.whl", hash = "sha256:c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716"},
|
||||
{file = "certifi-2023.5.7.tar.gz", hash = "sha256:0f0d56dc5a6ad56fd4ba36484d6cc34451e1c6548c61daad8c320169f91eddc7"},
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "charset-normalizer"
|
||||
version = "3.2.0"
|
||||
description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet."
|
||||
optional = false
|
||||
python-versions = ">=3.7.0"
|
||||
files = [
|
||||
{file = "charset-normalizer-3.2.0.tar.gz", hash = "sha256:3bb3d25a8e6c0aedd251753a79ae98a093c7e7b471faa3aa9a93a81431987ace"},
|
||||
{file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b87549028f680ca955556e3bd57013ab47474c3124dc069faa0b6545b6c9710"},
|
||||
{file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7c70087bfee18a42b4040bb9ec1ca15a08242cf5867c58726530bdf3945672ed"},
|
||||
{file = "charset_normalizer-3.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a103b3a7069b62f5d4890ae1b8f0597618f628b286b03d4bc9195230b154bfa9"},
|
||||
{file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94aea8eff76ee6d1cdacb07dd2123a68283cb5569e0250feab1240058f53b623"},
|
||||
{file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:db901e2ac34c931d73054d9797383d0f8009991e723dab15109740a63e7f902a"},
|
||||
{file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b0dac0ff919ba34d4df1b6131f59ce95b08b9065233446be7e459f95554c0dc8"},
|
||||
{file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:193cbc708ea3aca45e7221ae58f0fd63f933753a9bfb498a3b474878f12caaad"},
|
||||
{file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09393e1b2a9461950b1c9a45d5fd251dc7c6f228acab64da1c9c0165d9c7765c"},
|
||||
{file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:baacc6aee0b2ef6f3d308e197b5d7a81c0e70b06beae1f1fcacffdbd124fe0e3"},
|
||||
{file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:bf420121d4c8dce6b889f0e8e4ec0ca34b7f40186203f06a946fa0276ba54029"},
|
||||
{file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:c04a46716adde8d927adb9457bbe39cf473e1e2c2f5d0a16ceb837e5d841ad4f"},
|
||||
{file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:aaf63899c94de41fe3cf934601b0f7ccb6b428c6e4eeb80da72c58eab077b19a"},
|
||||
{file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d62e51710986674142526ab9f78663ca2b0726066ae26b78b22e0f5e571238dd"},
|
||||
{file = "charset_normalizer-3.2.0-cp310-cp310-win32.whl", hash = "sha256:04e57ab9fbf9607b77f7d057974694b4f6b142da9ed4a199859d9d4d5c63fe96"},
|
||||
{file = "charset_normalizer-3.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:48021783bdf96e3d6de03a6e39a1171ed5bd7e8bb93fc84cc649d11490f87cea"},
|
||||
{file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4957669ef390f0e6719db3613ab3a7631e68424604a7b448f079bee145da6e09"},
|
||||
{file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:46fb8c61d794b78ec7134a715a3e564aafc8f6b5e338417cb19fe9f57a5a9bf2"},
|
||||
{file = "charset_normalizer-3.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f779d3ad205f108d14e99bb3859aa7dd8e9c68874617c72354d7ecaec2a054ac"},
|
||||
{file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f25c229a6ba38a35ae6e25ca1264621cc25d4d38dca2942a7fce0b67a4efe918"},
|
||||
{file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2efb1bd13885392adfda4614c33d3b68dee4921fd0ac1d3988f8cbb7d589e72a"},
|
||||
{file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f30b48dd7fa1474554b0b0f3fdfdd4c13b5c737a3c6284d3cdc424ec0ffff3a"},
|
||||
{file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:246de67b99b6851627d945db38147d1b209a899311b1305dd84916f2b88526c6"},
|
||||
{file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bd9b3b31adcb054116447ea22caa61a285d92e94d710aa5ec97992ff5eb7cf3"},
|
||||
{file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8c2f5e83493748286002f9369f3e6607c565a6a90425a3a1fef5ae32a36d749d"},
|
||||
{file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:3170c9399da12c9dc66366e9d14da8bf7147e1e9d9ea566067bbce7bb74bd9c2"},
|
||||
{file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7a4826ad2bd6b07ca615c74ab91f32f6c96d08f6fcc3902ceeedaec8cdc3bcd6"},
|
||||
{file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:3b1613dd5aee995ec6d4c69f00378bbd07614702a315a2cf6c1d21461fe17c23"},
|
||||
{file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9e608aafdb55eb9f255034709e20d5a83b6d60c054df0802fa9c9883d0a937aa"},
|
||||
{file = "charset_normalizer-3.2.0-cp311-cp311-win32.whl", hash = "sha256:f2a1d0fd4242bd8643ce6f98927cf9c04540af6efa92323e9d3124f57727bfc1"},
|
||||
{file = "charset_normalizer-3.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:681eb3d7e02e3c3655d1b16059fbfb605ac464c834a0c629048a30fad2b27489"},
|
||||
{file = "charset_normalizer-3.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c57921cda3a80d0f2b8aec7e25c8aa14479ea92b5b51b6876d975d925a2ea346"},
|
||||
{file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41b25eaa7d15909cf3ac4c96088c1f266a9a93ec44f87f1d13d4a0e86c81b982"},
|
||||
{file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f058f6963fd82eb143c692cecdc89e075fa0828db2e5b291070485390b2f1c9c"},
|
||||
{file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7647ebdfb9682b7bb97e2a5e7cb6ae735b1c25008a70b906aecca294ee96cf4"},
|
||||
{file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eef9df1eefada2c09a5e7a40991b9fc6ac6ef20b1372abd48d2794a316dc0449"},
|
||||
{file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e03b8895a6990c9ab2cdcd0f2fe44088ca1c65ae592b8f795c3294af00a461c3"},
|
||||
{file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:ee4006268ed33370957f55bf2e6f4d263eaf4dc3cfc473d1d90baff6ed36ce4a"},
|
||||
{file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c4983bf937209c57240cff65906b18bb35e64ae872da6a0db937d7b4af845dd7"},
|
||||
{file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:3bb7fda7260735efe66d5107fb7e6af6a7c04c7fce9b2514e04b7a74b06bf5dd"},
|
||||
{file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:72814c01533f51d68702802d74f77ea026b5ec52793c791e2da806a3844a46c3"},
|
||||
{file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:70c610f6cbe4b9fce272c407dd9d07e33e6bf7b4aa1b7ffb6f6ded8e634e3592"},
|
||||
{file = "charset_normalizer-3.2.0-cp37-cp37m-win32.whl", hash = "sha256:a401b4598e5d3f4a9a811f3daf42ee2291790c7f9d74b18d75d6e21dda98a1a1"},
|
||||
{file = "charset_normalizer-3.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:c0b21078a4b56965e2b12f247467b234734491897e99c1d51cee628da9786959"},
|
||||
{file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:95eb302ff792e12aba9a8b8f8474ab229a83c103d74a750ec0bd1c1eea32e669"},
|
||||
{file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1a100c6d595a7f316f1b6f01d20815d916e75ff98c27a01ae817439ea7726329"},
|
||||
{file = "charset_normalizer-3.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6339d047dab2780cc6220f46306628e04d9750f02f983ddb37439ca47ced7149"},
|
||||
{file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4b749b9cc6ee664a3300bb3a273c1ca8068c46be705b6c31cf5d276f8628a94"},
|
||||
{file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a38856a971c602f98472050165cea2cdc97709240373041b69030be15047691f"},
|
||||
{file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f87f746ee241d30d6ed93969de31e5ffd09a2961a051e60ae6bddde9ec3583aa"},
|
||||
{file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89f1b185a01fe560bc8ae5f619e924407efca2191b56ce749ec84982fc59a32a"},
|
||||
{file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e1c8a2f4c69e08e89632defbfabec2feb8a8d99edc9f89ce33c4b9e36ab63037"},
|
||||
{file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2f4ac36d8e2b4cc1aa71df3dd84ff8efbe3bfb97ac41242fbcfc053c67434f46"},
|
||||
{file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a386ebe437176aab38c041de1260cd3ea459c6ce5263594399880bbc398225b2"},
|
||||
{file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:ccd16eb18a849fd8dcb23e23380e2f0a354e8daa0c984b8a732d9cfaba3a776d"},
|
||||
{file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:e6a5bf2cba5ae1bb80b154ed68a3cfa2fa00fde979a7f50d6598d3e17d9ac20c"},
|
||||
{file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:45de3f87179c1823e6d9e32156fb14c1927fcc9aba21433f088fdfb555b77c10"},
|
||||
{file = "charset_normalizer-3.2.0-cp38-cp38-win32.whl", hash = "sha256:1000fba1057b92a65daec275aec30586c3de2401ccdcd41f8a5c1e2c87078706"},
|
||||
{file = "charset_normalizer-3.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:8b2c760cfc7042b27ebdb4a43a4453bd829a5742503599144d54a032c5dc7e9e"},
|
||||
{file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:855eafa5d5a2034b4621c74925d89c5efef61418570e5ef9b37717d9c796419c"},
|
||||
{file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:203f0c8871d5a7987be20c72442488a0b8cfd0f43b7973771640fc593f56321f"},
|
||||
{file = "charset_normalizer-3.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e857a2232ba53ae940d3456f7533ce6ca98b81917d47adc3c7fd55dad8fab858"},
|
||||
{file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e86d77b090dbddbe78867a0275cb4df08ea195e660f1f7f13435a4649e954e5"},
|
||||
{file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4fb39a81950ec280984b3a44f5bd12819953dc5fa3a7e6fa7a80db5ee853952"},
|
||||
{file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2dee8e57f052ef5353cf608e0b4c871aee320dd1b87d351c28764fc0ca55f9f4"},
|
||||
{file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8700f06d0ce6f128de3ccdbc1acaea1ee264d2caa9ca05daaf492fde7c2a7200"},
|
||||
{file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1920d4ff15ce893210c1f0c0e9d19bfbecb7983c76b33f046c13a8ffbd570252"},
|
||||
{file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c1c76a1743432b4b60ab3358c937a3fe1341c828ae6194108a94c69028247f22"},
|
||||
{file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f7560358a6811e52e9c4d142d497f1a6e10103d3a6881f18d04dbce3729c0e2c"},
|
||||
{file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:c8063cf17b19661471ecbdb3df1c84f24ad2e389e326ccaf89e3fb2484d8dd7e"},
|
||||
{file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:cd6dbe0238f7743d0efe563ab46294f54f9bc8f4b9bcf57c3c666cc5bc9d1299"},
|
||||
{file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1249cbbf3d3b04902ff081ffbb33ce3377fa6e4c7356f759f3cd076cc138d020"},
|
||||
{file = "charset_normalizer-3.2.0-cp39-cp39-win32.whl", hash = "sha256:6c409c0deba34f147f77efaa67b8e4bb83d2f11c8806405f76397ae5b8c0d1c9"},
|
||||
{file = "charset_normalizer-3.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:7095f6fbfaa55defb6b733cfeb14efaae7a29f0b59d8cf213be4e7ca0b857b80"},
|
||||
{file = "charset_normalizer-3.2.0-py3-none-any.whl", hash = "sha256:8e098148dd37b4ce3baca71fb394c81dc5d9c7728c95df695d2dca218edf40e6"},
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "idna"
|
||||
version = "3.4"
|
||||
description = "Internationalized Domain Names in Applications (IDNA)"
|
||||
optional = false
|
||||
python-versions = ">=3.5"
|
||||
files = [
|
||||
{file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"},
|
||||
{file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"},
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "openbb-provider"
|
||||
version = "0.2.0"
|
||||
description = ""
|
||||
optional = false
|
||||
python-versions = "^3.8"
|
||||
files = []
|
||||
develop = false
|
||||
|
||||
[package.dependencies]
|
||||
pydantic = {version = "^1.10", extras = ["dotenv"]}
|
||||
requests = "^2.31.0"
|
||||
urllib3 = "<2.0.0"
|
||||
|
||||
[package.source]
|
||||
type = "directory"
|
||||
url = "../../sdk/provider"
|
||||
|
||||
[[package]]
|
||||
name = "pydantic"
|
||||
version = "1.10.11"
|
||||
description = "Data validation and settings management using python type hints"
|
||||
optional = false
|
||||
python-versions = ">=3.7"
|
||||
files = [
|
||||
{file = "pydantic-1.10.11-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ff44c5e89315b15ff1f7fdaf9853770b810936d6b01a7bcecaa227d2f8fe444f"},
|
||||
{file = "pydantic-1.10.11-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a6c098d4ab5e2d5b3984d3cb2527e2d6099d3de85630c8934efcfdc348a9760e"},
|
||||
{file = "pydantic-1.10.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:16928fdc9cb273c6af00d9d5045434c39afba5f42325fb990add2c241402d151"},
|
||||
{file = "pydantic-1.10.11-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0588788a9a85f3e5e9ebca14211a496409cb3deca5b6971ff37c556d581854e7"},
|
||||
{file = "pydantic-1.10.11-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e9baf78b31da2dc3d3f346ef18e58ec5f12f5aaa17ac517e2ffd026a92a87588"},
|
||||
{file = "pydantic-1.10.11-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:373c0840f5c2b5b1ccadd9286782852b901055998136287828731868027a724f"},
|
||||
{file = "pydantic-1.10.11-cp310-cp310-win_amd64.whl", hash = "sha256:c3339a46bbe6013ef7bdd2844679bfe500347ac5742cd4019a88312aa58a9847"},
|
||||
{file = "pydantic-1.10.11-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:08a6c32e1c3809fbc49debb96bf833164f3438b3696abf0fbeceb417d123e6eb"},
|
||||
{file = "pydantic-1.10.11-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a451ccab49971af043ec4e0d207cbc8cbe53dbf148ef9f19599024076fe9c25b"},
|
||||
{file = "pydantic-1.10.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5b02d24f7b2b365fed586ed73582c20f353a4c50e4be9ba2c57ab96f8091ddae"},
|
||||
{file = "pydantic-1.10.11-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3f34739a89260dfa420aa3cbd069fbcc794b25bbe5c0a214f8fb29e363484b66"},
|
||||
{file = "pydantic-1.10.11-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:e297897eb4bebde985f72a46a7552a7556a3dd11e7f76acda0c1093e3dbcf216"},
|
||||
{file = "pydantic-1.10.11-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d185819a7a059550ecb85d5134e7d40f2565f3dd94cfd870132c5f91a89cf58c"},
|
||||
{file = "pydantic-1.10.11-cp311-cp311-win_amd64.whl", hash = "sha256:4400015f15c9b464c9db2d5d951b6a780102cfa5870f2c036d37c23b56f7fc1b"},
|
||||
{file = "pydantic-1.10.11-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2417de68290434461a266271fc57274a138510dca19982336639484c73a07af6"},
|
||||
{file = "pydantic-1.10.11-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:331c031ba1554b974c98679bd0780d89670d6fd6f53f5d70b10bdc9addee1713"},
|
||||
{file = "pydantic-1.10.11-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8268a735a14c308923e8958363e3a3404f6834bb98c11f5ab43251a4e410170c"},
|
||||
{file = "pydantic-1.10.11-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:44e51ba599c3ef227e168424e220cd3e544288c57829520dc90ea9cb190c3248"},
|
||||
{file = "pydantic-1.10.11-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d7781f1d13b19700b7949c5a639c764a077cbbdd4322ed505b449d3ca8edcb36"},
|
||||
{file = "pydantic-1.10.11-cp37-cp37m-win_amd64.whl", hash = "sha256:7522a7666157aa22b812ce14c827574ddccc94f361237ca6ea8bb0d5c38f1629"},
|
||||
{file = "pydantic-1.10.11-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bc64eab9b19cd794a380179ac0e6752335e9555d214cfcb755820333c0784cb3"},
|
||||
{file = "pydantic-1.10.11-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8dc77064471780262b6a68fe67e013298d130414d5aaf9b562c33987dbd2cf4f"},
|
||||
{file = "pydantic-1.10.11-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe429898f2c9dd209bd0632a606bddc06f8bce081bbd03d1c775a45886e2c1cb"},
|
||||
{file = "pydantic-1.10.11-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:192c608ad002a748e4a0bed2ddbcd98f9b56df50a7c24d9a931a8c5dd053bd3d"},
|
||||
{file = "pydantic-1.10.11-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ef55392ec4bb5721f4ded1096241e4b7151ba6d50a50a80a2526c854f42e6a2f"},
|
||||
{file = "pydantic-1.10.11-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:41e0bb6efe86281623abbeeb0be64eab740c865388ee934cd3e6a358784aca6e"},
|
||||
{file = "pydantic-1.10.11-cp38-cp38-win_amd64.whl", hash = "sha256:265a60da42f9f27e0b1014eab8acd3e53bd0bad5c5b4884e98a55f8f596b2c19"},
|
||||
{file = "pydantic-1.10.11-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:469adf96c8e2c2bbfa655fc7735a2a82f4c543d9fee97bd113a7fb509bf5e622"},
|
||||
{file = "pydantic-1.10.11-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e6cbfbd010b14c8a905a7b10f9fe090068d1744d46f9e0c021db28daeb8b6de1"},
|
||||
{file = "pydantic-1.10.11-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:abade85268cc92dff86d6effcd917893130f0ff516f3d637f50dadc22ae93999"},
|
||||
{file = "pydantic-1.10.11-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e9738b0f2e6c70f44ee0de53f2089d6002b10c33264abee07bdb5c7f03038303"},
|
||||
{file = "pydantic-1.10.11-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:787cf23e5a0cde753f2eabac1b2e73ae3844eb873fd1f5bdbff3048d8dbb7604"},
|
||||
{file = "pydantic-1.10.11-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:174899023337b9fc685ac8adaa7b047050616136ccd30e9070627c1aaab53a13"},
|
||||
{file = "pydantic-1.10.11-cp39-cp39-win_amd64.whl", hash = "sha256:1954f8778489a04b245a1e7b8b22a9d3ea8ef49337285693cf6959e4b757535e"},
|
||||
{file = "pydantic-1.10.11-py3-none-any.whl", hash = "sha256:008c5e266c8aada206d0627a011504e14268a62091450210eda7c07fabe6963e"},
|
||||
{file = "pydantic-1.10.11.tar.gz", hash = "sha256:f66d479cf7eb331372c470614be6511eae96f1f120344c25f3f9bb59fb1b5528"},
|
||||
]
|
||||
|
||||
[package.dependencies]
|
||||
python-dotenv = {version = ">=0.10.4", optional = true, markers = "extra == \"dotenv\""}
|
||||
typing-extensions = ">=4.2.0"
|
||||
|
||||
[package.extras]
|
||||
dotenv = ["python-dotenv (>=0.10.4)"]
|
||||
email = ["email-validator (>=1.0.3)"]
|
||||
|
||||
[[package]]
|
||||
name = "python-dotenv"
|
||||
version = "1.0.0"
|
||||
description = "Read key-value pairs from a .env file and set them as environment variables"
|
||||
optional = false
|
||||
python-versions = ">=3.8"
|
||||
files = [
|
||||
{file = "python-dotenv-1.0.0.tar.gz", hash = "sha256:a8df96034aae6d2d50a4ebe8216326c61c3eb64836776504fcca410e5937a3ba"},
|
||||
{file = "python_dotenv-1.0.0-py3-none-any.whl", hash = "sha256:f5971a9226b701070a4bf2c38c89e5a3f0d64de8debda981d1db98583009122a"},
|
||||
]
|
||||
|
||||
[package.extras]
|
||||
cli = ["click (>=5.0)"]
|
||||
|
||||
[[package]]
|
||||
name = "requests"
|
||||
version = "2.31.0"
|
||||
description = "Python HTTP for Humans."
|
||||
optional = false
|
||||
python-versions = ">=3.7"
|
||||
files = [
|
||||
{file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"},
|
||||
{file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"},
|
||||
]
|
||||
|
||||
[package.dependencies]
|
||||
certifi = ">=2017.4.17"
|
||||
charset-normalizer = ">=2,<4"
|
||||
idna = ">=2.5,<4"
|
||||
urllib3 = ">=1.21.1,<3"
|
||||
|
||||
[package.extras]
|
||||
socks = ["PySocks (>=1.5.6,!=1.5.7)"]
|
||||
use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"]
|
||||
|
||||
[[package]]
|
||||
name = "typing-extensions"
|
||||
version = "4.7.1"
|
||||
description = "Backported and Experimental Type Hints for Python 3.7+"
|
||||
optional = false
|
||||
python-versions = ">=3.7"
|
||||
files = [
|
||||
{file = "typing_extensions-4.7.1-py3-none-any.whl", hash = "sha256:440d5dd3af93b060174bf433bccd69b0babc3b15b1a8dca43789fd7f61514b36"},
|
||||
{file = "typing_extensions-4.7.1.tar.gz", hash = "sha256:b75ddc264f0ba5615db7ba217daeb99701ad295353c45f9e95963337ceeeffb2"},
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "urllib3"
|
||||
version = "1.26.16"
|
||||
description = "HTTP library with thread-safe connection pooling, file post, and more."
|
||||
optional = false
|
||||
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*"
|
||||
files = [
|
||||
{file = "urllib3-1.26.16-py2.py3-none-any.whl", hash = "sha256:8d36afa7616d8ab714608411b4a3b13e58f463aee519024578e062e141dce20f"},
|
||||
{file = "urllib3-1.26.16.tar.gz", hash = "sha256:8f135f6502756bde6b2a9b28989df5fbe87c9970cecaa69041edcce7f0589b14"},
|
||||
]
|
||||
|
||||
[package.extras]
|
||||
brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"]
|
||||
secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"]
|
||||
socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"]
|
||||
|
||||
[metadata]
|
||||
lock-version = "2.0"
|
||||
python-versions = "^3.8"
|
||||
content-hash = "26269b8a989dcc6ac67961b7a43d485d231c8ac878265ac90f310ced959fc532"
|
||||
18
openbb_sdk/providers/cboe/pyproject.toml
vendored
Normal file
18
openbb_sdk/providers/cboe/pyproject.toml
vendored
Normal file
@@ -0,0 +1,18 @@
|
||||
[tool.poetry]
|
||||
name = "openbb-cboe"
|
||||
version = "0.1.1"
|
||||
description = ""
|
||||
authors = ["OpenBB Team <hello@openbb.co>"]
|
||||
readme = "README.md"
|
||||
packages = [{ include = "openbb_cboe" }]
|
||||
|
||||
[tool.poetry.dependencies]
|
||||
python = "^3.8"
|
||||
openbb-provider = { path = "../../sdk/provider" }
|
||||
|
||||
[build-system]
|
||||
requires = ["poetry-core"]
|
||||
build-backend = "poetry.core.masonry.api"
|
||||
|
||||
[tool.poetry.plugins."openbb_provider_extension"]
|
||||
cboe = "openbb_cboe:cboe_provider"
|
||||
0
openbb_sdk/providers/cboe/tests/.gitkeep
vendored
Normal file
0
openbb_sdk/providers/cboe/tests/.gitkeep
vendored
Normal file
11
openbb_sdk/providers/yfinance/README.md
vendored
Normal file
11
openbb_sdk/providers/yfinance/README.md
vendored
Normal file
@@ -0,0 +1,11 @@
|
||||
# OpenBB yfinance Provider
|
||||
|
||||
This extension integrates the yfinance (Yahoo! Finance) data provider into the OpenBB SDK.
|
||||
|
||||
## Installation
|
||||
|
||||
To install the extension, run the following command in this folder:
|
||||
|
||||
```bash
|
||||
pip install .
|
||||
```
|
||||
22
openbb_sdk/providers/yfinance/openbb_yfinance/__init__.py
Normal file
22
openbb_sdk/providers/yfinance/openbb_yfinance/__init__.py
Normal file
@@ -0,0 +1,22 @@
|
||||
"""yfinance (Yahoo!Finance) provider module."""
|
||||
from openbb_provider.abstract.provider import Provider
|
||||
|
||||
from openbb_yfinance.models.crypto_eod import YFinanceCryptoEODFetcher
|
||||
from openbb_yfinance.models.forex_eod import YFinanceForexEODFetcher
|
||||
from openbb_yfinance.models.major_indices_eod import YFinanceMajorIndicesEODFetcher
|
||||
from openbb_yfinance.models.stock_eod import YFinanceStockEODFetcher
|
||||
|
||||
yfinance_provider = Provider(
|
||||
name="yfinance",
|
||||
website="https://finance.yahoo.com/",
|
||||
description="""Yahoo! Finance is a web-based platform that offers financial news,
|
||||
data, and tools for investors and individuals interested in tracking and analyzing
|
||||
financial markets and assets.""",
|
||||
required_credentials=None,
|
||||
fetcher_dict={
|
||||
"CryptoEOD": YFinanceCryptoEODFetcher,
|
||||
"ForexEOD": YFinanceForexEODFetcher,
|
||||
"MajorIndicesEOD": YFinanceMajorIndicesEODFetcher,
|
||||
"StockEOD": YFinanceStockEODFetcher,
|
||||
},
|
||||
)
|
||||
@@ -0,0 +1,101 @@
|
||||
"""yfinance Crypto end of day fetcher."""
|
||||
|
||||
|
||||
from datetime import datetime, timedelta
|
||||
from typing import Any, Dict, List, Optional
|
||||
|
||||
from openbb_provider.abstract.fetcher import Fetcher
|
||||
from openbb_provider.models.crypto_eod import CryptoEODData, CryptoEODQueryParams
|
||||
from openbb_provider.utils.descriptions import QUERY_DESCRIPTIONS
|
||||
from pydantic import Field, validator
|
||||
from yfinance import Ticker
|
||||
|
||||
from openbb_yfinance.utils.types import INTERVALS, PERIODS
|
||||
|
||||
|
||||
class YFinanceCryptoEODQueryParams(CryptoEODQueryParams):
|
||||
"""YFinance Crypto end of day Query.
|
||||
|
||||
Source: https://finance.yahoo.com/crypto/
|
||||
"""
|
||||
|
||||
interval: Optional[INTERVALS] = Field(default="1d", description="Data granularity.")
|
||||
period: Optional[PERIODS] = Field(
|
||||
default=None, description=QUERY_DESCRIPTIONS.get("period", "")
|
||||
)
|
||||
|
||||
|
||||
class YFinanceCryptoEODData(CryptoEODData):
|
||||
"""YFinance Crypto end of day Data."""
|
||||
|
||||
class Config:
|
||||
fields = {
|
||||
"date": "Date",
|
||||
"open": "Open",
|
||||
"high": "High",
|
||||
"low": "Low",
|
||||
"close": "Close",
|
||||
"volume": "Volume",
|
||||
}
|
||||
|
||||
@validator("Date", pre=True, check_fields=False)
|
||||
def date_validate(cls, v): # pylint: disable=E0213
|
||||
return datetime.strptime(v, "%Y-%m-%dT%H:%M:%S")
|
||||
|
||||
|
||||
class YFinanceCryptoEODFetcher(
|
||||
Fetcher[
|
||||
YFinanceCryptoEODQueryParams,
|
||||
YFinanceCryptoEODData,
|
||||
]
|
||||
):
|
||||
@staticmethod
|
||||
def transform_query(params: Dict[str, Any]) -> YFinanceCryptoEODQueryParams:
|
||||
now = datetime.now().date()
|
||||
transformed_params = params
|
||||
if params.get("start_date") is None:
|
||||
transformed_params["start_date"] = now - timedelta(days=7)
|
||||
|
||||
if params.get("end_date") is None:
|
||||
transformed_params["end_date"] = now
|
||||
return YFinanceCryptoEODQueryParams(**params)
|
||||
|
||||
@staticmethod
|
||||
def extract_data(
|
||||
query: YFinanceCryptoEODQueryParams,
|
||||
credentials: Optional[Dict[str, str]],
|
||||
**kwargs: Any
|
||||
) -> List[YFinanceCryptoEODData]:
|
||||
now = datetime.now().date()
|
||||
query.start_date = query.start_date or (now - timedelta(days=8))
|
||||
query.end_date = query.end_date or (now - timedelta(days=1))
|
||||
|
||||
if query.period:
|
||||
data = Ticker(query.symbol).history(
|
||||
interval=query.interval,
|
||||
period=query.period,
|
||||
actions=False,
|
||||
raise_errors=True,
|
||||
)
|
||||
else:
|
||||
data = Ticker(query.symbol).history(
|
||||
interval=query.interval,
|
||||
start=query.start_date,
|
||||
end=query.end_date,
|
||||
actions=False,
|
||||
raise_errors=True,
|
||||
)
|
||||
|
||||
data = data.reset_index()
|
||||
data["Date"] = (
|
||||
data["Date"].dt.tz_localize(None).dt.strftime("%Y-%m-%dT%H:%M:%S")
|
||||
)
|
||||
data = data.to_dict("records")
|
||||
|
||||
return [YFinanceCryptoEODData(**d) for d in data]
|
||||
|
||||
@staticmethod
|
||||
def transform_data(
|
||||
data: List[YFinanceCryptoEODData],
|
||||
) -> List[YFinanceCryptoEODData]:
|
||||
return data
|
||||
@@ -0,0 +1,103 @@
|
||||
"""yfinance Forex end of day fetcher."""
|
||||
|
||||
|
||||
from datetime import datetime, timedelta
|
||||
from typing import Any, Dict, List, Optional
|
||||
|
||||
from openbb_provider.abstract.fetcher import Fetcher
|
||||
from openbb_provider.models.forex_eod import ForexEODData, ForexEODQueryParams
|
||||
from openbb_provider.utils.descriptions import QUERY_DESCRIPTIONS
|
||||
from pydantic import Field, validator
|
||||
from yfinance import Ticker
|
||||
|
||||
from openbb_yfinance.utils.types import INTERVALS, PERIODS
|
||||
|
||||
|
||||
class YFinanceForexEODQueryParams(ForexEODQueryParams):
|
||||
"""YFinance Forex end of day Query.
|
||||
|
||||
Source: https://finance.yahoo.com/currencies/
|
||||
"""
|
||||
|
||||
interval: Optional[INTERVALS] = Field(default="1d", description="Data granularity.")
|
||||
period: Optional[PERIODS] = Field(
|
||||
default=None, description=QUERY_DESCRIPTIONS.get("period", "")
|
||||
)
|
||||
|
||||
|
||||
class YFinanceForexEODData(ForexEODData):
|
||||
"""YFinance Forex end of day Data."""
|
||||
|
||||
class Config:
|
||||
fields = {
|
||||
"date": "Date",
|
||||
"open": "Open",
|
||||
"high": "High",
|
||||
"low": "Low",
|
||||
"close": "Close",
|
||||
"volume": "Volume",
|
||||
}
|
||||
|
||||
@validator("Date", pre=True, check_fields=False)
|
||||
def date_validate(cls, v): # pylint: disable=E0213
|
||||
return datetime.strptime(v, "%Y-%m-%dT%H:%M:%S")
|
||||
|
||||
|
||||
class YFinanceForexEODFetcher(
|
||||
Fetcher[
|
||||
YFinanceForexEODQueryParams,
|
||||
YFinanceForexEODData,
|
||||
]
|
||||
):
|
||||
@staticmethod
|
||||
def transform_query(params: Dict[str, Any]) -> YFinanceForexEODQueryParams:
|
||||
now = datetime.now().date()
|
||||
transformed_params = params
|
||||
if params.get("start_date") is None:
|
||||
transformed_params["start_date"] = now - timedelta(days=7)
|
||||
|
||||
if params.get("end_date") is None:
|
||||
transformed_params["end_date"] = now
|
||||
return YFinanceForexEODQueryParams(**params)
|
||||
|
||||
@staticmethod
|
||||
def extract_data(
|
||||
query: YFinanceForexEODQueryParams,
|
||||
credentials: Optional[Dict[str, str]],
|
||||
**kwargs: Any,
|
||||
) -> List[YFinanceForexEODData]:
|
||||
query.symbol = f"{query.symbol}=X"
|
||||
|
||||
now = datetime.now().date()
|
||||
query.start_date = query.start_date or (now - timedelta(days=8))
|
||||
query.end_date = query.end_date or (now - timedelta(days=1))
|
||||
|
||||
if query.period:
|
||||
data = Ticker(query.symbol).history(
|
||||
interval=query.interval,
|
||||
period=query.period,
|
||||
actions=False,
|
||||
raise_errors=True,
|
||||
)
|
||||
else:
|
||||
data = Ticker(query.symbol).history(
|
||||
interval=query.interval,
|
||||
start=query.start_date,
|
||||
end=query.end_date,
|
||||
actions=False,
|
||||
raise_errors=True,
|
||||
)
|
||||
|
||||
data = data.reset_index()
|
||||
data["Date"] = (
|
||||
data["Date"].dt.tz_localize(None).dt.strftime("%Y-%m-%dT%H:%M:%S")
|
||||
)
|
||||
data = data.to_dict("records")
|
||||
|
||||
return [YFinanceForexEODData(**d) for d in data]
|
||||
|
||||
@staticmethod
|
||||
def transform_data(
|
||||
data: List[YFinanceForexEODData],
|
||||
) -> List[YFinanceForexEODData]:
|
||||
return data
|
||||
@@ -0,0 +1,106 @@
|
||||
"""yfinance Major Indices end of day fetcher."""
|
||||
|
||||
|
||||
from datetime import datetime, timedelta
|
||||
from typing import Any, Dict, List, Optional
|
||||
|
||||
from openbb_provider.abstract.fetcher import Fetcher
|
||||
from openbb_provider.models.major_indices_eod import (
|
||||
MajorIndicesEODData,
|
||||
MajorIndicesEODQueryParams,
|
||||
)
|
||||
from openbb_provider.utils.descriptions import QUERY_DESCRIPTIONS
|
||||
from pydantic import Field, validator
|
||||
from yfinance import Ticker
|
||||
|
||||
from openbb_yfinance.utils.types import INTERVALS, PERIODS
|
||||
|
||||
|
||||
class YFinanceMajorIndicesEODQueryParams(MajorIndicesEODQueryParams):
|
||||
"""YFinance Major Indices end of day Query.
|
||||
|
||||
Source: https://finance.yahoo.com/world-indices
|
||||
"""
|
||||
|
||||
interval: Optional[INTERVALS] = Field(default="1d", description="Data granularity.")
|
||||
period: Optional[PERIODS] = Field(
|
||||
default=None, description=QUERY_DESCRIPTIONS.get("period", "")
|
||||
)
|
||||
|
||||
|
||||
class YFinanceMajorIndicesEODData(MajorIndicesEODData):
|
||||
"""YFinance Major Indices end of day Data."""
|
||||
|
||||
class Config:
|
||||
fields = {
|
||||
"date": "Date",
|
||||
"open": "Open",
|
||||
"high": "High",
|
||||
"low": "Low",
|
||||
"close": "Close",
|
||||
"volume": "Volume",
|
||||
}
|
||||
|
||||
@validator("Date", pre=True, check_fields=False)
|
||||
def date_validate(cls, v): # pylint: disable=E0213
|
||||
return datetime.strptime(v, "%Y-%m-%dT%H:%M:%S")
|
||||
|
||||
|
||||
class YFinanceMajorIndicesEODFetcher(
|
||||
Fetcher[
|
||||
YFinanceMajorIndicesEODQueryParams,
|
||||
YFinanceMajorIndicesEODData,
|
||||
]
|
||||
):
|
||||
@staticmethod
|
||||
def transform_query(params: Dict[str, Any]) -> YFinanceMajorIndicesEODQueryParams:
|
||||
now = datetime.now().date()
|
||||
transformed_params = params
|
||||
if params.get("start_date") is None:
|
||||
transformed_params["start_date"] = now - timedelta(days=7)
|
||||
|
||||
if params.get("end_date") is None:
|
||||
transformed_params["end_date"] = now
|
||||
return YFinanceMajorIndicesEODQueryParams(**params)
|
||||
|
||||
@staticmethod
|
||||
def extract_data(
|
||||
query: YFinanceMajorIndicesEODQueryParams,
|
||||
credentials: Optional[Dict[str, str]],
|
||||
**kwargs: Any,
|
||||
) -> List[YFinanceMajorIndicesEODData]:
|
||||
query.symbol = f"^{query.symbol}"
|
||||
|
||||
now = datetime.now().date()
|
||||
query.start_date = query.start_date or (now - timedelta(days=8))
|
||||
query.end_date = query.end_date or (now - timedelta(days=1))
|
||||
|
||||
if query.period:
|
||||
data = Ticker(query.symbol).history(
|
||||
interval=query.interval,
|
||||
period=query.period,
|
||||
actions=False,
|
||||
raise_errors=True,
|
||||
)
|
||||
else:
|
||||
data = Ticker(query.symbol).history(
|
||||
interval=query.interval,
|
||||
start=query.start_date,
|
||||
end=query.end_date,
|
||||
actions=False,
|
||||
raise_errors=True,
|
||||
)
|
||||
|
||||
data = data.reset_index()
|
||||
data["Date"] = (
|
||||
data["Date"].dt.tz_localize(None).dt.strftime("%Y-%m-%dT%H:%M:%S")
|
||||
)
|
||||
data = data.to_dict("records")
|
||||
|
||||
return [YFinanceMajorIndicesEODData(**d) for d in data]
|
||||
|
||||
@staticmethod
|
||||
def transform_data(
|
||||
data: List[YFinanceMajorIndicesEODData],
|
||||
) -> List[YFinanceMajorIndicesEODData]:
|
||||
return data
|
||||
@@ -0,0 +1,101 @@
|
||||
"""yfinance Stock end of day fetcher."""
|
||||
|
||||
|
||||
from datetime import datetime, timedelta
|
||||
from typing import Any, Dict, List, Optional
|
||||
|
||||
from openbb_provider.abstract.fetcher import Fetcher
|
||||
from openbb_provider.models.stock_eod import StockEODData, StockEODQueryParams
|
||||
from openbb_provider.utils.descriptions import QUERY_DESCRIPTIONS
|
||||
from pydantic import Field, validator
|
||||
from yfinance import Ticker
|
||||
|
||||
from openbb_yfinance.utils.types import INTERVALS, PERIODS
|
||||
|
||||
|
||||
class YFinanceStockEODQueryParams(StockEODQueryParams):
|
||||
"""YFinance Stock end of day Query.
|
||||
|
||||
Source: https://finance.yahoo.com/
|
||||
"""
|
||||
|
||||
interval: Optional[INTERVALS] = Field(default="1d", description="Data granularity.")
|
||||
period: Optional[PERIODS] = Field(
|
||||
default=None, description=QUERY_DESCRIPTIONS.get("period", "")
|
||||
)
|
||||
|
||||
|
||||
class YFinanceStockEODData(StockEODData):
|
||||
"""YFinance Stock end of day Data."""
|
||||
|
||||
class Config:
|
||||
fields = {
|
||||
"date": "Date",
|
||||
"open": "Open",
|
||||
"high": "High",
|
||||
"low": "Low",
|
||||
"close": "Close",
|
||||
"volume": "Volume",
|
||||
}
|
||||
|
||||
@validator("Date", pre=True, check_fields=False)
|
||||
def date_validate(cls, v): # pylint: disable=E0213
|
||||
return datetime.strptime(v, "%Y-%m-%dT%H:%M:%S")
|
||||
|
||||
|
||||
class YFinanceStockEODFetcher(
|
||||
Fetcher[
|
||||
YFinanceStockEODQueryParams,
|
||||
YFinanceStockEODData,
|
||||
]
|
||||
):
|
||||
@staticmethod
|
||||
def transform_query(params: Dict[str, Any]) -> YFinanceStockEODQueryParams:
|
||||
now = datetime.now().date()
|
||||
transformed_params = params
|
||||
if params.get("start_date") is None:
|
||||
transformed_params["start_date"] = now - timedelta(days=7)
|
||||
|
||||
if params.get("end_date") is None:
|
||||
transformed_params["end_date"] = now
|
||||
return YFinanceStockEODQueryParams(**params)
|
||||
|
||||
@staticmethod
|
||||
def extract_data(
|
||||
query: YFinanceStockEODQueryParams,
|
||||
credentials: Optional[Dict[str, str]],
|
||||
**kwargs: Any
|
||||
) -> List[YFinanceStockEODData]:
|
||||
now = datetime.now().date()
|
||||
query.start_date = query.start_date or (now - timedelta(days=8))
|
||||
query.end_date = query.end_date or (now - timedelta(days=1))
|
||||
|
||||
if query.period:
|
||||
data = Ticker(query.symbol).history(
|
||||
interval=query.interval,
|
||||
period=query.period,
|
||||
actions=False,
|
||||
raise_errors=True,
|
||||
)
|
||||
else:
|
||||
data = Ticker(query.symbol).history(
|
||||
interval=query.interval,
|
||||
start=query.start_date,
|
||||
end=query.end_date,
|
||||
actions=False,
|
||||
raise_errors=True,
|
||||
)
|
||||
|
||||
data = data.reset_index()
|
||||
data["Date"] = (
|
||||
data["Date"].dt.tz_localize(None).dt.strftime("%Y-%m-%dT%H:%M:%S")
|
||||
)
|
||||
data = data.to_dict("records")
|
||||
|
||||
return [YFinanceStockEODData(**d) for d in data]
|
||||
|
||||
@staticmethod
|
||||
def transform_data(
|
||||
data: List[YFinanceStockEODData],
|
||||
) -> List[YFinanceStockEODData]:
|
||||
return data
|
||||
11
openbb_sdk/providers/yfinance/openbb_yfinance/utils/types.py
Normal file
11
openbb_sdk/providers/yfinance/openbb_yfinance/utils/types.py
Normal file
@@ -0,0 +1,11 @@
|
||||
"""yfinance types helpers."""
|
||||
|
||||
from typing import Literal
|
||||
|
||||
INTERVALS = Literal[
|
||||
"1m", "2m", "5m", "15m", "30m", "60m", "90m", "1h", "1d", "5d", "1wk", "1mo", "3mo"
|
||||
]
|
||||
|
||||
PERIODS = Literal[
|
||||
"1d", "5d", "1mo", "3mo", "6mo", "1y", "2y", "5y", "10y", "ytd", "max"
|
||||
]
|
||||
19
openbb_sdk/providers/yfinance/pyproject.toml
vendored
Normal file
19
openbb_sdk/providers/yfinance/pyproject.toml
vendored
Normal file
@@ -0,0 +1,19 @@
|
||||
[tool.poetry]
|
||||
name = "openbb-yfinance"
|
||||
version = "0.1.1"
|
||||
description = ""
|
||||
authors = ["OpenBB Team <hello@openbb.co>"]
|
||||
readme = "README.md"
|
||||
packages = [{ include = "openbb_yfinance" }]
|
||||
|
||||
[tool.poetry.dependencies]
|
||||
python = "^3.8"
|
||||
yfinance="^0.2.27"
|
||||
openbb-provider = { path = "../../sdk/provider" }
|
||||
|
||||
[build-system]
|
||||
requires = ["poetry-core"]
|
||||
build-backend = "poetry.core.masonry.api"
|
||||
|
||||
[tool.poetry.plugins."openbb_provider_extension"]
|
||||
yfinance = "openbb_yfinance:yfinance_provider"
|
||||
0
openbb_sdk/providers/yfinance/tests/.gitkeep
vendored
Normal file
0
openbb_sdk/providers/yfinance/tests/.gitkeep
vendored
Normal file
2
openbb_sdk/pyproject.toml
vendored
2
openbb_sdk/pyproject.toml
vendored
@@ -21,6 +21,8 @@ openbb-benzinga = { path = "./providers/benzinga" }
|
||||
openbb-fmp = { path = "./providers/fmp" }
|
||||
openbb-polygon = { path = "./providers/polygon" }
|
||||
openbb-fred = { path = "./providers/fred" }
|
||||
openbb-yfinance = { path = "./providers/yfinance" }
|
||||
openbb-cboe = { path = "./providers/cboe"}
|
||||
|
||||
|
||||
[tool.poetry.group.dev.dependencies]
|
||||
|
||||
@@ -20,7 +20,9 @@ class CLASS_economy(Container):
|
||||
def corecpi(
|
||||
self,
|
||||
chart: bool = False,
|
||||
provider: Optional[Literal["benzinga", "fmp", "fred", "polygon"]] = None,
|
||||
provider: Optional[
|
||||
Literal["benzinga", "cboe", "fmp", "fred", "polygon"]
|
||||
] = None,
|
||||
) -> CommandOutput[openbb_core.app.model.results.empty.Empty]:
|
||||
"""CORECPI.""" # noqa: E501
|
||||
inputs = filter_inputs(
|
||||
@@ -305,7 +307,9 @@ class CLASS_economy(Container):
|
||||
def cpi_options(
|
||||
self,
|
||||
chart: bool = False,
|
||||
provider: Optional[Literal["benzinga", "fmp", "fred", "polygon"]] = None,
|
||||
provider: Optional[
|
||||
Literal["benzinga", "cboe", "fmp", "fred", "polygon"]
|
||||
] = None,
|
||||
) -> CommandOutput[openbb_core.app.model.results.empty.Empty]:
|
||||
"""Get the options for v3 cpi(options=True)""" # noqa: E501
|
||||
inputs = filter_inputs(
|
||||
@@ -608,7 +612,9 @@ class CLASS_economy(Container):
|
||||
def macro(
|
||||
self,
|
||||
chart: bool = False,
|
||||
provider: Optional[Literal["benzinga", "fmp", "fred", "polygon"]] = None,
|
||||
provider: Optional[
|
||||
Literal["benzinga", "cboe", "fmp", "fred", "polygon"]
|
||||
] = None,
|
||||
) -> CommandOutput[openbb_core.app.model.results.empty.Empty]:
|
||||
"""Query EconDB for macro data.""" # noqa: E501
|
||||
inputs = filter_inputs(
|
||||
@@ -630,7 +636,9 @@ class CLASS_economy(Container):
|
||||
def macro_countries(
|
||||
self,
|
||||
chart: bool = False,
|
||||
provider: Optional[Literal["benzinga", "fmp", "fred", "polygon"]] = None,
|
||||
provider: Optional[
|
||||
Literal["benzinga", "cboe", "fmp", "fred", "polygon"]
|
||||
] = None,
|
||||
) -> CommandOutput[openbb_core.app.model.results.empty.Empty]:
|
||||
"""MACRO_COUNTRIES.""" # noqa: E501
|
||||
inputs = filter_inputs(
|
||||
@@ -652,7 +660,9 @@ class CLASS_economy(Container):
|
||||
def macro_parameters(
|
||||
self,
|
||||
chart: bool = False,
|
||||
provider: Optional[Literal["benzinga", "fmp", "fred", "polygon"]] = None,
|
||||
provider: Optional[
|
||||
Literal["benzinga", "cboe", "fmp", "fred", "polygon"]
|
||||
] = None,
|
||||
) -> CommandOutput[openbb_core.app.model.results.empty.Empty]:
|
||||
"""MACRO_PARAMETERS.""" # noqa: E501
|
||||
inputs = filter_inputs(
|
||||
@@ -674,7 +684,9 @@ class CLASS_economy(Container):
|
||||
def balance(
|
||||
self,
|
||||
chart: bool = False,
|
||||
provider: Optional[Literal["benzinga", "fmp", "fred", "polygon"]] = None,
|
||||
provider: Optional[
|
||||
Literal["benzinga", "cboe", "fmp", "fred", "polygon"]
|
||||
] = None,
|
||||
) -> CommandOutput[openbb_core.app.model.results.empty.Empty]:
|
||||
"""BALANCE.""" # noqa: E501
|
||||
inputs = filter_inputs(
|
||||
@@ -696,7 +708,9 @@ class CLASS_economy(Container):
|
||||
def bigmac(
|
||||
self,
|
||||
chart: bool = False,
|
||||
provider: Optional[Literal["benzinga", "fmp", "fred", "polygon"]] = None,
|
||||
provider: Optional[
|
||||
Literal["benzinga", "cboe", "fmp", "fred", "polygon"]
|
||||
] = None,
|
||||
) -> CommandOutput[openbb_core.app.model.results.empty.Empty]:
|
||||
"""BIGMAC.""" # noqa: E501
|
||||
inputs = filter_inputs(
|
||||
@@ -718,7 +732,9 @@ class CLASS_economy(Container):
|
||||
def country_codes(
|
||||
self,
|
||||
chart: bool = False,
|
||||
provider: Optional[Literal["benzinga", "fmp", "fred", "polygon"]] = None,
|
||||
provider: Optional[
|
||||
Literal["benzinga", "cboe", "fmp", "fred", "polygon"]
|
||||
] = None,
|
||||
) -> CommandOutput[openbb_core.app.model.results.empty.Empty]:
|
||||
"""COUNTRY_CODES.""" # noqa: E501
|
||||
inputs = filter_inputs(
|
||||
@@ -740,7 +756,9 @@ class CLASS_economy(Container):
|
||||
def currencies(
|
||||
self,
|
||||
chart: bool = False,
|
||||
provider: Optional[Literal["benzinga", "fmp", "fred", "polygon"]] = None,
|
||||
provider: Optional[
|
||||
Literal["benzinga", "cboe", "fmp", "fred", "polygon"]
|
||||
] = None,
|
||||
) -> CommandOutput[openbb_core.app.model.results.empty.Empty]:
|
||||
"""CURRENCIES.""" # noqa: E501
|
||||
inputs = filter_inputs(
|
||||
@@ -762,7 +780,9 @@ class CLASS_economy(Container):
|
||||
def debt(
|
||||
self,
|
||||
chart: bool = False,
|
||||
provider: Optional[Literal["benzinga", "fmp", "fred", "polygon"]] = None,
|
||||
provider: Optional[
|
||||
Literal["benzinga", "cboe", "fmp", "fred", "polygon"]
|
||||
] = None,
|
||||
) -> CommandOutput[openbb_core.app.model.results.empty.Empty]:
|
||||
"""DEBT.""" # noqa: E501
|
||||
inputs = filter_inputs(
|
||||
@@ -784,7 +804,9 @@ class CLASS_economy(Container):
|
||||
def events(
|
||||
self,
|
||||
chart: bool = False,
|
||||
provider: Optional[Literal["benzinga", "fmp", "fred", "polygon"]] = None,
|
||||
provider: Optional[
|
||||
Literal["benzinga", "cboe", "fmp", "fred", "polygon"]
|
||||
] = None,
|
||||
) -> CommandOutput[openbb_core.app.model.results.empty.Empty]:
|
||||
"""EVENTS.""" # noqa: E501
|
||||
inputs = filter_inputs(
|
||||
@@ -806,7 +828,9 @@ class CLASS_economy(Container):
|
||||
def fgdp(
|
||||
self,
|
||||
chart: bool = False,
|
||||
provider: Optional[Literal["benzinga", "fmp", "fred", "polygon"]] = None,
|
||||
provider: Optional[
|
||||
Literal["benzinga", "cboe", "fmp", "fred", "polygon"]
|
||||
] = None,
|
||||
) -> CommandOutput[openbb_core.app.model.results.empty.Empty]:
|
||||
"""FGDP.""" # noqa: E501
|
||||
inputs = filter_inputs(
|
||||
@@ -828,7 +852,9 @@ class CLASS_economy(Container):
|
||||
def fred(
|
||||
self,
|
||||
chart: bool = False,
|
||||
provider: Optional[Literal["benzinga", "fmp", "fred", "polygon"]] = None,
|
||||
provider: Optional[
|
||||
Literal["benzinga", "cboe", "fmp", "fred", "polygon"]
|
||||
] = None,
|
||||
) -> CommandOutput[openbb_core.app.model.results.empty.Empty]:
|
||||
"""FRED.""" # noqa: E501
|
||||
inputs = filter_inputs(
|
||||
@@ -850,7 +876,9 @@ class CLASS_economy(Container):
|
||||
def fred_search(
|
||||
self,
|
||||
chart: bool = False,
|
||||
provider: Optional[Literal["benzinga", "fmp", "fred", "polygon"]] = None,
|
||||
provider: Optional[
|
||||
Literal["benzinga", "cboe", "fmp", "fred", "polygon"]
|
||||
] = None,
|
||||
) -> CommandOutput[openbb_core.app.model.results.empty.Empty]:
|
||||
"""FRED Search (was fred_notes).""" # noqa: E501
|
||||
inputs = filter_inputs(
|
||||
@@ -872,7 +900,9 @@ class CLASS_economy(Container):
|
||||
def futures(
|
||||
self,
|
||||
chart: bool = False,
|
||||
provider: Optional[Literal["benzinga", "fmp", "fred", "polygon"]] = None,
|
||||
provider: Optional[
|
||||
Literal["benzinga", "cboe", "fmp", "fred", "polygon"]
|
||||
] = None,
|
||||
) -> CommandOutput[openbb_core.app.model.results.empty.Empty]:
|
||||
"""FUTURES. 2 sources""" # noqa: E501
|
||||
inputs = filter_inputs(
|
||||
@@ -894,7 +924,9 @@ class CLASS_economy(Container):
|
||||
def gdp(
|
||||
self,
|
||||
chart: bool = False,
|
||||
provider: Optional[Literal["benzinga", "fmp", "fred", "polygon"]] = None,
|
||||
provider: Optional[
|
||||
Literal["benzinga", "cboe", "fmp", "fred", "polygon"]
|
||||
] = None,
|
||||
) -> CommandOutput[openbb_core.app.model.results.empty.Empty]:
|
||||
"""GDP.""" # noqa: E501
|
||||
inputs = filter_inputs(
|
||||
@@ -916,7 +948,9 @@ class CLASS_economy(Container):
|
||||
def glbonds(
|
||||
self,
|
||||
chart: bool = False,
|
||||
provider: Optional[Literal["benzinga", "fmp", "fred", "polygon"]] = None,
|
||||
provider: Optional[
|
||||
Literal["benzinga", "cboe", "fmp", "fred", "polygon"]
|
||||
] = None,
|
||||
) -> CommandOutput[openbb_core.app.model.results.empty.Empty]:
|
||||
"""GLBONDS.""" # noqa: E501
|
||||
inputs = filter_inputs(
|
||||
@@ -938,7 +972,9 @@ class CLASS_economy(Container):
|
||||
def indices(
|
||||
self,
|
||||
chart: bool = False,
|
||||
provider: Optional[Literal["benzinga", "fmp", "fred", "polygon"]] = None,
|
||||
provider: Optional[
|
||||
Literal["benzinga", "cboe", "fmp", "fred", "polygon"]
|
||||
] = None,
|
||||
) -> CommandOutput[openbb_core.app.model.results.empty.Empty]:
|
||||
"""INDICES.""" # noqa: E501
|
||||
inputs = filter_inputs(
|
||||
@@ -960,7 +996,9 @@ class CLASS_economy(Container):
|
||||
def overview(
|
||||
self,
|
||||
chart: bool = False,
|
||||
provider: Optional[Literal["benzinga", "fmp", "fred", "polygon"]] = None,
|
||||
provider: Optional[
|
||||
Literal["benzinga", "cboe", "fmp", "fred", "polygon"]
|
||||
] = None,
|
||||
) -> CommandOutput[openbb_core.app.model.results.empty.Empty]:
|
||||
"""OVERVIEW.""" # noqa: E501
|
||||
inputs = filter_inputs(
|
||||
@@ -982,7 +1020,9 @@ class CLASS_economy(Container):
|
||||
def perfmap(
|
||||
self,
|
||||
chart: bool = False,
|
||||
provider: Optional[Literal["benzinga", "fmp", "fred", "polygon"]] = None,
|
||||
provider: Optional[
|
||||
Literal["benzinga", "cboe", "fmp", "fred", "polygon"]
|
||||
] = None,
|
||||
) -> CommandOutput[openbb_core.app.model.results.empty.Empty]:
|
||||
"""PERFMAP.""" # noqa: E501
|
||||
inputs = filter_inputs(
|
||||
@@ -1004,7 +1044,9 @@ class CLASS_economy(Container):
|
||||
def performance(
|
||||
self,
|
||||
chart: bool = False,
|
||||
provider: Optional[Literal["benzinga", "fmp", "fred", "polygon"]] = None,
|
||||
provider: Optional[
|
||||
Literal["benzinga", "cboe", "fmp", "fred", "polygon"]
|
||||
] = None,
|
||||
) -> CommandOutput[openbb_core.app.model.results.empty.Empty]:
|
||||
"""PERFORMANCE.""" # noqa: E501
|
||||
inputs = filter_inputs(
|
||||
@@ -1026,7 +1068,9 @@ class CLASS_economy(Container):
|
||||
def revenue(
|
||||
self,
|
||||
chart: bool = False,
|
||||
provider: Optional[Literal["benzinga", "fmp", "fred", "polygon"]] = None,
|
||||
provider: Optional[
|
||||
Literal["benzinga", "cboe", "fmp", "fred", "polygon"]
|
||||
] = None,
|
||||
) -> CommandOutput[openbb_core.app.model.results.empty.Empty]:
|
||||
"""REVENUE.""" # noqa: E501
|
||||
inputs = filter_inputs(
|
||||
@@ -1048,7 +1092,9 @@ class CLASS_economy(Container):
|
||||
def rgdp(
|
||||
self,
|
||||
chart: bool = False,
|
||||
provider: Optional[Literal["benzinga", "fmp", "fred", "polygon"]] = None,
|
||||
provider: Optional[
|
||||
Literal["benzinga", "cboe", "fmp", "fred", "polygon"]
|
||||
] = None,
|
||||
) -> CommandOutput[openbb_core.app.model.results.empty.Empty]:
|
||||
"""RGDP.""" # noqa: E501
|
||||
inputs = filter_inputs(
|
||||
@@ -1070,7 +1116,9 @@ class CLASS_economy(Container):
|
||||
def rtps(
|
||||
self,
|
||||
chart: bool = False,
|
||||
provider: Optional[Literal["benzinga", "fmp", "fred", "polygon"]] = None,
|
||||
provider: Optional[
|
||||
Literal["benzinga", "cboe", "fmp", "fred", "polygon"]
|
||||
] = None,
|
||||
) -> CommandOutput[openbb_core.app.model.results.empty.Empty]:
|
||||
"""RTPS.""" # noqa: E501
|
||||
inputs = filter_inputs(
|
||||
@@ -1092,7 +1140,9 @@ class CLASS_economy(Container):
|
||||
def search_index(
|
||||
self,
|
||||
chart: bool = False,
|
||||
provider: Optional[Literal["benzinga", "fmp", "fred", "polygon"]] = None,
|
||||
provider: Optional[
|
||||
Literal["benzinga", "cboe", "fmp", "fred", "polygon"]
|
||||
] = None,
|
||||
) -> CommandOutput[openbb_core.app.model.results.empty.Empty]:
|
||||
"""SEARCH_INDEX.""" # noqa: E501
|
||||
inputs = filter_inputs(
|
||||
@@ -1114,7 +1164,9 @@ class CLASS_economy(Container):
|
||||
def spending(
|
||||
self,
|
||||
chart: bool = False,
|
||||
provider: Optional[Literal["benzinga", "fmp", "fred", "polygon"]] = None,
|
||||
provider: Optional[
|
||||
Literal["benzinga", "cboe", "fmp", "fred", "polygon"]
|
||||
] = None,
|
||||
) -> CommandOutput[openbb_core.app.model.results.empty.Empty]:
|
||||
"""SPENDING.""" # noqa: E501
|
||||
inputs = filter_inputs(
|
||||
@@ -1136,7 +1188,9 @@ class CLASS_economy(Container):
|
||||
def trust(
|
||||
self,
|
||||
chart: bool = False,
|
||||
provider: Optional[Literal["benzinga", "fmp", "fred", "polygon"]] = None,
|
||||
provider: Optional[
|
||||
Literal["benzinga", "cboe", "fmp", "fred", "polygon"]
|
||||
] = None,
|
||||
) -> CommandOutput[openbb_core.app.model.results.empty.Empty]:
|
||||
"""TRUST.""" # noqa: E501
|
||||
inputs = filter_inputs(
|
||||
@@ -1158,7 +1212,9 @@ class CLASS_economy(Container):
|
||||
def usbonds(
|
||||
self,
|
||||
chart: bool = False,
|
||||
provider: Optional[Literal["benzinga", "fmp", "fred", "polygon"]] = None,
|
||||
provider: Optional[
|
||||
Literal["benzinga", "cboe", "fmp", "fred", "polygon"]
|
||||
] = None,
|
||||
) -> CommandOutput[openbb_core.app.model.results.empty.Empty]:
|
||||
"""USBONDS.""" # noqa: E501
|
||||
inputs = filter_inputs(
|
||||
@@ -1180,7 +1236,9 @@ class CLASS_economy(Container):
|
||||
def valuation(
|
||||
self,
|
||||
chart: bool = False,
|
||||
provider: Optional[Literal["benzinga", "fmp", "fred", "polygon"]] = None,
|
||||
provider: Optional[
|
||||
Literal["benzinga", "cboe", "fmp", "fred", "polygon"]
|
||||
] = None,
|
||||
) -> CommandOutput[openbb_core.app.model.results.empty.Empty]:
|
||||
"""VALUATION.""" # noqa: E501
|
||||
inputs = filter_inputs(
|
||||
|
||||
@@ -199,26 +199,18 @@
|
||||
"stocks_ins_stats": "/stocks/ins/stats",
|
||||
"stocks_options_chains": "/stocks/options/chains",
|
||||
"stocks_options": "/stocks/options",
|
||||
"stocks_options_dte": "/stocks/options/dte",
|
||||
"stocks_options_eodchain": "/stocks/options/eodchain",
|
||||
"stocks_options_expirations": "/stocks/options/expirations",
|
||||
"stocks_options_grhist": "/stocks/options/grhist",
|
||||
"stocks_options_hist": "/stocks/options/hist",
|
||||
"stocks_options_info": "/stocks/options/info",
|
||||
"stocks_options_last_price": "/stocks/options/last_price",
|
||||
"stocks_options_oi": "/stocks/options/oi",
|
||||
"stocks_options_pcr": "/stocks/options/pcr",
|
||||
"stocks_options_price": "/stocks/options/price",
|
||||
"stocks_options_unu": "/stocks/options/unu",
|
||||
"stocks_options_voi": "/stocks/options/voi",
|
||||
"stocks_options_vol": "/stocks/options/vol",
|
||||
"stocks_options_vsurf": "/stocks/options/vsurf",
|
||||
"stocks_load": "/stocks/load",
|
||||
"stocks_news": "/stocks/news",
|
||||
"stocks_multiples": "/stocks/multiples",
|
||||
"stocks_tob": "/stocks/tob",
|
||||
"stocks_quote": "/stocks/quote",
|
||||
"stocks_search": "/stocks/search",
|
||||
"stocks_quote": "/stocks/quote",
|
||||
"stocks_info": "/stocks/info",
|
||||
"ta_atr": "/ta/atr",
|
||||
"ta": "/ta",
|
||||
"ta_fib": "/ta/fib",
|
||||
|
||||
@@ -100,10 +100,11 @@ class CLASS_stocks(Container):
|
||||
),
|
||||
] = None,
|
||||
chart: bool = False,
|
||||
provider: Optional[Literal["fmp", "polygon"]] = None,
|
||||
**kwargs,
|
||||
provider: Optional[Literal["cboe", "fmp", "polygon"]] = None,
|
||||
**kwargs
|
||||
) -> CommandOutput[typing.List]:
|
||||
"""Load stock data for a specific ticker.
|
||||
"""Load stock data for a specific ticker.
|
||||
|
||||
|
||||
openbb
|
||||
@@ -111,7 +112,7 @@ class CLASS_stocks(Container):
|
||||
|
||||
Parameters
|
||||
----------
|
||||
provider: Literal[fmp, polygon]
|
||||
provider: Literal[cboe, fmp, polygon]
|
||||
The provider to use for the query.
|
||||
symbol : ConstrainedStrValue
|
||||
Symbol to get data for.
|
||||
@@ -149,7 +150,7 @@ class CLASS_stocks(Container):
|
||||
The close price of the symbol.
|
||||
volume : float
|
||||
The volume of the symbol.
|
||||
vwap : Optional[PositiveFloat]
|
||||
vwap : PositiveFloat
|
||||
Volume Weighted Average Price of the symbol.
|
||||
|
||||
fmp
|
||||
@@ -171,12 +172,12 @@ class CLASS_stocks(Container):
|
||||
Unadjusted volume of the symbol.
|
||||
change : Optional[float]
|
||||
Change in the price of the symbol from the previous day.
|
||||
changePercent : Optional[float]
|
||||
Change \\% in the price of the symbol.
|
||||
label : Optional[str]
|
||||
changePercent : float
|
||||
Change \% in the price of the symbol.
|
||||
label : str
|
||||
Human readable format of the date.
|
||||
changeOverTime : Optional[float]
|
||||
Change \\% in the price of the symbol over a period of time.
|
||||
changeOverTime : float
|
||||
Change \% in the price of the symbol over a period of time.
|
||||
|
||||
polygon
|
||||
=======
|
||||
@@ -630,16 +631,15 @@ class CLASS_stocks(Container):
|
||||
|
||||
@filter_call
|
||||
@validate_arguments
|
||||
def quote(
|
||||
def search(
|
||||
self,
|
||||
symbol: typing.Annotated[
|
||||
str, OpenBBCustomParameter(description="Symbol to get data for.")
|
||||
],
|
||||
query: str = "",
|
||||
ticker: bool = False,
|
||||
chart: bool = False,
|
||||
provider: Optional[Literal["fmp"]] = None,
|
||||
**kwargs,
|
||||
provider: Optional[Literal["cboe"]] = None,
|
||||
**kwargs
|
||||
) -> CommandOutput[typing.List]:
|
||||
"""Load stock data for a specific ticker.
|
||||
"""Search for a company or stock ticker.
|
||||
|
||||
|
||||
openbb
|
||||
@@ -647,10 +647,12 @@ class CLASS_stocks(Container):
|
||||
|
||||
Parameters
|
||||
----------
|
||||
provider: Literal[fmp]
|
||||
provider: Literal[cboe]
|
||||
The provider to use for the query.
|
||||
symbol : ConstrainedStrValue
|
||||
Symbol to get data for.
|
||||
query : str
|
||||
The search query.
|
||||
ticker : bool
|
||||
Whether to search by ticker symbol.
|
||||
|
||||
Returns
|
||||
-------
|
||||
@@ -667,64 +669,52 @@ class CLASS_stocks(Container):
|
||||
Chart object.
|
||||
|
||||
|
||||
StockQuote
|
||||
----------
|
||||
StockSearch
|
||||
-----------
|
||||
symbol : str
|
||||
Symbol of the company.
|
||||
name : Optional[str]
|
||||
The ticker symbol of the company.
|
||||
name : str
|
||||
The name of the company.
|
||||
price : Optional[float]
|
||||
The current trading price of the stock.
|
||||
changes_percentage : Optional[float]
|
||||
The change percentage of the stock price.
|
||||
change : Optional[float]
|
||||
The change of the stock price.
|
||||
day_low : Optional[float]
|
||||
The lowest price of the stock in the current trading day.
|
||||
day_high : Optional[float]
|
||||
The highest price of the stock in the current trading day.
|
||||
year_high : Optional[float]
|
||||
The highest price of the stock in the last 52 weeks.
|
||||
year_low : Optional[float]
|
||||
The lowest price of the stock in the last 52 weeks.
|
||||
market_cap : Optional[float]
|
||||
The market cap of the company.
|
||||
price_avg50 : Optional[float]
|
||||
The 50 days average price of the stock.
|
||||
price_avg200 : Optional[float]
|
||||
The 200 days average price of the stock.
|
||||
volume : Optional[int]
|
||||
The volume of the stock in the current trading day.
|
||||
avg_volume : Optional[int]
|
||||
The average volume of the stock in the last 10 trading days.
|
||||
exchange : Optional[str]
|
||||
The exchange the stock is traded on.
|
||||
open : Optional[float]
|
||||
The opening price of the stock in the current trading day.
|
||||
previous_close : Optional[float]
|
||||
The previous closing price of the stock.
|
||||
eps : Optional[float]
|
||||
The earnings per share of the stock.
|
||||
pe : Optional[float]
|
||||
The price earnings ratio of the stock.
|
||||
earnings_announcement : Optional[str]
|
||||
The earnings announcement date of the stock.
|
||||
shares_outstanding : Optional[int]
|
||||
The number of shares outstanding of the stock.
|
||||
date : Optional[datetime]
|
||||
The timestamp of the stock quote.
|
||||
|
||||
fmp
|
||||
===
|
||||
cboe
|
||||
====
|
||||
|
||||
Parameters
|
||||
----------
|
||||
All fields are standardized.
|
||||
|
||||
|
||||
StockQuote
|
||||
----------
|
||||
All fields are standardized.""" # noqa: E501
|
||||
StockSearch
|
||||
-----------
|
||||
dpmName : Optional[str]
|
||||
The name of the primary market maker.
|
||||
postStation : Optional[str]
|
||||
The post and station location on the CBOE trading floor."""
|
||||
inputs = filter_inputs(
|
||||
provider_choices={
|
||||
"provider": provider,
|
||||
},
|
||||
standard_params={
|
||||
"query": query,
|
||||
"ticker": ticker,
|
||||
},
|
||||
extra_params=kwargs,
|
||||
chart=chart,
|
||||
)
|
||||
|
||||
o = self._command_runner_session.run(
|
||||
"/stocks/search",
|
||||
**inputs,
|
||||
).output
|
||||
|
||||
return filter_output(o)
|
||||
|
||||
@filter_call
|
||||
@validate_arguments
|
||||
def quote(
|
||||
self, chart: bool = False
|
||||
) -> CommandOutput[openbb_core.app.model.results.empty.Empty]:
|
||||
"""View the current price for a specific stock ticker."""
|
||||
inputs = filter_inputs(
|
||||
provider_choices={
|
||||
"provider": provider,
|
||||
@@ -748,13 +738,20 @@ class CLASS_stocks(Container):
|
||||
def search(
|
||||
self, chart: bool = False
|
||||
) -> CommandOutput[openbb_core.app.model.results.empty.Empty]:
|
||||
"""Search a specific stock ticker for analysis.""" # noqa: E501
|
||||
"""Search a specific stock ticker for analysis."""
|
||||
inputs = filter_inputs(
|
||||
provider_choices={
|
||||
"provider": provider,
|
||||
},
|
||||
standard_params={
|
||||
"symbol": symbol,
|
||||
},
|
||||
extra_params=kwargs,
|
||||
chart=chart,
|
||||
)
|
||||
|
||||
o = self._command_runner_session.run(
|
||||
"/stocks/search",
|
||||
"/stocks/info",
|
||||
**inputs,
|
||||
).output
|
||||
|
||||
|
||||
@@ -142,7 +142,10 @@ class CLASS_stocks_fa(Container):
|
||||
deferred_revenue : Optional[int]
|
||||
Accrued income taxes, other deferred revenue
|
||||
short_term_debt : Optional[int]
|
||||
Short-term borrowings, Long-term debt due within one year, Operating lease obligations due within one year, Finance lease obligations due within one year
|
||||
|
||||
Short-term borrowings, Long-term debt due within one year, Operating lease obligations due within one year,
|
||||
Finance lease obligations due within one year
|
||||
|
||||
current_liabilities : Optional[int]
|
||||
None
|
||||
long_term_debt : Optional[int]
|
||||
@@ -2269,15 +2272,21 @@ class CLASS_stocks_fa(Container):
|
||||
last_total_calls : int
|
||||
Total number of call options contracts traded for Apple Inc. on the previous reporting date.
|
||||
total_calls_change : int
|
||||
Change in the total number of call options contracts traded between the current and previous reporting dates.
|
||||
|
||||
Change in the total number of call options contracts traded between the current and previous reporting dates.
|
||||
|
||||
total_puts : int
|
||||
Total number of put options contracts traded for Apple Inc. on the specified date.
|
||||
last_total_puts : int
|
||||
Total number of put options contracts traded for Apple Inc. on the previous reporting date.
|
||||
total_puts_change : int
|
||||
Change in the total number of put options contracts traded between the current and previous reporting dates.
|
||||
|
||||
Change in the total number of put options contracts traded between the current and previous reporting dates.
|
||||
|
||||
put_call_ratio : float
|
||||
The put-call ratio, which is the ratio of the total number of put options to call options traded on the specified date.
|
||||
|
||||
The put-call ratio, which is the ratio of the total number of put options to call options.
|
||||
|
||||
last_put_call_ratio : float
|
||||
The put-call ratio on the previous reporting date.
|
||||
put_call_ratio_change : float
|
||||
|
||||
@@ -1,8 +1,11 @@
|
||||
### THIS FILE IS AUTO-GENERATED. DO NOT EDIT. ###
|
||||
|
||||
import typing
|
||||
from typing import Literal, Optional
|
||||
|
||||
from pydantic import validate_arguments
|
||||
|
||||
import openbb_core.app.model.command_context
|
||||
import openbb_core.app.model.results.empty
|
||||
from openbb_core.app.model.command_output import CommandOutput
|
||||
from openbb_core.app.static.container import Container
|
||||
@@ -13,10 +16,115 @@ class CLASS_stocks_options(Container):
|
||||
@filter_call
|
||||
@validate_arguments
|
||||
def chains(
|
||||
self, chart: bool = False
|
||||
) -> CommandOutput[openbb_core.app.model.results.empty.Empty]:
|
||||
"""Return options chains with greeks.""" # noqa: E501
|
||||
self,
|
||||
symbol: str,
|
||||
chart: bool = False,
|
||||
provider: Optional[Literal["cboe"]] = None,
|
||||
**kwargs
|
||||
) -> CommandOutput[typing.List]:
|
||||
"""Get the complete options chain for a ticker.
|
||||
|
||||
|
||||
openbb
|
||||
======
|
||||
|
||||
Parameters
|
||||
----------
|
||||
provider: Literal[cboe]
|
||||
The provider to use for the query.
|
||||
symbol : ConstrainedStrValue
|
||||
Symbol to get data for.
|
||||
|
||||
Returns
|
||||
-------
|
||||
CommandOutput
|
||||
results: List[Data]
|
||||
Serializable results.
|
||||
provider: Optional[PROVIDERS]
|
||||
Provider name.
|
||||
warnings: Optional[List[Warning_]]
|
||||
List of warnings.
|
||||
error: Optional[Error]
|
||||
Caught exceptions.
|
||||
chart: Optional[Chart]
|
||||
Chart object.
|
||||
|
||||
|
||||
OptionsChains
|
||||
-------------
|
||||
expiration : datetime
|
||||
The expiration date of the contract.
|
||||
strike : float
|
||||
The strike price of the contract.
|
||||
optionType : str
|
||||
Call or Put.
|
||||
bid : float
|
||||
The bid price of the contract.
|
||||
ask : float
|
||||
The ask price of the contract.
|
||||
openInterest : float
|
||||
The open interest on the contract.
|
||||
volume : float
|
||||
The current trading volume on the contract.
|
||||
|
||||
cboe
|
||||
====
|
||||
|
||||
Parameters
|
||||
----------
|
||||
All fields are standardized.
|
||||
|
||||
|
||||
OptionsChains
|
||||
-------------
|
||||
contractSymbol : str
|
||||
The contract symbol for the option.
|
||||
dte : int
|
||||
The days to expiration for the option.
|
||||
bidSize : int
|
||||
The bid size for the option.
|
||||
askSize : int
|
||||
The ask size for the option.
|
||||
impliedVolatility : float
|
||||
The implied volatility of the option.
|
||||
delta : float
|
||||
The delta of the option.
|
||||
gamma : float
|
||||
The gamma of the option.
|
||||
theta : float
|
||||
The theta of the option.
|
||||
rho : float
|
||||
The rho of the option.
|
||||
vega : float
|
||||
The vega of the option.
|
||||
theoretical : float
|
||||
The theoretical value of the option.
|
||||
open : float
|
||||
The opening price of the option.
|
||||
high : float
|
||||
The high price of the option.
|
||||
low : float
|
||||
The low price of the option.
|
||||
lastTradePrice : float
|
||||
The last trade price of the option.
|
||||
tick : str
|
||||
Whether the last tick was up or down in price.
|
||||
previousClose : float
|
||||
The previous closing price of the option.
|
||||
change : float
|
||||
The change in price of the option.
|
||||
changePercent : float
|
||||
The change, in percent, of the option.
|
||||
lastTradeTimestamp : datetime
|
||||
The last trade timestamp of the option."""
|
||||
inputs = filter_inputs(
|
||||
provider_choices={
|
||||
"provider": provider,
|
||||
},
|
||||
standard_params={
|
||||
"symbol": symbol,
|
||||
},
|
||||
extra_params=kwargs,
|
||||
chart=chart,
|
||||
)
|
||||
|
||||
@@ -27,22 +135,6 @@ class CLASS_stocks_options(Container):
|
||||
|
||||
return filter_output(o)
|
||||
|
||||
@filter_call
|
||||
@validate_arguments
|
||||
def dte(
|
||||
self, chart: bool = False
|
||||
) -> CommandOutput[openbb_core.app.model.results.empty.Empty]:
|
||||
inputs = filter_inputs(
|
||||
chart=chart,
|
||||
)
|
||||
|
||||
o = self._command_runner_session.run(
|
||||
"/stocks/options/dte",
|
||||
**inputs,
|
||||
).output
|
||||
|
||||
return filter_output(o)
|
||||
|
||||
@filter_call
|
||||
@validate_arguments
|
||||
def eodchain(
|
||||
@@ -99,7 +191,7 @@ class CLASS_stocks_options(Container):
|
||||
def hist(
|
||||
self, chart: bool = False
|
||||
) -> CommandOutput[openbb_core.app.model.results.empty.Empty]:
|
||||
"""Plot option history.""" # noqa: E501
|
||||
"""Get historical data for a single option contract."""
|
||||
inputs = filter_inputs(
|
||||
chart=chart,
|
||||
)
|
||||
@@ -167,7 +259,7 @@ class CLASS_stocks_options(Container):
|
||||
def pcr(
|
||||
self, chart: bool = False
|
||||
) -> CommandOutput[openbb_core.app.model.results.empty.Empty]:
|
||||
"""Display put/call ratio for ticker.""" # noqa: E501
|
||||
"""Display historical rolling put/call ratio for ticker over a defined window."""
|
||||
inputs = filter_inputs(
|
||||
chart=chart,
|
||||
)
|
||||
@@ -179,22 +271,6 @@ class CLASS_stocks_options(Container):
|
||||
|
||||
return filter_output(o)
|
||||
|
||||
@filter_call
|
||||
@validate_arguments
|
||||
def price(
|
||||
self, chart: bool = False
|
||||
) -> CommandOutput[openbb_core.app.model.results.empty.Empty]:
|
||||
inputs = filter_inputs(
|
||||
chart=chart,
|
||||
)
|
||||
|
||||
o = self._command_runner_session.run(
|
||||
"/stocks/options/price",
|
||||
**inputs,
|
||||
).output
|
||||
|
||||
return filter_output(o)
|
||||
|
||||
@filter_call
|
||||
@validate_arguments
|
||||
def unu(
|
||||
|
||||
@@ -1,18 +1,20 @@
|
||||
### THIS FILE IS AUTO-GENERATED. DO NOT EDIT. ###
|
||||
|
||||
import typing
|
||||
from typing import List, Literal, Optional, Union
|
||||
|
||||
from openbb_core.app.static.container import Container
|
||||
from openbb_core.app.model.command_output import CommandOutput
|
||||
import openbb_provider
|
||||
import pandas
|
||||
import datetime
|
||||
import pydantic
|
||||
import pydantic.types
|
||||
from pydantic import validate_arguments
|
||||
from inspect import Parameter
|
||||
from typing import List, Dict, Union, Optional, Literal
|
||||
from openbb_core.app.utils import df_to_basemodel
|
||||
from openbb_core.app.static.filters import filter_call, filter_inputs, filter_output
|
||||
|
||||
import openbb_core.app.model.results.empty
|
||||
from openbb_core.app.model.command_output import CommandOutput
|
||||
from openbb_core.app.static.container import Container
|
||||
from openbb_core.app.static.filters import filter_call, filter_inputs, filter_output
|
||||
import pydantic.types
|
||||
import typing
|
||||
|
||||
|
||||
class CLASS_ta(Container):
|
||||
@@ -52,12 +54,12 @@ class CLASS_ta(Container):
|
||||
CommandOutput[List[Data]]
|
||||
List of data with the indicator applied.
|
||||
|
||||
Examples
|
||||
--------
|
||||
>>> from openbb import obb
|
||||
>>> stock_data = obb.stocks.load(symbol="TSLA", start_date="2023-01-01", provider="fmp")
|
||||
>>> atr_data = obb.ta.atr(data=stock_data.results)
|
||||
""" # noqa: E501
|
||||
Examples
|
||||
--------
|
||||
>>> from openbb import obb
|
||||
>>> stock_data = obb.stocks.load(symbol="TSLA", start_date="2023-01-01", provider="fmp")
|
||||
>>> atr_data = obb.ta.atr(data=stock_data.results)
|
||||
"""
|
||||
inputs = filter_inputs(
|
||||
data=data,
|
||||
index=index,
|
||||
@@ -104,12 +106,12 @@ class CLASS_ta(Container):
|
||||
CommandOutput[List[Data]]
|
||||
List of data with the indicator applied.
|
||||
|
||||
Examples
|
||||
--------
|
||||
>>> from openbb import obb
|
||||
>>> stock_data = obb.stocks.load(symbol="TSLA", start_date="2023-01-01", provider="fmp")
|
||||
>>> fib_data = obb.ta.fib(data=stock_data.results, period=120)
|
||||
""" # noqa: E501
|
||||
Examples
|
||||
--------
|
||||
>>> from openbb import obb
|
||||
>>> stock_data = obb.stocks.load(symbol="TSLA", start_date="2023-01-01", provider="fmp")
|
||||
>>> fib_data = obb.ta.fib(data=stock_data.results, period=120)
|
||||
"""
|
||||
inputs = filter_inputs(
|
||||
data=data,
|
||||
index=index,
|
||||
@@ -161,12 +163,12 @@ class CLASS_ta(Container):
|
||||
CommandOutput[List[Data]]
|
||||
List of data with the indicator applied.
|
||||
|
||||
Examples
|
||||
--------
|
||||
>>> from openbb import obb
|
||||
>>> stock_data = obb.stocks.load(symbol="TSLA", start_date="2023-01-01", provider="fmp")
|
||||
>>> obv_data = obb.ta.obv(data=stock_data.results, offset=0)
|
||||
""" # noqa: E501
|
||||
Examples
|
||||
--------
|
||||
>>> from openbb import obb
|
||||
>>> stock_data = obb.stocks.load(symbol="TSLA", start_date="2023-01-01", provider="fmp")
|
||||
>>> obv_data = obb.ta.obv(data=stock_data.results, offset=0)
|
||||
"""
|
||||
inputs = filter_inputs(
|
||||
data=data,
|
||||
index=index,
|
||||
@@ -214,12 +216,12 @@ class CLASS_ta(Container):
|
||||
CommandOutput[List[Data]]
|
||||
List of data with the indicator applied.
|
||||
|
||||
Examples
|
||||
--------
|
||||
>>> from openbb import obb
|
||||
>>> stock_data = obb.stocks.load(symbol="TSLA", start_date="2023-01-01", provider="fmp")
|
||||
>>> fisher_data = obb.ta.fisher(data=stock_data.results, length=14, signal=1)
|
||||
""" # noqa: E501
|
||||
Examples
|
||||
--------
|
||||
>>> from openbb import obb
|
||||
>>> stock_data = obb.stocks.load(symbol="TSLA", start_date="2023-01-01", provider="fmp")
|
||||
>>> fisher_data = obb.ta.fisher(data=stock_data.results, length=14, signal=1)
|
||||
"""
|
||||
inputs = filter_inputs(
|
||||
data=data,
|
||||
index=index,
|
||||
@@ -270,12 +272,12 @@ class CLASS_ta(Container):
|
||||
-------
|
||||
CommandOutput[List[Data]]
|
||||
|
||||
Examples
|
||||
--------
|
||||
>>> from openbb import obb
|
||||
>>> stock_data = obb.stocks.load(symbol="TSLA", start_date="2023-01-01", provider="fmp")
|
||||
>>> adosc_data = obb.ta.adosc(data=stock_data.results, fast=3, slow=10, offset=0)
|
||||
""" # noqa: E501
|
||||
Examples
|
||||
--------
|
||||
>>> from openbb import obb
|
||||
>>> stock_data = obb.stocks.load(symbol="TSLA", start_date="2023-01-01", provider="fmp")
|
||||
>>> adosc_data = obb.ta.adosc(data=stock_data.results, fast=3, slow=10, offset=0)
|
||||
"""
|
||||
inputs = filter_inputs(
|
||||
data=data,
|
||||
index=index,
|
||||
@@ -297,7 +299,7 @@ class CLASS_ta(Container):
|
||||
def tv(
|
||||
self, chart: bool = False
|
||||
) -> CommandOutput[openbb_core.app.model.results.empty.Empty]:
|
||||
"""TradingView.""" # noqa: E501
|
||||
"""TradingView."""
|
||||
inputs = filter_inputs(
|
||||
chart=chart,
|
||||
)
|
||||
@@ -358,14 +360,14 @@ class CLASS_ta(Container):
|
||||
CommandOutput[List[Data]]
|
||||
The calculated data.
|
||||
|
||||
Examples
|
||||
--------
|
||||
>>> from openbb import obb
|
||||
>>> stock_data = obb.stocks.load(symbol="TSLA", start_date="2023-01-01", provider="fmp")
|
||||
>>> bbands = obb.ta.bbands(
|
||||
>>> data=stock_data.results, target="close", length=50, std=2, mamode="sma", offset=0
|
||||
>>> )
|
||||
""" # noqa: E501
|
||||
Examples
|
||||
--------
|
||||
>>> from openbb import obb
|
||||
>>> stock_data = obb.stocks.load(symbol="TSLA", start_date="2023-01-01", provider="fmp")
|
||||
>>> bbands = obb.ta.bbands(
|
||||
>>> data=stock_data.results, target="close", length=50, std=2, mamode="sma", offset=0
|
||||
>>> )
|
||||
"""
|
||||
inputs = filter_inputs(
|
||||
data=data,
|
||||
target=target,
|
||||
@@ -389,7 +391,7 @@ class CLASS_ta(Container):
|
||||
def multi(
|
||||
self, chart: bool = False
|
||||
) -> CommandOutput[openbb_core.app.model.results.empty.Empty]:
|
||||
"""Plot multiple indicators on the same chart.""" # noqa: E501
|
||||
"""Plot multiple indicators on the same chart."""
|
||||
inputs = filter_inputs(
|
||||
chart=chart,
|
||||
)
|
||||
@@ -439,12 +441,12 @@ class CLASS_ta(Container):
|
||||
CommandOutput[List[Data]]
|
||||
The calculated data.
|
||||
|
||||
Examples
|
||||
--------
|
||||
>>> from openbb import obb
|
||||
>>> stock_data = obb.stocks.load(symbol="TSLA", start_date="2023-01-01", provider="fmp")
|
||||
>>> zlma_data = obb.ta.zlma(data=stock_data.results, target="close", length=50, offset=0)
|
||||
""" # noqa: E501
|
||||
Examples
|
||||
--------
|
||||
>>> from openbb import obb
|
||||
>>> stock_data = obb.stocks.load(symbol="TSLA", start_date="2023-01-01", provider="fmp")
|
||||
>>> zlma_data = obb.ta.zlma(data=stock_data.results, target="close", length=50, offset=0)
|
||||
"""
|
||||
inputs = filter_inputs(
|
||||
data=data,
|
||||
target=target,
|
||||
@@ -501,12 +503,12 @@ class CLASS_ta(Container):
|
||||
CommandOutput[List[Data]]
|
||||
The calculated data.
|
||||
|
||||
Examples
|
||||
--------
|
||||
>>> from openbb import obb
|
||||
>>> stock_data = obb.stocks.load(symbol="TSLA", start_date="2023-01-01", provider="fmp")
|
||||
>>> aroon_data = obb.ta.aroon(data=stock_data.results, length=25, scalar=100)
|
||||
""" # noqa: E501
|
||||
Examples
|
||||
--------
|
||||
>>> from openbb import obb
|
||||
>>> stock_data = obb.stocks.load(symbol="TSLA", start_date="2023-01-01", provider="fmp")
|
||||
>>> aroon_data = obb.ta.aroon(data=stock_data.results, length=25, scalar=100)
|
||||
"""
|
||||
inputs = filter_inputs(
|
||||
data=data,
|
||||
index=index,
|
||||
@@ -560,12 +562,12 @@ class CLASS_ta(Container):
|
||||
CommandOutput[List[Data]]
|
||||
The calculated data.
|
||||
|
||||
Examples
|
||||
--------
|
||||
>>> from openbb import obb
|
||||
>>> stock_data = obb.stocks.load(symbol="TSLA", start_date="2023-01-01", provider="fmp")
|
||||
>>> sma_data = obb.ta.sma(data=stock_data.results,target="close",length=50,offset=0)
|
||||
""" # noqa: E501
|
||||
Examples
|
||||
--------
|
||||
>>> from openbb import obb
|
||||
>>> stock_data = obb.stocks.load(symbol="TSLA", start_date="2023-01-01", provider="fmp")
|
||||
>>> sma_data = obb.ta.sma(data=stock_data.results,target="close",length=50,offset=0)
|
||||
"""
|
||||
inputs = filter_inputs(
|
||||
data=data,
|
||||
target=target,
|
||||
@@ -617,12 +619,12 @@ class CLASS_ta(Container):
|
||||
CommandOutput[List[Data]]
|
||||
The calculated data.
|
||||
|
||||
Examples
|
||||
--------
|
||||
>>> from openbb import obb
|
||||
>>> stock_data = obb.stocks.load(symbol="TSLA", start_date="2023-01-01", provider="fmp")
|
||||
>>> demark_data = obb.ta.demark(data=stock_data.results,offset=0)
|
||||
""" # noqa: E501
|
||||
Examples
|
||||
--------
|
||||
>>> from openbb import obb
|
||||
>>> stock_data = obb.stocks.load(symbol="TSLA", start_date="2023-01-01", provider="fmp")
|
||||
>>> demark_data = obb.ta.demark(data=stock_data.results,offset=0)
|
||||
"""
|
||||
inputs = filter_inputs(
|
||||
data=data,
|
||||
index=index,
|
||||
@@ -672,12 +674,12 @@ class CLASS_ta(Container):
|
||||
CommandOutput[List[Data]]
|
||||
The calculated data.
|
||||
|
||||
Examples
|
||||
--------
|
||||
>>> from openbb import obb
|
||||
>>> stock_data = obb.stocks.load(symbol="TSLA", start_date="2023-01-01", provider="fmp")
|
||||
>>> vwap_data = obb.ta.vwap(data=stock_data.results,anchor="D",offset=0)
|
||||
""" # noqa: E501
|
||||
Examples
|
||||
--------
|
||||
>>> from openbb import obb
|
||||
>>> stock_data = obb.stocks.load(symbol="TSLA", start_date="2023-01-01", provider="fmp")
|
||||
>>> vwap_data = obb.ta.vwap(data=stock_data.results,anchor="D",offset=0)
|
||||
"""
|
||||
inputs = filter_inputs(
|
||||
data=data,
|
||||
index=index,
|
||||
@@ -698,7 +700,7 @@ class CLASS_ta(Container):
|
||||
def recom(
|
||||
self, chart: bool = False
|
||||
) -> CommandOutput[openbb_core.app.model.results.empty.Empty]:
|
||||
"""Recommendation.""" # noqa: E501
|
||||
"""Recommendation."""
|
||||
inputs = filter_inputs(
|
||||
chart=chart,
|
||||
)
|
||||
@@ -753,12 +755,12 @@ class CLASS_ta(Container):
|
||||
CommandOutput[List[Data]]
|
||||
The calculated data.
|
||||
|
||||
Examples
|
||||
--------
|
||||
>>> from openbb import obb
|
||||
>>> stock_data = obb.stocks.load(symbol="TSLA", start_date="2023-01-01", provider="fmp")
|
||||
>>> macd_data = obb.ta.macd(data=stock_data.results,target="close",fast=12,slow=26,signal=9)
|
||||
""" # noqa: E501
|
||||
Examples
|
||||
--------
|
||||
>>> from openbb import obb
|
||||
>>> stock_data = obb.stocks.load(symbol="TSLA", start_date="2023-01-01", provider="fmp")
|
||||
>>> macd_data = obb.ta.macd(data=stock_data.results,target="close",fast=12,slow=26,signal=9)
|
||||
"""
|
||||
inputs = filter_inputs(
|
||||
data=data,
|
||||
target=target,
|
||||
@@ -811,12 +813,12 @@ class CLASS_ta(Container):
|
||||
CommandOutput[List[Data]]
|
||||
The calculated data.
|
||||
|
||||
Examples
|
||||
--------
|
||||
>>> from openbb import obb
|
||||
>>> stock_data = obb.stocks.load(symbol="TSLA", start_date="2023-01-01", provider="fmp")
|
||||
>>> hma_data = obb.ta.hma(data=stock_data.results,target="close",length=50,offset=0)
|
||||
""" # noqa: E501
|
||||
Examples
|
||||
--------
|
||||
>>> from openbb import obb
|
||||
>>> stock_data = obb.stocks.load(symbol="TSLA", start_date="2023-01-01", provider="fmp")
|
||||
>>> hma_data = obb.ta.hma(data=stock_data.results,target="close",length=50,offset=0)
|
||||
"""
|
||||
inputs = filter_inputs(
|
||||
data=data,
|
||||
target=target,
|
||||
@@ -870,12 +872,12 @@ class CLASS_ta(Container):
|
||||
CommandOutput[List[Data]]
|
||||
The calculated data.
|
||||
|
||||
Examples
|
||||
--------
|
||||
>>> from openbb import obb
|
||||
>>> stock_data = obb.stocks.load(symbol="TSLA", start_date="2023-01-01", provider="fmp")
|
||||
>>> donchian_data = obb.ta.donchian(data=stock_data.results,lower_length=20,upper_length=20,offset=0)
|
||||
""" # noqa: E501
|
||||
Examples
|
||||
--------
|
||||
>>> from openbb import obb
|
||||
>>> stock_data = obb.stocks.load(symbol="TSLA", start_date="2023-01-01", provider="fmp")
|
||||
>>> donchian_data = obb.ta.donchian(data=stock_data.results,lower_length=20,upper_length=20,offset=0)
|
||||
"""
|
||||
inputs = filter_inputs(
|
||||
data=data,
|
||||
index=index,
|
||||
@@ -911,23 +913,23 @@ class CLASS_ta(Container):
|
||||
trading signals. Ichimoku Kinko Hyo translates into "one look equilibrium chart". With
|
||||
one look, chartists can identify the trend and look for potential signals within that trend.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
data : List[Data]
|
||||
List of data to be used for the calculation.
|
||||
index : str, optional
|
||||
Index column name to use with `data`, by default "date".
|
||||
conversion : PositiveInt, optional
|
||||
Number of periods for the conversion line, by default 9.
|
||||
base : PositiveInt, optional
|
||||
Number of periods for the base line, by default 26.
|
||||
lagging : PositiveInt, optional
|
||||
Number of periods for the lagging span, by default 52.
|
||||
offset : PositiveInt, optional
|
||||
Number of periods for the offset, by default 26.
|
||||
lookahead : bool, optional
|
||||
drops the Chikou Span Column to prevent potential data leak
|
||||
""" # noqa: E501
|
||||
Parameters
|
||||
----------
|
||||
data : List[Data]
|
||||
List of data to be used for the calculation.
|
||||
index : str, optional
|
||||
Index column name to use with `data`, by default "date".
|
||||
conversion : PositiveInt, optional
|
||||
Number of periods for the conversion line, by default 9.
|
||||
base : PositiveInt, optional
|
||||
Number of periods for the base line, by default 26.
|
||||
lagging : PositiveInt, optional
|
||||
Number of periods for the lagging span, by default 52.
|
||||
offset : PositiveInt, optional
|
||||
Number of periods for the offset, by default 26.
|
||||
lookahead : bool, optional
|
||||
drops the Chikou Span Column to prevent potential data leak
|
||||
"""
|
||||
inputs = filter_inputs(
|
||||
data=data,
|
||||
index=index,
|
||||
@@ -975,12 +977,12 @@ class CLASS_ta(Container):
|
||||
CommandOutput[List[Data]]
|
||||
The calculated data.
|
||||
|
||||
Examples
|
||||
--------
|
||||
>>> from openbb import obb
|
||||
>>> stock_data = obb.stocks.load(symbol="TSLA", start_date="2023-01-01", provider="fmp")
|
||||
>>> clenow_data = obb.ta.clenow(data=stock_data.results,period=90)
|
||||
""" # noqa: E501
|
||||
Examples
|
||||
--------
|
||||
>>> from openbb import obb
|
||||
>>> stock_data = obb.stocks.load(symbol="TSLA", start_date="2023-01-01", provider="fmp")
|
||||
>>> clenow_data = obb.ta.clenow(data=stock_data.results,period=90)
|
||||
"""
|
||||
inputs = filter_inputs(
|
||||
data=data,
|
||||
index=index,
|
||||
@@ -1032,12 +1034,12 @@ class CLASS_ta(Container):
|
||||
-------
|
||||
CommandOutput[List[Data]]
|
||||
|
||||
Examples
|
||||
--------
|
||||
>>> from openbb import obb
|
||||
>>> stock_data = obb.stocks.load(symbol="TSLA", start_date="2023-01-01", provider="fmp")
|
||||
>>> ad_data = obb.ta.ad(data=stock_data.results,offset=0)
|
||||
""" # noqa: E501
|
||||
Examples
|
||||
--------
|
||||
>>> from openbb import obb
|
||||
>>> stock_data = obb.stocks.load(symbol="TSLA", start_date="2023-01-01", provider="fmp")
|
||||
>>> ad_data = obb.ta.ad(data=stock_data.results,offset=0)
|
||||
"""
|
||||
inputs = filter_inputs(
|
||||
data=data,
|
||||
index=index,
|
||||
@@ -1086,12 +1088,12 @@ class CLASS_ta(Container):
|
||||
CommandOutput[List[Data]]
|
||||
The calculated data.
|
||||
|
||||
Examples
|
||||
--------
|
||||
>>> from openbb import obb
|
||||
>>> stock_data = obb.stocks.load(symbol="TSLA", start_date="2023-01-01", provider="fmp")
|
||||
>>> adx_data = obb.ta.adx(data=stock_data.results,length=50,scalar=100.0,drift=1)
|
||||
""" # noqa: E501
|
||||
Examples
|
||||
--------
|
||||
>>> from openbb import obb
|
||||
>>> stock_data = obb.stocks.load(symbol="TSLA", start_date="2023-01-01", provider="fmp")
|
||||
>>> adx_data = obb.ta.adx(data=stock_data.results,length=50,scalar=100.0,drift=1)
|
||||
"""
|
||||
inputs = filter_inputs(
|
||||
data=data,
|
||||
index=index,
|
||||
@@ -1121,7 +1123,7 @@ class CLASS_ta(Container):
|
||||
) -> CommandOutput[typing.List]:
|
||||
"""
|
||||
A Weighted Moving Average puts more weight on recent data and less on past data.
|
||||
This is done by multiplying each bar’s price by a weighting factor. Because of its
|
||||
This is done by multiplying each bar<EFBFBD>s price by a weighting factor. Because of its
|
||||
unique calculation, WMA will follow prices more closely than a corresponding Simple
|
||||
Moving Average.
|
||||
|
||||
@@ -1143,12 +1145,12 @@ class CLASS_ta(Container):
|
||||
CommandOutput[List[Data]]
|
||||
The WMA data.
|
||||
|
||||
Examples
|
||||
--------
|
||||
>>> from openbb import obb
|
||||
>>> stock_data = obb.stocks.load(symbol="TSLA", start_date="2023-01-01", provider="fmp")
|
||||
>>> wma_data = obb.ta.wma(data=stock_data.results, target="close", length=50, offset=0)
|
||||
""" # noqa: E501
|
||||
Examples
|
||||
--------
|
||||
>>> from openbb import obb
|
||||
>>> stock_data = obb.stocks.load(symbol="TSLA", start_date="2023-01-01", provider="fmp")
|
||||
>>> wma_data = obb.ta.wma(data=stock_data.results, target="close", length=50, offset=0)
|
||||
"""
|
||||
inputs = filter_inputs(
|
||||
data=data,
|
||||
target=target,
|
||||
@@ -1193,11 +1195,11 @@ class CLASS_ta(Container):
|
||||
scalar : PositiveFloat, optional
|
||||
The scalar of the CCI, by default 0.015.
|
||||
|
||||
Returns
|
||||
-------
|
||||
CommandOutput[List[Data]]
|
||||
The CCI data.
|
||||
""" # noqa: E501
|
||||
Returns
|
||||
-------
|
||||
CommandOutput[List[Data]]
|
||||
The CCI data.
|
||||
"""
|
||||
inputs = filter_inputs(
|
||||
data=data,
|
||||
index=index,
|
||||
@@ -1252,12 +1254,12 @@ class CLASS_ta(Container):
|
||||
CommandOutput[List[Data]]
|
||||
The RSI data.
|
||||
|
||||
Examples
|
||||
--------
|
||||
>>> from openbb import obb
|
||||
>>> stock_data = obb.stocks.load(symbol="TSLA", start_date="2023-01-01", provider="fmp")
|
||||
>>> rsi_data = obb.ta.rsi(data=stock_data.results, target="close", length=14, scalar=100.0, drift=1)
|
||||
""" # noqa: E501
|
||||
Examples
|
||||
--------
|
||||
>>> from openbb import obb
|
||||
>>> stock_data = obb.stocks.load(symbol="TSLA", start_date="2023-01-01", provider="fmp")
|
||||
>>> rsi_data = obb.ta.rsi(data=stock_data.results, target="close", length=14, scalar=100.0, drift=1)
|
||||
"""
|
||||
inputs = filter_inputs(
|
||||
data=data,
|
||||
target=target,
|
||||
@@ -1280,7 +1282,7 @@ class CLASS_ta(Container):
|
||||
def summary(
|
||||
self, chart: bool = False
|
||||
) -> CommandOutput[openbb_core.app.model.results.empty.Empty]:
|
||||
"""Summary.""" # noqa: E501
|
||||
"""Summary."""
|
||||
inputs = filter_inputs(
|
||||
chart=chart,
|
||||
)
|
||||
@@ -1329,12 +1331,12 @@ class CLASS_ta(Container):
|
||||
CommandOutput[List[Data]]
|
||||
The Stochastic Oscillator data.
|
||||
|
||||
Examples
|
||||
--------
|
||||
>>> from openbb import obb
|
||||
>>> stock_data = obb.stocks.load(symbol="TSLA", start_date="2023-01-01", provider="fmp")
|
||||
>>> stoch_data = obb.ta.stoch(data=stock_data.results, fast_k_period=14, slow_d_period=3, slow_k_period=3)
|
||||
""" # noqa: E501
|
||||
Examples
|
||||
--------
|
||||
>>> from openbb import obb
|
||||
>>> stock_data = obb.stocks.load(symbol="TSLA", start_date="2023-01-01", provider="fmp")
|
||||
>>> stoch_data = obb.ta.stoch(data=stock_data.results, fast_k_period=14, slow_d_period=3, slow_k_period=3)
|
||||
"""
|
||||
inputs = filter_inputs(
|
||||
data=data,
|
||||
index=index,
|
||||
@@ -1356,7 +1358,7 @@ class CLASS_ta(Container):
|
||||
def rsp(
|
||||
self, chart: bool = False
|
||||
) -> CommandOutput[openbb_core.app.model.results.empty.Empty]:
|
||||
"""Relative Strength Performance.""" # noqa: E501
|
||||
"""Relative Strength Performance."""
|
||||
inputs = filter_inputs(
|
||||
chart=chart,
|
||||
)
|
||||
@@ -1407,12 +1409,12 @@ class CLASS_ta(Container):
|
||||
CommandOutput[List[Data]]
|
||||
The Keltner Channels data.
|
||||
|
||||
Examples
|
||||
--------
|
||||
>>> from openbb import obb
|
||||
>>> stock_data = obb.stocks.load(symbol="TSLA", start_date="2023-01-01", provider="fmp")
|
||||
>>> kc_data = obb.ta.kc(data=stock_data.results, length=20, scalar=20, ma_mode="ema", offset=0)
|
||||
""" # noqa: E501
|
||||
Examples
|
||||
--------
|
||||
>>> from openbb import obb
|
||||
>>> stock_data = obb.stocks.load(symbol="TSLA", start_date="2023-01-01", provider="fmp")
|
||||
>>> kc_data = obb.ta.kc(data=stock_data.results, length=20, scalar=20, ma_mode="ema", offset=0)
|
||||
"""
|
||||
inputs = filter_inputs(
|
||||
data=data,
|
||||
index=index,
|
||||
@@ -1460,12 +1462,12 @@ class CLASS_ta(Container):
|
||||
CommandOutput[List[Data]]
|
||||
The COG data.
|
||||
|
||||
Examples
|
||||
--------
|
||||
>>> from openbb import obb
|
||||
>>> stock_data = obb.stocks.load(symbol="TSLA", start_date="2023-01-01", provider="fmp")
|
||||
>>> cg_data = obb.ta.cg(data=stock_data.results, length=14)
|
||||
""" # noqa: E501
|
||||
Examples
|
||||
--------
|
||||
>>> from openbb import obb
|
||||
>>> stock_data = obb.stocks.load(symbol="TSLA", start_date="2023-01-01", provider="fmp")
|
||||
>>> cg_data = obb.ta.cg(data=stock_data.results, length=14)
|
||||
"""
|
||||
inputs = filter_inputs(
|
||||
data=data,
|
||||
index=index,
|
||||
@@ -1543,12 +1545,12 @@ class CLASS_ta(Container):
|
||||
CommandOutput[List[Data]]
|
||||
The cones data.
|
||||
|
||||
Examples
|
||||
--------
|
||||
>>> from openbb import obb
|
||||
>>> stock_data = obb.stocks.load(symbol="TSLA", start_date="2023-01-01", provider="fmp")
|
||||
>>> cones_data = obb.ta.cones(data=stock_data.results, lower_q=0.25, upper_q=0.75, model="STD")
|
||||
""" # noqa: E501
|
||||
Examples
|
||||
--------
|
||||
>>> from openbb import obb
|
||||
>>> stock_data = obb.stocks.load(symbol="TSLA", start_date="2023-01-01", provider="fmp")
|
||||
>>> cones_data = obb.ta.cones(data=stock_data.results, lower_q=0.25, upper_q=0.75, model="STD")
|
||||
"""
|
||||
inputs = filter_inputs(
|
||||
data=data,
|
||||
index=index,
|
||||
@@ -1611,7 +1613,7 @@ class CLASS_ta(Container):
|
||||
>>> stock_data = obb.stocks.load(symbol="TSLA", start_date="2023-01-01", provider="fmp")
|
||||
>>> ema_data = obb.ta.ema(data=stock_data.results,target="close",length=50,offset=0)
|
||||
|
||||
""" # noqa: E501
|
||||
"""
|
||||
inputs = filter_inputs(
|
||||
data=data,
|
||||
target=target,
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
"""Options Chains data model."""
|
||||
|
||||
from datetime import datetime
|
||||
|
||||
from pydantic import Field
|
||||
|
||||
from openbb_provider.abstract.data import Data
|
||||
from openbb_provider.abstract.query_params import QueryParams
|
||||
from openbb_provider.models.base import BaseSymbol
|
||||
|
||||
|
||||
class OptionsChainsQueryParams(QueryParams, BaseSymbol):
|
||||
"""Options Chains Query Params"""
|
||||
|
||||
|
||||
class OptionsChainsData(Data):
|
||||
"""Options Chains Data."""
|
||||
|
||||
expiration: datetime = Field(description="The expiration date of the contract.")
|
||||
strike: float = Field(description="The strike price of the contract.")
|
||||
optionType: str = Field(description="Call or Put.")
|
||||
bid: float = Field(description="The bid price of the contract.")
|
||||
ask: float = Field(description="The ask price of the contract.")
|
||||
openInterest: float = Field(description="The open interest on the contract.")
|
||||
volume: float = Field(description="The current trading volume on the contract.")
|
||||
@@ -0,0 +1,38 @@
|
||||
"""Stock Info data model."""
|
||||
|
||||
from typing import Optional
|
||||
|
||||
from pydantic import Field
|
||||
|
||||
from openbb_provider.abstract.data import Data
|
||||
from openbb_provider.abstract.query_params import QueryParams
|
||||
from openbb_provider.models.base import BaseSymbol
|
||||
|
||||
|
||||
class StockInfoQueryParams(QueryParams, BaseSymbol):
|
||||
"""Stock Info Query Params"""
|
||||
|
||||
|
||||
class StockInfoData(Data):
|
||||
"""Stock Info Data."""
|
||||
|
||||
symbol: str = Field(description="The ticker symbol.")
|
||||
name: str = Field(description="The name associated with the ticker symbol.")
|
||||
price: float = Field(description="The last price of the stock.")
|
||||
open: Optional[float] = Field(description="The opening price of the stock.")
|
||||
high: Optional[float] = Field(
|
||||
description="The high price of the current trading day."
|
||||
)
|
||||
low: Optional[float] = Field(
|
||||
description="The low price of the current trading day."
|
||||
)
|
||||
close: Optional[float] = Field(description="The closing price of the stock.")
|
||||
change: Optional[float] = Field(
|
||||
description="The change in price over the current trading period."
|
||||
)
|
||||
change_percent: Optional[float] = Field(
|
||||
description="The % change in price over the current trading period."
|
||||
)
|
||||
previous_close: Optional[float] = Field(
|
||||
description="The previous closing price of the stock."
|
||||
)
|
||||
@@ -0,0 +1,22 @@
|
||||
"""Stock Search data model."""
|
||||
|
||||
from pydantic import Field
|
||||
|
||||
from openbb_provider.abstract.data import Data
|
||||
from openbb_provider.abstract.query_params import QueryParams
|
||||
|
||||
|
||||
class StockSearchQueryParams(QueryParams):
|
||||
"""Company Search Query Params"""
|
||||
|
||||
query: str = Field(description="The search query.", default="")
|
||||
ticker: bool = Field(
|
||||
description="Whether to search by ticker symbol.", default=False
|
||||
)
|
||||
|
||||
|
||||
class StockSearchData(Data):
|
||||
"""Company Search Data."""
|
||||
|
||||
symbol: str = Field(description="The ticker symbol of the company.")
|
||||
name: str = Field(description="The name of the company.")
|
||||
Reference in New Issue
Block a user