summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorColin Delahunty <72827203+colin99d@users.noreply.github.com>2022-08-02 08:46:18 -0400
committerGitHub <noreply@github.com>2022-08-02 08:46:18 -0400
commit7494059fc14006b11d39ecc7c54e2a687d6c7aea (patch)
treee533d3d07ef921c4f9298ff8a4672b9066fade2b
parent413360b1bcc4973e03d18f58c7d1f20cdb068fc0 (diff)
Futures Dashboard (#2188)
* Added futures dashboard * Got a semi working prototype * Updated csv * Improved UI and data gathering * Got a working prototype * Updated title * Added description for futures * Fixed tests
-rw-r--r--custom_imports/dashboards/futures.csv146
-rw-r--r--i18n/en.yml1
-rw-r--r--openbb_terminal/dashboards/dashboards_controller.py7
-rw-r--r--openbb_terminal/dashboards/futures.ipynb288
-rw-r--r--openbb_terminal/reports/widget_helpers.py3
-rw-r--r--openbb_terminal/stocks/government/quiverquant_view.py26
-rw-r--r--tests/openbb_terminal/portfolio/csv/test_portfolio_model/test_tracking_error.csv4
-rw-r--r--tests/openbb_terminal/stocks/government/txt/test_quiverquant_view/test_call_func[display_contracts-kwargs_dict5].txt1
-rw-r--r--tests/openbb_terminal/stocks/government/txt/test_quiverquant_view/test_call_func[display_government_buys-kwargs_dict1].txt1
-rw-r--r--tests/openbb_terminal/stocks/government/txt/test_quiverquant_view/test_call_func[display_government_sells-kwargs_dict2].txt1
-rw-r--r--tests/openbb_terminal/stocks/government/txt/test_quiverquant_view/test_call_func[display_hist_contracts-kwargs_dict8].txt1
-rw-r--r--tests/openbb_terminal/stocks/government/txt/test_quiverquant_view/test_call_func[display_last_contracts-kwargs_dict3].txt1
-rw-r--r--tests/openbb_terminal/stocks/government/txt/test_quiverquant_view/test_call_func[display_last_government-kwargs_dict0].txt1
-rw-r--r--tests/openbb_terminal/stocks/government/txt/test_quiverquant_view/test_call_func[display_qtr_contracts-kwargs_dict6].txt1
-rw-r--r--tests/openbb_terminal/stocks/government/txt/test_quiverquant_view/test_call_func[display_qtr_contracts-kwargs_dict7].txt1
-rw-r--r--tests/openbb_terminal/stocks/government/txt/test_quiverquant_view/test_call_func[display_top_lobbying-kwargs_dict9].txt1
16 files changed, 466 insertions, 18 deletions
diff --git a/custom_imports/dashboards/futures.csv b/custom_imports/dashboards/futures.csv
new file mode 100644
index 00000000000..dfabf347f92
--- /dev/null
+++ b/custom_imports/dashboards/futures.csv
@@ -0,0 +1,146 @@
+Ticker,Description,Exchange,Category
+YI=F,"1,000 oz Mini Silver",NYB,Commodities
+ALI=F,Aluminum ,CMX,Commodities
+BLK=F,Block Cheese ,CME,Commodities
+AW=F,Bloomberg Commodity Index ,CBT,Commodities
+BZ=F,Brent Crude Oil Last Day Finance,NYM,Commodities
+BZT=F,Brent Crude Oil Last Day ,NYM,Commodities
+CB=F,Cash-Settled Butter ,CME,Commodities
+CSC=F,Cash-Settled Cheese ,CME,Commodities
+GEO=F,CBL Global Emissions Offset ,NYM,Commodities
+ZW=F,Chicago SRW Wheat ,CBT,Commodities
+ZWT=F,Chicago SRW Wheat TAS,CBT,Commodities
+DC=F,Class III Milk ,CME,Commodities
+GDK=F,Class IV Milk ,CME,Commodities
+HG0=F,Copper Spot TAS ,CMX,Commodities
+HGT=F,Copper TAS ,CMX,Commodities
+ZC=F,Corn ,CBT,Commodities
+ZCT=F,Corn TAS ,CBT,Commodities
+CLT=F,Crude Oil TAS ,NYM,Commodities
+DY=F,Dry Whey ,CME,Commodities
+QC=F,E-mini Copper ,CMX,Commodities
+QM=F,E-mini Crude Oil,NYM,Commodities
+XAE=F,E-mini Energy Select Sector ,CME,Commodities
+QO=F,E-mini Gold ,CMX,Commodities
+QG=F,E-mini Natural Gas,NYM,Commodities
+QH=F,E-mini NY Harbor ULSD,NYM,Commodities
+QU=F,E-mini RBOB Gasoline,NYM,Commodities
+QI=F,E-mini Silver,CMX,Commodities
+GF=F,Feeder Cattle,CME,Commodities
+GFT=F,Feeder Cattle TAS ,CME,Commodities
+GCT=F,Gold TAS ,CMX,Commodities
+KE=F,KC HRW Wheat ,CBT,Commodities
+KET=F,KC HRW Wheat TAS,CBT,Commodities
+HE=F,Lean Hogs ,CME,Commodities
+HET=F,Lean Hogs TAS ,CME,Commodities
+LE=F,Live Cattle ,CME,Commodities
+LET=F,Live Cattle TAS ,CME,Commodities
+MHG=F,Micro Copper ,CMX,Commodities
+MGC=F,Micro Gold ,CMX,Commodities
+SIL=F,Micro Silver ,CMX,Commodities
+MCL=F,Micro WTI Crude Oil ,NYM,Commodities
+YG=F,Mini Gold - ICUS ,NYB,Commodities
+XK=F,Mini Soybean ,CBT,Commodities
+XC=F,Mini Corn ,CBT,Commodities
+XW=F,Mini Chicago SRW Wheat,CBT,Commodities
+GNF=F,Nonfat Dry Milk,CME,Commodities
+ZO=F,Oats,CBT,Commodities
+PRK=F,Pork Cutout ,CME,Commodities
+RBT=F,RBOB Gasoline TAS ,NYM,Commodities
+ZR=F,Rough Rice ,CBT,Commodities
+GD=F,S&P GSCI Commodity Index ,CME,Commodities
+SIT=F,Silver TAS ,CMX,Commodities
+ZS=F,Soybean ,CBT,Commodities
+ZM=F,Soybean Meal ,CBT,Commodities
+ZMT=F,Soybean Meal TAS ,CBT,Commodities
+ZL=F,Soybean Oil ,CBT,Commodities
+ZLT=F,Soybean Oil TAS ,CBT,Commodities
+SBT=F,Soybean TAS ,CBT,Commodities
+ZN=F,10-Year T-Note ,CBT,Credit
+N1U=F,10-Year USD MAC Swap,CBT,Credit
+TWE=F,20-Year U.S. Treasury Bond,CBT,Credit
+ZT=F,2-Year T-Note ,CBT,Credit
+F1U=F,5-Year USD MAC Swap ,CBT,Credit
+RX=F,Dow Jones Real Estate,CBT,Credit
+GE=F,Eurodollar ,CME,Credit
+ZF=F,Five-Year US Treasury Note,CBT,Credit
+10Y=F,Micro 10-Year Yield ,CBT,Credit
+2YY=F,Micro 2-Year Yield ,CBT,Credit
+30Y=F,Micro 30-Year Yield ,CBT,Credit
+5YY=F,Micro 5-Year Yield ,CBT,Credit
+SR1=F,One-Month SOFR ,CME,Credit
+ZFT=F,TAS on 5-Year Treasury Note ,CBT,Credit
+ZQ=F,Thirty-Day Fed Fund ,CBT,Credit
+Z3N=F,Three Year Treasury Note ,CBT,Credit
+SR3=F,Three-Month SOFR,CME,Credit
+ZB=F,U.S. Treasury Bond,CBT,Credit
+UB=F,Ultra U.S. Treasury Bond ,CBT,Credit
+BTM=F,Bakkt BTC (USD) Monthly ,NYB,Crypto
+BTC=F,Bitcoin ,CME,Crypto
+ETH=F,Ether ,CME,Crypto
+MBT=F,Micro Bitcoin ,CME,Crypto
+MET=F,Micro Ether ,CME,Crypto
+6A=F,Australian Dollar ,CME,Forex
+6L=F,Brazilian Real ,CME,Forex
+6B=F,British Pound ,CME,Forex
+PJY=F,British Pound/Japanese Yen,CME,Forex
+PSF=F,British Pound/Swiss Franc ,CME,Forex
+6C=F,Canadian Dollar,CME,Forex
+E7=F,E-mini Euro FX ,CME,Forex
+J7=F,E-mini Japanese Yen ,CME,Forex
+6E=F,Euro FX ,CME,Forex
+EAD=F,Euro/Australian Dollar,CME,Forex
+RP=F,Euro/British Pound,CME,Forex
+ECD=F,Euro/Canadian Dollar,CME,Forex
+RY=F,Euro/Japanese Yen,CME,Forex
+ENK=F,Euro/Norwegian Krone,CME,Forex
+ESK=F,Euro/Swedish Krona,CME,Forex
+RF=F,Euro/Swiss Franc,CME,Forex
+SIR=F,Indian Rupee/USD,CME,Forex
+6J=F,Japanese Yen ,CME,Forex
+KRW=F,Korean Won ,CME,Forex
+6M=F,Mexican Peso ,CME,Forex
+M6A=F,Micro AUD/USD ,CME,Forex
+MCD=F,Micro CAD/USD ,CME,Forex
+MSF=F,Micro CHF/USD ,CME,Forex
+M6E=F,Micro EUR/USD ,CME,Forex
+M6B=F,Micro GBP/USD ,CME,Forex
+MIR=F,Micro INR/USD ,CME,Forex
+M6C=F,Micro USD/CAD ,CME,Forex
+M6J=F,Micro USD/JPY ,CME,Forex
+6N=F,New Zealand Dollar,CME,Forex
+NKD=F,Nikkei/USD ,CME,Forex
+NIY=F,Nikkei/Yen ,CME,Forex
+NOK=F,Norwegian Krone,CME,Forex
+6R=F,Russian Ruble ,CME,Forex
+6Z=F,South African Rand,CME,Forex
+SEK=F,Swedish Krona ,CME,Forex
+6S=F,Swiss Franc ,CME,Forex
+SJY=F,Swiss Franc/Japanese Yen ,CME,Forex
+TPY=F,Yen Denominated TOPIX,CME,Stock Indicies
+YMT=F,BTIC E-mini DJIA,CBT,Stock Indicies
+NQT=F,BTIC E-mini Nasdaq-100,CME,Stock Indicies
+EST=F,BTIC E-mini S&P 500 ,CME,Stock Indicies
+XAF=F,E-mini Financial Select Sector,CME,Stock Indicies
+RS1=F,E-mini Russell 1000 Index ,CME,Stock Indicies
+RTY=F,E-mini Russell 2000 Index ,CME,Stock Indicies
+ESG=F,E-mini S&P 500 ESG Index ,CME,Stock Indicies
+EMT=F,E-mini S&P MidCap 400 BTIC,CME,Stock Indicies
+EMD=F,E-mini S&P MidCap 400 Index ,CME,Stock Indicies
+MNQ=F,Micro E-mini Nasdaq-100 Index,CME,Stock Indicies
+MES=F,MICRO E-MINI S&P 500 INDEX,CME,Stock Indicies
+FNG=F,Micro FANG+ Index - ICU,NYB,Stock Indicies
+MMW=F,MSCI ACWI NTR Index,NYB,Stock Indicies
+CHH=F,MSCI China NTR - ICUS,NYB,Stock Indicies
+MFS=F,MSCI EAFE Index - ICUS,NYB,Stock Indicies
+ASN=F,MSCI EM Asia NTR Index ,NYB,Stock Indicies
+LFM=F,MSCI EM ESG Leaders NTR Index,NYB,Stock Indicies
+MML=F,MSCI EM Latin Amer NTR Index,NYB,Stock Indicies
+MME=F,MSCI Emerging Markets Index ,NYB,Stock Indicies
+MIN=F,MSCI India NTR Index ,NYB,Stock Indicies
+USS=F,MSCI USA GTR Index,NYB,Stock Indicies
+MWL=F,MSCI World Index - ICUS,NYB,Stock Indicies
+MWS=F,MSCI World NTR Index,NYB,Stock Indicies
+VLQ=F,Nasdaq-100 Volatility Index ,CME,Stock Indicies
+SDA=F,S&P 500 Annual Dividend Index,CME,Stock Indicies
+SED=F,SED (SOFR-Eurodollar) Spread,CME,Stock Indicies
diff --git a/i18n/en.yml b/i18n/en.yml
index 5414f9102a5..ee2aed39761 100644
--- a/i18n/en.yml
+++ b/i18n/en.yml
@@ -1079,4 +1079,5 @@ en:
dashboards/chains: options chain analysis
dashboards/shortdata: finra shortdata analysis
dashboards/crypto: cryptocurrency exchange rates against USD
+ dashboards/futures: historical futures performance
reports/_reports_: Select one of the following report
diff --git a/openbb_terminal/dashboards/dashboards_controller.py b/openbb_terminal/dashboards/dashboards_controller.py
index 461bad957e6..4c350ac65d7 100644
--- a/openbb_terminal/dashboards/dashboards_controller.py
+++ b/openbb_terminal/dashboards/dashboards_controller.py
@@ -32,6 +32,7 @@ class DashboardsController(BaseController):
"chains",
"shortdata",
"crypto",
+ "futures",
]
PATH = "/dashboards/"
@@ -56,6 +57,7 @@ class DashboardsController(BaseController):
mt.add_cmd("chains")
mt.add_cmd("shortdata")
mt.add_cmd("crypto")
+ mt.add_cmd("futures")
console.print(text=mt.menu_text, menu="Dashboards")
@log_start_end(log=logger)
@@ -88,6 +90,11 @@ class DashboardsController(BaseController):
"""Process crypto command"""
create_call(other_args, "crypto", "")
+ @log_start_end(log=logger)
+ def call_futures(self, other_args: List[str]):
+ """Process futures command"""
+ create_call(other_args, "futures", "")
+
def create_call(other_args: List[str], name: str, filename: str = None) -> None:
filename = filename if filename else name
diff --git a/openbb_terminal/dashboards/futures.ipynb b/openbb_terminal/dashboards/futures.ipynb
new file mode 100644
index 00000000000..fb98d398ea9
--- /dev/null
+++ b/openbb_terminal/dashboards/futures.ipynb
@@ -0,0 +1,288 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "e9ad60bc",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import os, sys\n",
+ "import calendar\n",
+ "from datetime import datetime, timedelta\n",
+ "import pandas as pd\n",
+ "import ipywidgets as widgets\n",
+ "import plotly.graph_objs as go\n",
+ "import yfinance as yf\n",
+ "import pandas as pd\n",
+ "from IPython.display import display"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "01e1841a-ab16-4111-9b45-8ac66b85ab9f",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "full_path = os.path.abspath(os.path.join(os.getcwd(),\"..\", \"..\", \"custom_imports\", \"dashboards\", \"futures.csv\"))\n",
+ "df = pd.read_csv(full_path)\n",
+ "months = [\"F\", \"G\", \"H\", \"J\", \"K\", \"M\", \"N\", \"Q\", \"U\", \"V\", \"X\", \"Z\"]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "beb36881",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import os, sys\n",
+ "\n",
+ "class HiddenPrints:\n",
+ " def __enter__(self):\n",
+ " self._original_stdout = sys.stdout\n",
+ " sys.stdout = open(os.devnull, 'w')\n",
+ "\n",
+ " def __exit__(self, exc_type, exc_val, exc_tb):\n",
+ " sys.stdout.close()\n",
+ " sys.stdout = self._original_stdout\n",
+ "\n",
+ "def format_plotly(fig, data, chart, calc=None):\n",
+ " fig.update_yaxes(title=None)\n",
+ " fig.update_xaxes(title=None)\n",
+ " height = 500 if chart == \"main\" else 300\n",
+ " fig.update_layout(\n",
+ " margin=dict(l=0, r=10, t=10, b=10),\n",
+ " autosize=False,\n",
+ " width=900,\n",
+ " height=height,\n",
+ " legend=dict(orientation=\"h\"),\n",
+ " title={\n",
+ " # \"text\": fig_title,\n",
+ " \"y\": 0.95,\n",
+ " \"x\": 0.5,\n",
+ " \"xanchor\": \"center\",\n",
+ " \"yanchor\": \"top\",\n",
+ " },\n",
+ " )\n",
+ "\n",
+ "\n",
+ "def create_line(visual, x, y, name, fig):\n",
+ " if visual == \"line\":\n",
+ " plot = go.Scatter(x=x, y=y, mode=\"lines\", name=name) # , connectgaps=True\n",
+ " if visual == \"scatter\":\n",
+ " plot = go.Scatter(x=x, y=y, mode=\"markers\", name=name)\n",
+ " if visual == \"candle\":\n",
+ " plot = go.Candlestick(\n",
+ " x=x,\n",
+ " open=y[\"Open\"],\n",
+ " close=y[\"Close\"],\n",
+ " high=y[\"High\"],\n",
+ " low=y[\"Low\"],\n",
+ " name=name,\n",
+ " )\n",
+ " fig.add_trace(plot)\n",
+ "\n",
+ "\n",
+ "def show_fig(fig):\n",
+ " config = {\"showTips\": False, \"scrollZoom\": True}\n",
+ " if os.environ.get(\"SERVER_SOFTWARE\", \"jupyter\").startswith(\"voila\"):\n",
+ " fig.show(config=config, renderer=\"notebook\")\n",
+ " else:\n",
+ " fig.show(config=config)\n",
+ "\n",
+ "def build_ticker(ticker: str, month: int, year: int) -> str:\n",
+ " if ticker:\n",
+ " row = df[df[\"Ticker\"] == f\"{ticker.split(':')[0]}=F\"].iloc[0]\n",
+ " row = row.to_dict()\n",
+ " the_tick = row['Ticker'].replace('=F','')\n",
+ " return f\"{the_tick}{months[month-1]}{str(year)[-2:]}.{row['Exchange']}\"\n",
+ " return \"\"\n",
+ "\n",
+ "def next_ticker(ticker: str) -> str:\n",
+ " symbol, exchange = ticker.split(\".\")\n",
+ " month = symbol[-3]\n",
+ " if month == \"Z\":\n",
+ " new_month = \"F\"\n",
+ " new_year = int(symbol[-2:]) + 1\n",
+ " else:\n",
+ " index = months.index(month)\n",
+ " new_month = months[index + 1]\n",
+ " new_year = int(symbol[-2:])\n",
+ " return f\"{symbol[:-3]}{new_month}{new_year}.{exchange}\"\n",
+ "\n",
+ "def get_column(df: pd.DataFrame, column: str):\n",
+ " sub_df = df.xs(column, level=1, axis=1, drop_level=False)\n",
+ " sub_df.columns = sub_df.columns.to_flat_index().map(lambda x: x[0])\n",
+ " sub_df = sub_df.dropna(how='all')\n",
+ " sub_df = sub_df.sort_index()\n",
+ " if sub_df.empty:\n",
+ " return None\n",
+ " return sub_df\n",
+ "\n",
+ "def get_date(x: str) -> datetime:\n",
+ " ticker, _ = x.split(\".\")\n",
+ " month_str = ticker[-3]\n",
+ " month = months.index(month_str) + 1\n",
+ " year = int(ticker[-2:]) + 2000\n",
+ " day = calendar.monthrange(year, month)\n",
+ " return datetime(year, month, day[1])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "f8c2f65c",
+ "metadata": {
+ "tags": [
+ "parameters"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "class Chart:\n",
+ " def __init__(self):\n",
+ " self.tickers = {}\n",
+ " self.last_ticker = \"\"\n",
+ "\n",
+ " def create_stock(self, chart_type, contracts, ticker):\n",
+ " if not ticker:\n",
+ " return\n",
+ "\n",
+ " if self.last_ticker != ticker:\n",
+ " now = datetime.now()\n",
+ " clean_ticker = build_ticker(ticker, now.month, now.year)\n",
+ " if clean_ticker:\n",
+ " raw_tickers = [clean_ticker]\n",
+ " for _ in range(36):\n",
+ " new_ticker = next_ticker(raw_tickers[-1])\n",
+ " raw_tickers.append(new_ticker)\n",
+ " raw_ticker = \",\".join(raw_tickers)\n",
+ " with HiddenPrints():\n",
+ " dfs = yf.download(raw_ticker, progress=False) # ,period=\"max\"\n",
+ " self.tickers = {x: {\"data\": get_column(dfs, x), \"date\": get_date(x)} for x in raw_tickers}\n",
+ " self.last_ticker = ticker\n",
+ "\n",
+ " fig = go.Figure()\n",
+ " i = 0\n",
+ " if chart_type[0][:4] == \"Hist\":\n",
+ " for key, item in self.tickers.items():\n",
+ " if i == contracts:\n",
+ " break\n",
+ " result = item[\"data\"]\n",
+ " if result is not None:\n",
+ " create_line(visual=\"line\", x=result.index, y=result[\"Adj Close\"], name=key, fig=fig)\n",
+ " i += 1\n",
+ " else:\n",
+ " x = []\n",
+ " y = []\n",
+ " for _, value in self.tickers.items():\n",
+ " if len(x) > contracts:\n",
+ " break\n",
+ " if value[\"data\"] is None:\n",
+ " continue\n",
+ " x.append(value[\"date\"])\n",
+ " y.append(value[\"data\"][\"Adj Close\"].iloc[-1])\n",
+ " create_line(visual=\"line\", x=x, y=y, name=\"Future Curve\", fig=fig)\n",
+ "\n",
+ " format_plotly(fig, \"Close\", \"main\", \"raw\")\n",
+ " show_fig(fig)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "e0d4de31-1b4f-4c1f-8467-ca314a578d56",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "category = df[\"Category\"].unique().tolist()\n",
+ "exchange = df[df[\"Category\"].isin([category[0]])][\"Exchange\"].unique().tolist()\n",
+ "filt_df = df[df[\"Category\"].isin([category[0]]) & df[\"Exchange\"].isin([exchange[0]])]\n",
+ "tickers_raw = filt_df[[\"Ticker\", \"Description\"]].values.tolist()\n",
+ "tickers = [f\"{x.replace('=F', '')}: {y}\" for x, y in tickers_raw]\n",
+ "\n",
+ "chart_type = [\"Historical Time Series\", \"Future Curve\"]\n",
+ "cat_widget = widgets.SelectMultiple(options=category, value=[category[0]])\n",
+ "exch_widget = widgets.SelectMultiple(options=exchange, value=[exchange[0]])\n",
+ "tickers_widget = widgets.Select(options=tickers, value=tickers[0])\n",
+ "chart_widget = widgets.SelectMultiple(options=chart_type, value=[chart_type[0]])\n",
+ "\n",
+ "def on_change(change):\n",
+ " cat_value = cat_widget.value\n",
+ " exch_value = exch_widget.value\n",
+ " \n",
+ " #Filter exchange widget\n",
+ " exch_filtered = df[df[\"Category\"].isin(cat_value)][\"Exchange\"].unique().tolist()\n",
+ " exch_widget.options = exch_filtered\n",
+ " \n",
+ " #Filter ticker widget\n",
+ " filtered = df[df[\"Category\"].isin(cat_value) & df[\"Exchange\"].isin(exch_value)]\n",
+ " tick_raw = filtered[[\"Ticker\", \"Description\"]].values.tolist()\n",
+ " tick = [f\"{x.replace('=F', '')}: {y}\" for x, y in tick_raw]\n",
+ " tickers_widget.options = tick\n",
+ " \n",
+ "cat_widget.observe(on_change)\n",
+ "exch_widget.observe(on_change)\n",
+ "\n",
+ "contracts_widget = widgets.Dropdown(options=list(range(1, 13)), value=6, description=\"Contracts\")\n",
+ "\n",
+ "controls = widgets.HBox(\n",
+ " [cat_widget, exch_widget, tickers_widget, chart_widget, contracts_widget],\n",
+ " layout=widgets.Layout(width=\"90%\"),\n",
+ ")\n",
+ "chart = Chart()\n",
+ "stocks_view = widgets.interactive_output(\n",
+ " chart.create_stock,\n",
+ " {\n",
+ " \"chart_type\": chart_widget,\n",
+ " \"contracts\": contracts_widget,\n",
+ " \"ticker\": tickers_widget,\n",
+ " },\n",
+ ")\n",
+ "\n",
+ "\n",
+ "title_html = \"<h1>Futures Analysis Dashboard</h1>\"\n",
+ "\n",
+ "app_contents = [widgets.HTML(title_html), controls, stocks_view]\n",
+ "app = widgets.VBox(app_contents)\n",
+ "display(app)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "6e4c3424-91c9-47c5-b336-fe8e40944905",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3 (ipykernel)",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.10.4"
+ },
+ "metadata": {
+ "interpreter": {
+ "hash": "e896a00ead8b521528d79ac9ef24990696f2b751eb283ab8e0d078c9c4971ffc"
+ }
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/openbb_terminal/reports/widget_helpers.py b/openbb_terminal/reports/widget_helpers.py
index 2cf32c8b7eb..600e2e8eac8 100644
--- a/openbb_terminal/reports/widget_helpers.py
+++ b/openbb_terminal/reports/widget_helpers.py
@@ -229,7 +229,8 @@ def tab_clickable_evt() -> str:
def tablinks(tabs: List[str]) -> str:
- """Adds list of tabs/sections for the reports that are able to be clicked. For every 6 tabs we push them onto a new line.
+ """Adds list of tabs/sections for the reports that are able to be clicked. For every
+ 6 tabs we push them onto a new line.
Parameters
----------
diff --git a/openbb_terminal/stocks/government/quiverquant_view.py b/openbb_terminal/stocks/government/quiverquant_view.py
index 5de05903246..1cb66df066b 100644
--- a/openbb_terminal/stocks/government/quiverquant_view.py
+++ b/openbb_terminal/stocks/government/quiverquant_view.py
@@ -170,12 +170,16 @@ def display_government_buys(
if "-" in x
else x.strip("$").replace(",", "")
)
- df_gov["lower"] = df_gov[["min", "max", "Transaction"]].apply(
- lambda x: float(x["min"])
- if x["Transaction"] == "Purchase"
- else -float(x["max"]),
- axis=1,
- )
+ try:
+ df_gov["lower"] = df_gov[["min", "max", "Transaction"]].apply(
+ lambda x: float(x["min"])
+ if x["Transaction"] == "Purchase"
+ else -float(x["max"]),
+ axis=1,
+ )
+ except ValueError:
+ console.print("[red]No enough data.[/red]\n")
+ return
df_gov["upper"] = df_gov[["min", "max", "Transaction"]].apply(
lambda x: float(x["max"])
if x["Transaction"] == "Purchase"
@@ -266,6 +270,11 @@ def display_government_sells(
df_gov["Range"] = df_gov["Range"].apply(
lambda x: "$5,000,001-$5,000,001" if x == ">$5,000,000" else x
)
+
+ if df_gov.empty:
+ console.print("[red]Not enough data to display[/red]\n")
+ return
+
df_gov["min"] = df_gov["Range"].apply(
lambda x: x.split("-")[0]
.strip("$")
@@ -309,7 +318,10 @@ def display_government_sells(
.head(n=num)
)
print_rich_table(
- df, headers=["Amount ($1k)"], show_index=True, title="Top Government Trades"
+ df,
+ headers=["Amount ($1k)"],
+ show_index=True,
+ title="Top Government Trades",
)
# This plot has 1 axis
diff --git a/tests/openbb_terminal/portfolio/csv/test_portfolio_model/test_tracking_error.csv b/tests/openbb_terminal/portfolio/csv/test_portfolio_model/test_tracking_error.csv
index 6876a7acae5..57b7083fcb9 100644
--- a/tests/openbb_terminal/portfolio/csv/test_portfolio_model/test_tracking_error.csv
+++ b/tests/openbb_terminal/portfolio/csv/test_portfolio_model/test_tracking_error.csv
@@ -1,7 +1,5 @@
,Tracking Error
-mtd,"Adj Close NaN
-Total NaN
-dtype: float64"
+mtd,-
qtd,"Adj Close NaN
Total NaN
dtype: float64"
diff --git a/tests/openbb_terminal/stocks/government/txt/test_quiverquant_view/test_call_func[display_contracts-kwargs_dict5].txt b/tests/openbb_terminal/stocks/government/txt/test_quiverquant_view/test_call_func[display_contracts-kwargs_dict5].txt
index 1cb9b78341b..7d6defa8549 100644
--- a/tests/openbb_terminal/stocks/government/txt/test_quiverquant_view/test_call_func[display_contracts-kwargs_dict5].txt
+++ b/tests/openbb_terminal/stocks/government/txt/test_quiverquant_view/test_call_func[display_contracts-kwargs_dict5].txt
@@ -1,4 +1,3 @@
Date Description Agency Amount
0 2022-01-26 GSA REGION 7 NATIONAL DEEP ENERGY RETROFIT (NDER5) ENERGY SAVINGS PERFORMANCE CONTRACT (ESPC) FOR THE PERFORMANCE OF THE INVESTMENT GRADE AUDIT (IGA) AT DALLAS, FARMERS BRANCH, AND SHERMAN, TX NEW ORLEANS, BATON ROUGE, HOUMA, AND LAFAYETTE, LA. GENERAL SERVICES ADMINISTRATION (GSA) 0.0
1 2021-10-28 FY22 REQ#14217 AGAINST 140G0120A0010 DEPARTMENT OF THE INTERIOR (DOI) 76000.0
-
diff --git a/tests/openbb_terminal/stocks/government/txt/test_quiverquant_view/test_call_func[display_government_buys-kwargs_dict1].txt b/tests/openbb_terminal/stocks/government/txt/test_quiverquant_view/test_call_func[display_government_buys-kwargs_dict1].txt
index 8b137891791..417c8e6c2e5 100644
--- a/tests/openbb_terminal/stocks/government/txt/test_quiverquant_view/test_call_func[display_government_buys-kwargs_dict1].txt
+++ b/tests/openbb_terminal/stocks/government/txt/test_quiverquant_view/test_call_func[display_government_buys-kwargs_dict1].txt
@@ -1 +1,2 @@
+[red]No enough data.[/red]
diff --git a/tests/openbb_terminal/sto