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:
Pratyush Shukla
2023-08-11 00:48:03 +05:30
committed by GitHub
parent 9afe9fde22
commit e7179c8bf0
37 changed files with 2593 additions and 589 deletions

View File

@@ -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())

View File

@@ -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
View File

@@ -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
View 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 .
```

View 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,
},
)

View 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

View 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

View 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

View 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

File diff suppressed because one or more lines are too long

View 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
View 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"

View 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"

View File

11
openbb_sdk/providers/yfinance/README.md vendored Normal file
View 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 .
```

View 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,
},
)

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View 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"
]

View 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"

View File

View File

@@ -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]

View File

@@ -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(

View File

@@ -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",

View File

@@ -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

View File

@@ -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

View File

@@ -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(

View File

@@ -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,

View File

@@ -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.")

View File

@@ -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."
)

View File

@@ -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.")