Files
OpenBB/tests/openbb_terminal/stocks/options/test_cboe_model.py
Danglewood a7edda330d Feature/options - OpenBB Options Enhancement Proposal (Part 1 - SDK) (#5079)
* add model file for Montreal Options Exchange

* mypy fixes

* define attributes under __init__

* type error fix

* another pylint fix

* adds tests for tmx_model

* black

* mypy

* adds expirations test and re-records

* black

* capture error message in test

* mypy

* add __docformat__ line

* improves get_all_ticker_symbols

* removes python magic command for new cell

* adds TMX as source for SDK chains

* starts on a new method for loading options data returning a standardized object

* add load_options as SDK endpoint

* intrinio response - not complete

* adds tradier to load_options

* add source attribute to options object

* restore legacy nasdaq last price function

* yFinance underlying_price fixes

* yFinance model fix

* adds cboe to sdk options load

* table fix

* creates options_chains_model.py and updates SDK map

* docstrings added for the class.

* updates tmx_model tests

* fix options_controller test

* adds cboe_model tests

* spelling in docstring

* ruff - unused import

* mypy fixes

* more mypy fixes

* pylint

* attempt to manually resolve merge conflict.

* nasdaq_model fix

* adds test coverage for options/nasdaq_model

* docstrings update for nasdaq_model

* mypy fix

* adds unit testing for options_chains_model

* adds additional tests for intrinio_model

* unused import fix

* fix for .TO symbol and TMX EOD chains

* make CBOE Pydantic

* cboe update

* adds switch for pydantic output from all sources

* black

* index options error handling for Intrinio

* add warning message for index options from Intrinio

* tmx_model enhancements

* cleans up get_ticker_iv() in cboe_model

* fix ticker info for index symbols from cboe

* typo in comments

* adds test for tradier_model.load_options

* cboe optionType as lower case

* add function for calculating chains stats

* black

* trailmap for calculate_chains_stats

* adds test for calculate_stats()

* more details to nasdaq.underlying_price

* typo in docstrings

* mypy - options_chains_model.py

* black - options_chains_model.py

* pylint options_chains_model.py

* standardize response from intrinio underlying price

* add function to validate input of function

* missed type hint

* additional error handling for stats

* adds DTE as column for all sources

* adds strategies function and input validation

* add yFinance test for load_options()

* add Nasdaq test for load_options()

* tests for new functions in options_chains_model

* update sdk trailmap

* rewrite tests

* fixes for tests

* fix tmx_model test

* more pytest

* pytest..

* add vertical call spread function

* some cleanup

* update nasdaq tests

* more cleanup

* black

* pylint

* black

* ruff

* black

* pylint

* black

* pylint..

* tests rewrite

* more pytest

* recapture tests

* Different tests were collected between gw1 and gw0

* adds vertical spreads

* vertical_put_spread

* improve calculate_stats

* mypy

* edge cases

* black

* update tmx,yfinance tests

* new cboe tests

* new tmx_model tests

* fix nasdaq test

* test updates

* fix nasdaq tests

* add test_options_chains_model

* refactor data sources

* black

* pylint

* fixing stuff

* forgot a file..

* codespell

* linting

* mypy...

* refactor OptionsChains class

* pylint

* reconfigure SDK entry point

* fix error handling when data request fails

* ruff

* pylint

* pylint

* Add inheritance and a repr string

* add method for skew

* add method for skew

* fix nasdaq test

* add skew to tests

---------

Co-authored-by: James Maslek <jmaslek11@gmail.com>
2023-06-19 13:11:16 +00:00

83 lines
2.3 KiB
Python

# IMPORTATION STANDARD
# IMPORTATION THIRDPARTY
import pandas as pd
import pytest
# IMPORTATION INTERNAL
from openbb_terminal.stocks.options import cboe_model
@pytest.mark.vcr
def test_symbol_directory():
result_df = cboe_model.get_cboe_directory()
assert isinstance(result_df, pd.DataFrame)
assert not result_df.empty
@pytest.mark.vcr
def test_underlying_price():
result_df = cboe_model.load_options("QQQ")
hasattr(result_df, "underlying_price")
assert isinstance(result_df.underlying_price, pd.Series)
assert isinstance(result_df.underlying_price["price"], float)
@pytest.mark.vcr
@pytest.mark.record_stdout
def test_underlying_price_bad_symbol():
data = cboe_model.load_options("BAD_SYMBOL")
assert hasattr(data, "underlying_name") is False
@pytest.mark.vcr
def test_underlying_name():
ticker = cboe_model.load_options("SPX")
assert hasattr(ticker, "underlying_name")
assert isinstance(ticker.underlying_name, str)
assert ticker.underlying_name == "SPX"
@pytest.mark.vcr
def test_last_price():
ticker = cboe_model.load_options("AAPL")
assert hasattr(ticker, "last_price")
assert isinstance(ticker.last_price, float)
assert ticker.last_price == ticker.underlying_price["price"]
@pytest.mark.vcr
def test_chains():
ticker = cboe_model.load_options("JPM")
assert hasattr(ticker, "chains")
assert ticker.symbol == "JPM"
assert isinstance(ticker.chains, pd.DataFrame)
assert ticker.expirations[0] == ticker.chains["expiration"][0]
@pytest.mark.vcr
def test_strikes():
ticker = cboe_model.load_options("TSLA")
results_df = ticker
assert hasattr(results_df, "strikes")
assert isinstance(results_df.strikes, list)
assert isinstance(results_df.strikes[0], float)
assert len(results_df.strikes) > 1
@pytest.mark.vcr
def test_expirations():
ticker = cboe_model.load_options("OXY")
assert hasattr(ticker, "expirations")
assert isinstance(ticker.expirations, list)
assert isinstance(ticker.expirations[0], str)
assert ticker.expirations[0] == ticker.chains["expiration"].iloc[0]
@pytest.mark.vcr
def test_hasGreeks_hasIV():
ticker = cboe_model.load_options("TSLA")
assert ticker.underlying_name != "TSLA"
assert ticker.hasGreeks is True
assert ticker.hasIV is True