Skip to content

Commit

Permalink
Add derivatives extension for futures and options (#5742)
Browse files Browse the repository at this point in the history
* removed options and futures

* add derivatives extension

* cleanup
  • Loading branch information
the-praxs authored and piiq committed Nov 17, 2023
1 parent beed795 commit 3060093
Show file tree
Hide file tree
Showing 21 changed files with 631 additions and 615 deletions.
2 changes: 1 addition & 1 deletion openbb_platform/dev_install.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
openbb-crypto = { path = "./extensions/crypto", develop = true }
openbb-currency = { path = "./extensions/currency", develop = true }
openbb-derivatives = { path = "./extensions/derivatives", develop = true }
openbb-economy = { path = "./extensions/economy", develop = true }
openbb-equity = { path = "./extensions/equity", develop = true }
openbb-etf = { path = "./extensions/etf", develop = true }
Expand All @@ -52,7 +53,6 @@
openbb-charting = { path = "./extensions/charting", optional = true, develop = true }
openbb-econometrics = { path = "./extensions/econometrics", optional = true, develop = true }
openbb-futures = { path = "./extensions/futures", optional = true, develop = true }
openbb-quantitative = { path = "./extensions/quantitative", optional = true, develop = true }
openbb-technical = { path = "./extensions/technical", optional = true, develop = true }
"""
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
# Futures data extension for OpenBB Platform
# OpenBB Derivatives Extension

This extension provides a set of commands for futures data retrieval.
This extension provides derivatives data for the OpenBB Platform.

## Installation

To install the extension, run the following command in this folder:

```bash
pip install openbb-futures
pip install openbb-derivatives
```

For development please check [Contribution Guidelines](https://github.com/OpenBB-finance/OpenBBTerminal/blob/develop/openbb_platform/CONTRIBUTING.md).

Documentation available [here](https://docs.openbb.co/platform).
Documentation available [here](https://docs.openbb.co/sdk).
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
"""API integration tests for the derivatives extension."""

import pytest
import requests
from openbb_provider.utils.helpers import get_querystring

# pylint: disable=too-many-lines,redefined-outer-name


@pytest.fixture(scope="session")
def headers():
return {}


@pytest.mark.parametrize(
"params",
[
({"provider": "intrinio", "symbol": "AAPL", "date": "2023-01-25"}),
({"provider": "cboe", "symbol": "AAPL"}),
],
)
@pytest.mark.integration
def test_derivatives_options_chains(params, headers):
params = {p: v for p, v in params.items() if v}

query_str = get_querystring(params, [])
url = f"http://0.0.0.0:8000/api/v1/derivatives/options/chains?{query_str}"
result = requests.get(url, headers=headers, timeout=10)
assert isinstance(result, requests.Response)
assert result.status_code == 200


@pytest.mark.parametrize(
"params",
[
({"symbol": "AAPL"}),
({"provider": "intrinio", "source": "delayed", "symbol": "AAPL"}),
({"provider": "intrinio", "symbol": "PLTR", "source": "delayed"}),
],
)
@pytest.mark.integration
def test_derivatives_options_unusual(params, headers):
params = {p: v for p, v in params.items() if v}

query_str = get_querystring(params, [])
url = f"http://0.0.0.0:8000/api/v1/derivatives/options/unusual?{query_str}"
result = requests.get(url, headers=headers, timeout=10)
assert isinstance(result, requests.Response)
assert result.status_code == 200


@pytest.mark.parametrize(
"params",
[
(
{
"provider": "yfinance",
"symbol": "ES",
"start_date": "2023-01-01",
"end_date": "2023-06-06",
"expiration": "2024-06",
}
),
(
{
"provider": "yfinance",
"interval": "1d",
"period": "max",
"prepost": True,
"adjust": True,
"back_adjust": True,
"symbol": "ES",
"start_date": "2023-01-01",
"end_date": "2023-06-06",
"expiration": "2024-06",
}
),
],
)
@pytest.mark.integration
def test_derivatives_futures_historical(params, headers):
params = {p: v for p, v in params.items() if v}

query_str = get_querystring(params, [])
url = f"http://0.0.0.0:8000/api/v1/derivatives/futures/historical?{query_str}"
result = requests.get(url, headers=headers, timeout=10)
assert isinstance(result, requests.Response)
assert result.status_code == 200


@pytest.mark.parametrize(
"params",
[
({"provider": "cboe", "symbol": "VXM", "date": "2023-01-25"}),
({"provider": "yfinance", "symbol": "ES", "date": "2023-08-01"}),
],
)
@pytest.mark.integration
def test_derivatives_futures_curve(params, headers):
params = {p: v for p, v in params.items() if v}

query_str = get_querystring(params, [])
url = f"http://0.0.0.0:8000/api/v1/derivatives/futures/curve?{query_str}"
result = requests.get(url, headers=headers, timeout=30)
assert isinstance(result, requests.Response)
assert result.status_code == 200
Original file line number Diff line number Diff line change
@@ -1,18 +1,53 @@
"""Test futures extension."""
"""Python interface integration tests for the derivatives extension."""

import pytest
from openbb_core.app.model.obbject import OBBject

# pylint: disable=too-many-lines,redefined-outer-name
# pylint: disable=import-outside-toplevel,inconsistent-return-statements


@pytest.fixture(scope="session")
def obb(pytestconfig):
"""Fixture to setup obb."""

if pytestconfig.getoption("markexpr") != "not integration":
import openbb

return openbb.obb


@pytest.mark.parametrize(
"params",
[
({"symbol": "AAPL"}),
({"provider": "intrinio", "symbol": "AAPL", "date": "2023-01-25"}),
({"provider": "cboe", "symbol": "AAPL"}),
],
)
@pytest.mark.integration
def test_derivatives_options_chains(params, obb):
result = obb.derivatives.options.chains(**params)
assert result
assert isinstance(result, OBBject)
assert len(result.results) > 0


@pytest.mark.parametrize(
"params",
[
({"symbol": "AAPL"}),
({"provider": "intrinio", "source": "delayed", "symbol": "AAPL"}),
({"provider": "intrinio", "symbol": "PLTR", "source": "delayed"}),
],
)
@pytest.mark.integration
def test_derivatives_options_unusual(params, obb):
result = obb.derivatives.options.unusual(**params)
assert result
assert isinstance(result, OBBject)
assert len(result.results) > 0


@pytest.mark.parametrize(
"params",
[
Expand All @@ -26,12 +61,12 @@ def obb(pytestconfig):
),
(
{
"provider": "yfinance",
"interval": "1d",
"period": "max",
"prepost": True,
"adjust": True,
"back_adjust": True,
"provider": "yfinance",
"symbol": "ES",
"start_date": "2023-05-05",
"end_date": "2023-06-06",
Expand All @@ -41,8 +76,8 @@ def obb(pytestconfig):
],
)
@pytest.mark.integration
def test_futures_load(params, obb):
result = obb.futures.load(**params)
def test_derivatives_futures_historical(params, obb):
result = obb.derivatives.futures.historical(**params)
assert result
assert isinstance(result, OBBject)
assert len(result.results) > 0
Expand All @@ -57,8 +92,8 @@ def test_futures_load(params, obb):
],
)
@pytest.mark.integration
def test_futures_curve(params, obb):
result = obb.futures.curve(**params)
def test_derivatives_futures_curve(params, obb):
result = obb.derivatives.futures.curve(**params)
assert result
assert isinstance(result, OBBject)
assert len(result.results) > 0
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
"""Derivatives Router."""

from openbb_core.app.router import Router

from openbb_derivatives.futures.futures_router import router as futures_router
from openbb_derivatives.options.options_router import router as options_router

router = Router(prefix="")
router.include_router(options_router)
router.include_router(futures_router)
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
"""Futures."""
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
"""Futures Router."""

from openbb_core.app.model.command_context import CommandContext
from openbb_core.app.model.obbject import OBBject
from openbb_core.app.provider_interface import (
Expand All @@ -9,12 +11,12 @@
from openbb_core.app.router import Router
from pydantic import BaseModel

router = Router(prefix="")
router = Router(prefix="/futures")


# pylint: disable=unused-argument
@router.command(model="FuturesHistorical")
def load(
def historical(
cc: CommandContext,
provider_choices: ProviderChoices,
standard_params: StandardParams,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
"""Options."""
Loading

0 comments on commit 3060093

Please sign in to comment.