Files
OpenBB/openbb_terminal/stocks/options/fdscanner_model.py
Henrique Joaquim a37d9032e3 Hotfix/fix black (#4101)
* Fix plot look when using eval and add query to choices (#3881)

* convert index to datetime and update choices

* uncomment economy integration test

* fix treasury concat bug

* fix datasets concat on duplciates

* Lock ruff version so that new lints dont break our CI (#3905)

* Lock ruff version so that new lints dont break our CI

* Bumped pre-commit ruff version

* returning always a dataframe

* Revert "returning always a dataframe"

This reverts commit d5dbf3132f.

* black everything

---------
2023-02-01 12:33:15 +00:00

93 lines
2.4 KiB
Python

"""FDScanner model"""
__docformat__ = "numpy"
import logging
from typing import Tuple
import numpy as np
import pandas as pd
from openbb_terminal.decorators import log_start_end
from openbb_terminal.helper_funcs import get_user_agent, request
from openbb_terminal.rich_config import console
logger = logging.getLogger(__name__)
@log_start_end(log=logger)
def unusual_options(limit: int = 100) -> Tuple[pd.DataFrame, pd.Timestamp]:
"""Get unusual option activity from fdscanner.com
Parameters
----------
limit: int
Number to show
Returns
-------
Tuple[pd.DataFrame, pd.Timestamp]
Dataframe containing options information, Timestamp indicated when data was updated from website
Examples
--------
>>> from openbb_terminal.sdk import openbb
>>> unu_df = openbb.stocks.options.unu()
"""
pages = np.arange(0, limit // 20 + 1)
data_list = []
for page_num in pages:
r = request(
f"https://app.fdscanner.com/api2/unusualvolume?p=0&page_size=20&page={int(page_num)}",
headers={"User-Agent": get_user_agent()},
)
if r.status_code != 200:
console.print("Error in fdscanner request")
return pd.DataFrame(), "request error"
data_list.append(r.json())
ticker, expiry, option_strike, option_type, ask, bid, oi, vol, voi = (
[],
[],
[],
[],
[],
[],
[],
[],
[],
)
for data in data_list:
for entry in data["data"]:
ticker.append(entry["tk"])
expiry.append(entry["expiry"])
option_strike.append(float(entry["s"]))
option_type.append("Put" if entry["t"] == "P" else "Call")
ask.append(entry["a"])
bid.append(entry["b"])
oi.append(entry["oi"])
vol.append(entry["v"])
voi.append(entry["vol/oi"])
# Subtract an hour to align with NYSE timezone
last_updated = pd.to_datetime(
data_list[-1]["last_updated"], unit="s"
) - pd.Timedelta(hours=5)
df = pd.DataFrame(
{
"Ticker": ticker,
"Exp": expiry,
"Strike": option_strike,
"Type": option_type,
"Vol/OI": voi,
"Vol": vol,
"OI": oi,
"Bid": bid,
"Ask": ask,
}
)
return df, last_updated