Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add derivatives extension for futures and options #5742

Merged
merged 3 commits into from
Nov 16, 2023
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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,13 +1,13 @@
# 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/feature/openbb-sdk-v4/openbb_platform/CONTRIBUTING.md).
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
"""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": None, "source": "delayed"}),
({"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,54 @@
"""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": None, "source": "delayed"}),
({"provider": "intrinio", "symbol": "PLTR", "source": "delayed"}),
the-praxs marked this conversation as resolved.
Show resolved Hide resolved
],
)
@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 +62,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 +77,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 +93,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
Loading