diff --git a/openbb_terminal/jupyter/dashboards/chains.ipynb b/openbb_terminal/jupyter/dashboards/chains.ipynb
new file mode 100644
index 00000000000..c17412479ee
--- /dev/null
+++ b/openbb_terminal/jupyter/dashboards/chains.ipynb
@@ -0,0 +1,177 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "e9ad60bc",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import os\n",
+ "import ipywidgets as widgets\n",
+ "import plotly.graph_objs as go\n",
+ "import yfinance as yf\n",
+ "from IPython.display import display"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "beb36881",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "opts = [\n",
+ " \"lastTradeDate\",\n",
+ " \"strike\",\n",
+ " \"lastPrice\",\n",
+ " \"bid\",\n",
+ " \"ask\",\n",
+ " \"change\",\n",
+ " \"percentChange\",\n",
+ " \"volume\",\n",
+ " \"openInterest\",\n",
+ " \"impliedVolatility\",\n",
+ "]\n",
+ "\n",
+ "\n",
+ "def clean_str(string):\n",
+ " new_str = \"\"\n",
+ " for letter in string:\n",
+ " if letter.isupper():\n",
+ " new_str += \" \"\n",
+ " new_str += letter\n",
+ " return new_str.title()\n",
+ "\n",
+ "\n",
+ "def format_plotly(fig, x, y, ticker, expiry, inst):\n",
+ " fig.update_yaxes(title=clean_str(y))\n",
+ " fig.update_xaxes(title=clean_str(x))\n",
+ " expires = \", \".join(expiry)\n",
+ " title = (\n",
+ " f\"{clean_str(y)} vs. {clean_str(x)} for {ticker.upper()} {inst}s on {expires}\"\n",
+ " )\n",
+ " fig.update_layout(\n",
+ " autosize=False,\n",
+ " width=1000,\n",
+ " height=500,\n",
+ " title={\n",
+ " \"text\": title,\n",
+ " \"y\": 0.95,\n",
+ " \"x\": 0.5,\n",
+ " \"xanchor\": \"center\",\n",
+ " \"yanchor\": \"top\",\n",
+ " },\n",
+ " )"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "f8c2f65c",
+ "metadata": {
+ "tags": [
+ "parameters"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "class Chart:\n",
+ " def __init__(self):\n",
+ " self.last_ticker = \"\"\n",
+ " self.dfs = {}\n",
+ "\n",
+ " def update(self, ticker, expiry, inst, x, y):\n",
+ " if ticker:\n",
+ " stock = yf.Ticker(ticker)\n",
+ " if ticker != self.last_ticker:\n",
+ " exp_w.options = stock.options\n",
+ " self.last_ticker = ticker\n",
+ "\n",
+ " if expiry:\n",
+ " fig = go.Figure()\n",
+ " for expire in expiry:\n",
+ " if expire not in self.dfs:\n",
+ " self.dfs[expire] = stock.option_chain(expire)\n",
+ " group = self.dfs[expire]\n",
+ " df = group.calls if inst == \"Call\" else group.puts\n",
+ "\n",
+ " plot = go.Scatter(\n",
+ " x=df[x],\n",
+ " y=df[y],\n",
+ " mode=\"lines\",\n",
+ " connectgaps=True,\n",
+ " name=expire,\n",
+ " )\n",
+ " fig.add_trace(plot)\n",
+ "\n",
+ " format_plotly(fig, x, y, ticker, expiry, inst)\n",
+ "\n",
+ " if os.environ.get(\"SERVER_SOFTWARE\", \"jupyter\").startswith(\"voila\"):\n",
+ " fig.show(config={\"showTips\": False}, renderer=\"notebook\")\n",
+ " else:\n",
+ " fig.show(config={\"showTips\": False})\n",
+ "\n",
+ "\n",
+ "x_w = widgets.Dropdown(options=opts, value=\"strike\", description=\"X\")\n",
+ "y_w = widgets.Dropdown(options=opts, value=\"lastPrice\", description=\"Y\")\n",
+ "tickers_w = widgets.Text(description=\"Ticker\")\n",
+ "exp_w = widgets.SelectMultiple(description=\"Expiry\")\n",
+ "inst_w = widgets.Dropdown(options=[\"Put\", \"Call\"], value=\"Call\", description=\"Type\")\n",
+ "\n",
+ "select_opt = widgets.VBox([tickers_w, exp_w])\n",
+ "select_plot = widgets.VBox([inst_w, x_w, y_w])\n",
+ "controls = widgets.HBox([select_opt, select_plot])\n",
+ "\n",
+ "chart = Chart()\n",
+ "stocks_view = widgets.interactive_output(\n",
+ " chart.update,\n",
+ " {\"ticker\": tickers_w, \"expiry\": exp_w, \"inst\": inst_w, \"x\": x_w, \"y\": y_w},\n",
+ ")\n",
+ "\n",
+ "title_html = \"
Option Chain Dashboard
\"\n",
+ "app_contents = [\n",
+ " widgets.HTML(title_html),\n",
+ " controls,\n",
+ " stocks_view,\n",
+ "]\n",
+ "app = widgets.VBox(app_contents)\n",
+ "display(app)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "a84c7390-6b43-4a25-8aa2-31aa84f52605",
+ "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.8.12"
+ },
+ "metadata": {
+ "interpreter": {
+ "hash": "e896a00ead8b521528d79ac9ef24990696f2b751eb283ab8e0d078c9c4971ffc"
+ }
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/openbb_terminal/jupyter/dashboards/correlation.ipynb b/openbb_terminal/jupyter/dashboards/correlation.ipynb
new file mode 100644
index 00000000000..7e2b67e59a0
--- /dev/null
+++ b/openbb_terminal/jupyter/dashboards/correlation.ipynb
@@ -0,0 +1,222 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "id": "e9ad60bc",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import os\n",
+ "from datetime import datetime, timedelta\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": 11,
+ "id": "6c554cd2-462c-4832-b73c-c214aae11ce4",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "interval_opts = [\n",
+ " \"1m\",\n",
+ " \"2m\",\n",
+ " \"5m\",\n",
+ " \"15m\",\n",
+ " \"30m\",\n",
+ " \"60m\",\n",
+ " \"90m\",\n",
+ " \"1h\",\n",
+ " \"1d\",\n",
+ " \"5d\",\n",
+ " \"1wk\",\n",
+ " \"1mo\",\n",
+ " \"3mo\",\n",
+ "]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "id": "f8c2f65c",
+ "metadata": {
+ "tags": [
+ "parameters"
+ ]
+ },
+ "outputs": [
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "b462032b043b47a8899f8366f43ab28e",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ "VBox(children=(HTML(value='Correlation Analysis Dashboard
'), HBox(children=(VBox(children=(Textarea(v…"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "class Chart:\n",
+ " def __init__(self):\n",
+ " self.last_tickers = \"\"\n",
+ " self.last_interval = \"1d\"\n",
+ " self.df = pd.DataFrame()\n",
+ "\n",
+ " def create(self, data, start, end, interval, tickers):\n",
+ " global last_tickers, df, last_interval\n",
+ " if tickers and tickers[-1] == \",\":\n",
+ " if tickers != self.last_tickers or interval != self.last_interval:\n",
+ " if interval in [\"1d\", \"5d\", \"1wk\", \"1mo\", \"3mo\"]:\n",
+ " self.df = yf.download(\n",
+ " tickers, period=\"max\", interval=interval, progress=False\n",
+ " )\n",
+ " else:\n",
+ " self.df = yf.download(\n",
+ " tickers, start=start, end=end, interval=interval, progress=False\n",
+ " )\n",
+ " self.last_tickers = tickers\n",
+ " self.last_interval = interval\n",
+ "\n",
+ " start_n = datetime(start.year, start.month, start.day)\n",
+ " end_n = datetime(end.year, end.month, end.day)\n",
+ "\n",
+ " df = self.df[data]\n",
+ "\n",
+ " if not isinstance(df, pd.Series):\n",
+ " if interval in [\"1d\", \"5d\", \"1wk\", \"1mo\", \"3mo\"]:\n",
+ " result = df.loc[(df.index >= start_n) & (df.index <= end_n)].corr()\n",
+ " else:\n",
+ " result = df.corr()\n",
+ "\n",
+ " base = [\n",
+ " [\n",
+ " \"black\" if x == 1 else \"lightgreen\" if x > 0 else \"lightpink\"\n",
+ " for x in result[y].tolist()\n",
+ " ]\n",
+ " for y in result.columns\n",
+ " ]\n",
+ " base = [[\"lightgray\" for _ in range(result.shape[0])]] + base\n",
+ " result = result.reset_index()\n",
+ " result.rename(columns={\"index\": \"\"}, inplace=True)\n",
+ "\n",
+ " fig = go.Figure(\n",
+ " data=[\n",
+ " go.Table(\n",
+ " header=dict(\n",
+ " values=list(result.columns),\n",
+ " fill_color=\"lightgray\",\n",
+ " font=dict(color=\"black\"),\n",
+ " align=\"left\",\n",
+ " ),\n",
+ " cells=dict(\n",
+ " values=[result[x] for x in result.columns],\n",
+ " fill_color=base,\n",
+ " format=[\"\"]\n",
+ " + [\".2f\" for _ in range(len(df.columns) - 1)],\n",
+ " font=dict(color=\"black\"),\n",
+ " align=\"left\",\n",
+ " ),\n",
+ " )\n",
+ " ],\n",
+ " )\n",
+ " fig.update_layout(\n",
+ " autosize=True,\n",
+ " height=600,\n",
+ " showlegend=False,\n",
+ " )\n",
+ " if os.environ.get(\"SERVER_SOFTWARE\", \"jupyter\").startswith(\"voila\"):\n",
+ " fig.show(config={\"showTips\": False}, renderer=\"notebook\")\n",
+ " else:\n",
+ " fig.show(config={\"showTips\": False})\n",
+ "\n",
+ "\n",
+ "w_auto = widgets.Layout(width=\"auto\")\n",
+ "data_opts = [\"Open\", \"Close\", \"High\", \"Low\", \"Volume\"]\n",
+ "data_widget = widgets.Dropdown(\n",
+ " options=data_opts, value=\"Close\", layout=w_auto, description=\"Data\"\n",
+ ")\n",
+ "\n",
+ "base_date = (datetime.today() - timedelta(days=365)).date()\n",
+ "start_widget = widgets.DatePicker(value=base_date, layout=w_auto, description=\"Start\")\n",
+ "end_widget = widgets.DatePicker(\n",
+ " value=datetime.today().date(), layout=w_auto, description=\"End\"\n",
+ ")\n",
+ "interval_widget = widgets.Dropdown(\n",
+ " options=interval_opts, value=\"1d\", layout=w_auto, description=\"Interval\"\n",
+ ")\n",
+ "tickers_widget = widgets.Textarea(value=\"TSLA,AAPL,\", layout=w_auto)\n",
+ "\n",
+ "data_box = widgets.VBox([tickers_widget, data_widget])\n",
+ "date_box = widgets.VBox([start_widget, end_widget, interval_widget])\n",
+ "controls = widgets.HBox([data_box, date_box], layout=widgets.Layout(width=\"60%\"))\n",
+ "\n",
+ "chart = Chart()\n",
+ "stocks_view = widgets.interactive_output(\n",
+ " chart.create,\n",
+ " {\n",
+ " \"data\": data_widget,\n",
+ " \"start\": start_widget,\n",
+ " \"end\": end_widget,\n",
+ " \"interval\": interval_widget,\n",
+ " \"tickers\": tickers_widget,\n",
+ " },\n",
+ ")\n",
+ "\n",
+ "title_html = \"Correlation Analysis Dashboard
\"\n",
+ "warning_html = 'Use a comma after EVERY stock typed.
'\n",
+ "app_contents = [\n",
+ " widgets.HTML(title_html),\n",
+ " controls,\n",
+ " widgets.HTML(warning_html),\n",
+ " stocks_view,\n",
+ "]\n",
+ "app = widgets.VBox(app_contents)\n",
+ "display(app)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "37f46146-a206-4c25-b969-81c5abec4b1d",
+ "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.8.12"
+ },
+ "metadata": {
+ "interpreter": {
+ "hash": "e896a00ead8b521528d79ac9ef24990696f2b751eb283ab8e0d078c9c4971ffc"
+ }
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/openbb_terminal/jupyter/dashboards/crypto.ipynb b/openbb_terminal/jupyter/dashboards/crypto.ipynb
new file mode 100644
index 00000000000..7972cda6037
--- /dev/null
+++ b/openbb_terminal/jupyter/dashboards/crypto.ipynb
@@ -0,0 +1,160 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "6e198e40-0c33-45b3-a79b-2d9ee9eff7b9",
+ "metadata": {
+ "tags": []
+ },
+ "source": [
+ "# Cryptocurrency exchange rates to USD ($)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "da655985-c9b7-492e-aefa-fbe3bc1865d5",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import json\n",
+ "import os\n",
+ "\n",
+ "import ipywidgets as ipw\n",
+ "from IPython.display import display\n",
+ "import pandas as pd\n",
+ "\n",
+ "from openbb_terminal import api as openbb\n",
+ "\n",
+ "ipw.HTML(f\"\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "dcbbf867-af50-4d06-ae5c-7c09647aa55d",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "COIN_LIST = (\n",
+ " \"BTC,ETH,USDT,BNB,USDC,XRP,LUNA,ADA,\"\n",
+ " + \"SOL,AVAX,DOT,BUSD,DOGE,UST,SHIB,WBTC,\"\n",
+ " + \"MATIC,CRO,DAI,LTC,ATOM,NEAR,LINK,BCH,\"\n",
+ " + \"UNI,TRX,FTT,ETC,LEO,ALGO,XLM,MANA,\"\n",
+ " + \"BTCB,HBAR,EGLD,ICP,SAND,XMR,WAVES,VET,\"\n",
+ " + \"APE,FIL,FTM,AXS,THETA,KLAY,XTZ,RUNE\"\n",
+ ").split(\",\")\n",
+ "exchange_rates = {}"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "deeeb80a-3675-44fb-9a1b-2325d8da4e7d",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def get_exchange_rate(coin: str, days: int = 2):\n",
+ " \"\"\"Get exchange rate for a cryptocurrency agains USD.\"\"\"\n",
+ " (_, _, _, _, current_df, _,) = openbb.crypto.load(\n",
+ " coin=coin,\n",
+ " source=\"cp\",\n",
+ " days=days,\n",
+ " vs=\"usd\",\n",
+ " interval=\"1day\",\n",
+ " should_load_ta_data=True,\n",
+ " )\n",
+ " price_color = \"neutral_color\"\n",
+ " if current_df[\"Close\"].iloc[-1] > current_df[\"Close\"].iloc[-2]:\n",
+ " price_color = \"up_color\"\n",
+ " elif current_df[\"Close\"].iloc[-1] < current_df[\"Close\"].iloc[-2]:\n",
+ " price_color = \"down_color\"\n",
+ " price = str(current_df[\"Close\"].iloc[-1])[:7]\n",
+ "\n",
+ " return price, price_color"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "18acf5cb-6cbf-484d-8042-107c030098de",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def show_rates(btn):\n",
+ " \"\"\"Show exchange rates in grid box widget.\"\"\"\n",
+ " grid.children = ()\n",
+ " for coin in COIN_LIST:\n",
+ " if coin not in exchange_rates.keys():\n",
+ " exchange_rates[coin] = {\"price\": None, \"color\": None}\n",
+ " try:\n",
+ " price, price_color = get_exchange_rate(coin=coin)\n",
+ " except:\n",
+ " price, price_color = \"-------\", \"neutral_color\"\n",
+ " widgets = list(grid.children)\n",
+ " widgets.append(\n",
+ " ipw.HTML(\n",
+ " openbb.widgets.price_card(\n",
+ " ticker=coin,\n",
+ " price=price,\n",
+ " price_color=price_color,\n",
+ " )\n",
+ " )\n",
+ " )\n",
+ " grid.children = tuple(widgets)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "cf2021e9-de8a-466e-b341-fcd6abda64b5",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "update_rates = ipw.Button(description=\"Update rates\")\n",
+ "update_rates.on_click(show_rates)\n",
+ "header = ipw.HBox([update_rates])\n",
+ "\n",
+ "layout = ipw.Layout(grid_template_columns=\"1fr \" * 8)\n",
+ "grid = ipw.GridBox(\n",
+ " [],\n",
+ " layout=layout,\n",
+ ")\n",
+ "\n",
+ "display(header, grid)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "19dfcbfe-eaec-406e-bb3c-72d1b3538a6e",
+ "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.8.12"
+ },
+ "voila": {
+ "theme": "dark"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/openbb_terminal/jupyter/dashboards/currencies.ipynb b/openbb_terminal/jupyter/dashboards/currencies.ipynb
new file mode 100644
index 00000000000..ad612c6ce8e
--- /dev/null
+++ b/openbb_terminal/jupyter/dashboards/currencies.ipynb
@@ -0,0 +1,284 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "da655985-c9b7-492e-aefa-fbe3bc1865d5",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import os\n",
+ "import sys\n",
+ "import time\n",
+ "from datetime import datetime, timedelta\n",
+ "from typing import Optional\n",
+ "\n",
+ "import ipywidgets as ipw\n",
+ "import matplotlib.pyplot as plt\n",
+ "import matplotlib_inline.backend_inline\n",
+ "from ipyflex import FlexLayout\n",
+ "from widget_helpers import price_card, stylesheet\n",
+ "\n",
+ "from openbb_terminal import api as openbb\n",
+ "\n",
+ "%matplotlib widget\n",
+ "openbb.theme.applyMPLstyle()\n",
+ "ipw.HTML(f\"\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "f5905453-4de6-4f5f-8012-9acdfca50987",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def get_exchange_rate(currency_pair: str) -> str:\n",
+ " \"\"\"Get exchange rate for a currency pair.\"\"\"\n",
+ " from_symbol, to_symbol = currency_pair.split(\"/\")\n",
+ " exchange_data = openbb.forex.models.av.get_quote(\n",
+ " to_symbol=to_symbol, from_symbol=from_symbol\n",
+ " )\n",
+ " return exchange_data[\"Realtime Currency Exchange Rate\"][\"5. Exchange Rate\"][:6]\n",
+ "\n",
+ "\n",
+ "def get_candle_widget(\n",
+ " output: Optional[ipw.Output],\n",
+ " to_symbol: str,\n",
+ " from_symbol: str,\n",
+ ") -> ipw.Output:\n",
+ " \"\"\"Plot a candle chart for a currency pair.\"\"\"\n",
+ " start_date = datetime.now() - timedelta(days=1)\n",
+ " start_date = start_date.strftime(\"%Y-%m-%d\")\n",
+ "\n",
+ " exchange_rate_data = openbb.forex.models.av.get_historical(\n",
+ " to_symbol=to_symbol,\n",
+ " from_symbol=from_symbol,\n",
+ " start_date=start_date,\n",
+ " resolution=\"i\",\n",
+ " interval=\"15\",\n",
+ " )\n",
+ " fig, ax = plt.subplots(1, 1, figsize=(11, 4))\n",
+ " openbb.forex.candle(\n",
+ " data=exchange_rate_data,\n",
+ " to_symbol=to_symbol,\n",
+ " from_symbol=from_symbol,\n",
+ " external_axes=[ax],\n",
+ " )\n",
+ "\n",
+ " ax.set_xlim(0, len(exchange_rate_data.index))\n",
+ " fig.canvas.header_visible = False\n",
+ " fig.canvas.footer_visible = False\n",
+ " with output:\n",
+ " output.clear_output(True)\n",
+ " fig.canvas.show()\n",
+ " return output\n",
+ "\n",
+ "\n",
+ "def on_dropdown_change(change):\n",
+ " \"\"\"Update charts on change of dropdown selection.\"\"\"\n",
+ " if change[\"type\"] == \"change\" and change[\"name\"] == \"value\":\n",
+ " output = ipw.Output()\n",
+ " get_candle_widget(\n",
+ " to_symbol=to_widget.value,\n",
+ " from_symbol=from_widget.value,\n",
+ " )\n",
+ " dashboard.children[\"Candle\"] = output"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "5c768d15-37ad-441b-b069-506c4bdbb9a7",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "exchange_rates = {\n",
+ " \"EUR/USD\": {\"latest\": None, \"previous\": None},\n",
+ " \"USD/JPY\": {\"latest\": None, \"previous\": None},\n",
+ " \"GBP/USD\": {\"latest\": None, \"previous\": None},\n",
+ " \"AUD/USD\": {\"latest\": None, \"previous\": None},\n",
+ " \"USD/CAD\": {\"latest\": None, \"previous\": None},\n",
+ " # \"USD/CNY\": {\"latest\": None, \"previous\": None},\n",
+ " # \"USD/CHF\": {\"latest\": None, \"previous\": None},\n",
+ " # \"USD/HKD\": {\"latest\": None, \"previous\": None},\n",
+ "}"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "4968ab89-aafe-4234-933c-963bd672715d",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def compose_widgets():\n",
+ " widgets = {}\n",
+ " for currency_pair in exchange_rates:\n",
+ " price = exchange_rates[currency_pair][\"latest\"]\n",
+ " price_color = \"neutral_color\"\n",
+ " if exchange_rates[currency_pair][\"previous\"] is not None:\n",
+ " if (\n",
+ " exchange_rates[currency_pair][\"latest\"]\n",
+ " > exchange_rates[currency_pair][\"previous\"]\n",
+ " ):\n",
+ " price_color = \"up_color\"\n",
+ " elif (\n",
+ " exchange_rates[currency_pair][\"latest\"]\n",
+ " < exchange_rates[currency_pair][\"previous\"]\n",
+ " ):\n",
+ " price_color = \"down_color\"\n",
+ " widgets[currency_pair] = ipw.HTML(\n",
+ " price_card(ticker=currency_pair, price=price, price_color=price_color)\n",
+ " )\n",
+ " return widgets"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "f35d1500-a411-4cff-94ee-d65d4d1810f9",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# for currency_code in rates_to_usd:\n",
+ "# rates_to_usd[currency_code][\"previous\"] = rates_to_usd[currency_code][\"latest\"]\n",
+ "# rates_to_usd[currency_code][\"latest\"] = get_rate_against_usd(currency_code)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "8a72837b-4ddd-4c01-a493-ebb430202cbc",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "widgets = compose_widgets()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "c636543c-42fe-4dd6-a900-1552a3c28c7e",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "currency_list = openbb.forex.models.av.get_currency_list()\n",
+ "from_widget = ipw.Dropdown(\n",
+ " options=currency_list,\n",
+ " value=\"EUR\",\n",
+ " description=\"From:\",\n",
+ " disabled=False,\n",
+ " layout=ipw.Layout(margin=\"130\"),\n",
+ ")\n",
+ "to_widget = ipw.Dropdown(\n",
+ " options=currency_list,\n",
+ " value=\"USD\",\n",
+ " description=\"To:\",\n",
+ " disabled=False,\n",
+ ")\n",
+ "exchange_selection = ipw.VBox([from_widget, to_widget])\n",
+ "\n",
+ "widgets[\"Select\"] = exchange_selection"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "9d069845-d622-4878-8b18-b385c6cb7a7f",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "output = ipw.Output()\n",
+ "output = get_candle_widget(\n",
+ " output=output,\n",
+ " to_symbol=to_widget.value,\n",
+ " from_symbol=from_widget.value,\n",
+ ")\n",
+ "widgets[\"Candle\"] = output"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "81c7e5c7-2e52-45ba-bf7d-aa240f95be2d",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from_widget.observe(on_dropdown_change)\n",
+ "to_widget.observe(on_dropdown_change)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "a0c7d921-e5dc-4ce8-97f1-a59b414a676a",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "dashboard = FlexLayout(\n",
+ " layout_config={\"borderLeft\": False, \"borderRight\": False, \"enableSection\": False},\n",
+ " style={\n",
+ " \"height\": \"calc(100vh - 80px)\",\n",
+ " \"backgroundColor\": \"rgb(0 0 0)\",\n",
+ " \"fontFamily\": \"Consolas\",\n",
+ " \"fontWeight\": 800,\n",
+ " },\n",
+ " header={\n",
+ " \"title\": \"Currencies\",\n",
+ " \"style\": {\n",
+ " \"backgroundColor\": \"rgb(0 0 0)\",\n",
+ " \"fontWeight\": 400,\n",
+ " \"fontSize\": \"28px\",\n",
+ " },\n",
+ " \"buttons\": [],\n",
+ " },\n",
+ " widgets=widgets,\n",
+ " template=os.path.join(\"widgets\", \"currencies.json\"),\n",
+ " editable=False,\n",
+ ")\n",
+ "dashboard"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "5fedac44-5e09-44f0-bbbe-fbad7c8716cd",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "3c850ba2-408b-4061-947e-5a1b8a284d22",
+ "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.8.12"
+ },
+ "voila": {
+ "theme": "dark"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/openbb_terminal/jupyter/dashboards/shortdata.ipynb b/openbb_terminal/jupyter/dashboards/shortdata.ipynb
new file mode 100644
index 00000000000..04e1791cfb2
--- /dev/null
+++ b/openbb_terminal/jupyter/dashboards/shortdata.ipynb
@@ -0,0 +1,255 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {
+ "collapsed": true,
+ "jupyter": {
+ "outputs_hidden": true
+ }
+ },
+ "outputs": [],
+ "source": [
+ "import io\n",
+ "import pandas as pd\n",
+ "import matplotlib.pyplot as plt\n",
+ "import requests\n",
+ "from datetime import datetime, timedelta\n",
+ "import ipywidgets as widgets\n",
+ "from IPython.display import display\n",
+ "\n",
+ "%matplotlib widget"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 47,
+ "metadata": {
+ "collapsed": false,
+ "jupyter": {
+ "outputs_hidden": false
+ },
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "class ShortDataDash:\n",
+ " def __init__(self):\n",
+ " self.df = pd.DataFrame()\n",
+ " self.days_slider = widgets.IntSlider(\n",
+ " value=5,\n",
+ " min=5,\n",
+ " max=252,\n",
+ " step=1,\n",
+ " description=\"Days Back\",\n",
+ " style={\"description_width\": \"initial\"},\n",
+ " )\n",
+ " self.count_slider = widgets.IntSlider(\n",
+ " value=10,\n",
+ " min=1,\n",
+ " max=25,\n",
+ " step=1,\n",
+ " description=\"Number to show.\",\n",
+ " style={\"description_width\": \"initial\"},\n",
+ " )\n",
+ " self.output1 = widgets.Output()\n",
+ " self.output2 = widgets.Output()\n",
+ " self.load_button = widgets.Button(\n",
+ " description=\"Load Data\", layout=widgets.Layout(width=\"200px\", height=\"40px\")\n",
+ " )\n",
+ " self.load_button.on_click(self.load_button_click)\n",
+ " self.show_button = widgets.Button(\n",
+ " description=\"Change Number Shown\", layout=self.load_button.layout\n",
+ " )\n",
+ " self.show_button.on_click(self.show_button_click)\n",
+ "\n",
+ " self.slider_box = widgets.HBox([self.days_slider, self.count_slider])\n",
+ " self.button_box = widgets.VBox([self.load_button, self.show_button])\n",
+ "\n",
+ " self.stock_input = widgets.Text(\n",
+ " value=\"GME\",\n",
+ " placeholder=\"GME\",\n",
+ " description=\"Ticker:\",\n",
+ " )\n",
+ " self.ticker_button = widgets.Button(description=\"Plot Ticker\")\n",
+ " self.ticker_button.on_click(self.ticker_button_click)\n",
+ "\n",
+ " def show_button_click(self, b):\n",
+ " self.output1.clear_output()\n",
+ " with self.output1:\n",
+ " self.update()\n",
+ "\n",
+ " def load_button_click(self, b):\n",
+ " self.output1.clear_output()\n",
+ " self.output2.clear_output()\n",
+ " with self.output1:\n",
+ " print(f\"Data Loading for {self.days_slider.value} days\")\n",
+ " self.fetch_new_data()\n",
+ " self.update()\n",
+ "\n",
+ " def ticker_button_click(self, b):\n",
+ " self.output2.clear_output()\n",
+ " with self.output2:\n",
+ " self.ticker_plot()\n",
+ "\n",
+ " def fetch_new_data(self):\n",
+ " self.df = pd.DataFrame()\n",
+ " today = datetime.now().date()\n",
+ " idx = 0\n",
+ " len_df = 0\n",
+ " while len_df < self.days_slider.value:\n",
+ " date = today - timedelta(days=idx)\n",
+ " r = requests.get(\n",
+ " f\"https://cdn.finra.org/equity/regsho/daily/CNMSshvol{date.strftime('%Y%m%d')}.txt\"\n",
+ " )\n",
+ " if r.status_code == 200:\n",
+ " self.df = pd.concat(\n",
+ " [self.df, pd.read_csv(io.StringIO(r.text), sep=\"|\")], axis=0\n",
+ " )\n",
+ " len_df += 1\n",
+ " idx += 1\n",
+ " self.df = self.df[self.df.Date > 20100101]\n",
+ " self.df.Date = self.df[\"Date\"].apply(\n",
+ " lambda x: datetime.strptime(str(x), \"%Y%m%d\")\n",
+ " )\n",
+ "\n",
+ " def update(self):\n",
+ " if not self.df.empty:\n",
+ " temp = (\n",
+ " self.df.groupby(\"Symbol\")[[\"ShortVolume\", \"TotalVolume\"]]\n",
+ " .agg(\"sum\")\n",
+ " .sort_values(by=\"ShortVolume\", ascending=False)\n",
+ " .head(self.count_slider.value)[::-1]\n",
+ " )\n",
+ " self.fig, self.ax = plt.subplots(figsize=(6, 6))\n",
+ " self.ax.barh(temp.index, temp.TotalVolume, alpha=0.4, label=\"Total Volume\")\n",
+ " self.ax.barh(temp.index, temp.ShortVolume, label=\"Short Volume\")\n",
+ " self.ax.set_title(\n",
+ " f\"Top {self.count_slider.value} Short Volume in Last {self.days_slider.value} Days\"\n",
+ " )\n",
+ " self.ax.legend()\n",
+ " self.fig.tight_layout()\n",
+ " plt.show()\n",
+ "\n",
+ " def ticker_plot(self):\n",
+ " stock_data = self.df.copy().loc[\n",
+ " self.df.Symbol == self.stock_input.value,\n",
+ " [\"Date\", \"ShortVolume\", \"TotalVolume\"],\n",
+ " ]\n",
+ " self.fig2, self.ax2 = plt.subplots(figsize=(6, 6))\n",
+ " self.ax2.plot(\n",
+ " stock_data.Date, stock_data.TotalVolume, alpha=0.4, label=\"Total Volume\"\n",
+ " )\n",
+ " self.ax2.plot(stock_data.Date, stock_data.ShortVolume, label=\"Short Volume\")\n",
+ " self.ax2.set_title(\n",
+ " f\"Stock Volume and Short Volume for {self.stock_input.value.upper()}\"\n",
+ " )\n",
+ " self.ax2.legend()\n",
+ " self.fig2.autofmt_xdate()\n",
+ " self.fig2.tight_layout()\n",
+ " plt.show()\n",
+ "\n",
+ " def build_app(self):\n",
+ " title_html = \"\"\"\n",
+ "Finra Short Data
\n",
+ "This widget downloads the consolidated NMS short data from FINRA and aggregates the data by summing over the entire time period.
\n",
+ "Note that clicking the 'Load Data' button will reload all data. This can get time consuming, so if you pick a few hundred days, expect a few minutes for loading time.
\n",
+ "\"\"\"\n",
+ " middle_html = \"\"\"\n",
+ "Here we allow the user to query for a single stock. This will work with the loaded data. Note that if you want to reload the data, this will once again take some time.\n",
+ " \"\"\"\n",
+ " return [\n",
+ " widgets.HTML(\n",
+ " title_html, layout=widgets.Layout(margin=\"0 0 3em 0\", max_width=\"800px\")\n",
+ " ),\n",
+ " self.slider_box,\n",
+ " self.button_box,\n",
+ " self.output1,\n",
+ " widgets.HTML(\n",
+ " middle_html,\n",
+ " layout=widgets.Layout(margin=\"0 0 3em 0\", max_width=\"800px\"),\n",
+ " ),\n",
+ " self.stock_input,\n",
+ " self.ticker_button,\n",
+ " self.output2,\n",
+ " ]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 48,
+ "metadata": {
+ "collapsed": false,
+ "jupyter": {
+ "outputs_hidden": false
+ },
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "dash = ShortDataDash()\n",
+ "app = widgets.VBox(\n",
+ " dash.build_app(), layout=widgets.Layout(max_width=\"1024px\", margin=\"0 auto 0 auto\")\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 49,
+ "metadata": {
+ "collapsed": false,
+ "jupyter": {
+ "outputs_hidden": false
+ },
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "dcda08c8d643465fb862d01341d71370",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ "VBox(children=(HTML(value=\"\\nFinra Short Data
\\nThis widget downloads the consolidated NMS short da…"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "display(app)"
+ ]
+ }
+ ],
+ "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.8.12"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 4
+}
diff --git a/openbb_terminal/jupyter/dashboards/stocks.ipynb b/openbb_terminal/jupyter/dashboards/stocks.ipynb
new file mode 100644
index 00000000000..dcdafd3df9c
--- /dev/null
+++ b/openbb_terminal/jupyter/dashboards/stocks.ipynb
@@ -0,0 +1,404 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "e9ad60bc",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import os\n",
+ "from datetime import datetime, timedelta\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": "beb36881",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "interval_opts = [\n",
+ " \"1m\",\n",
+ " \"2m\",\n",
+ " \"5m\",\n",
+ " \"15m\",\n",
+ " \"30m\",\n",
+ " \"60m\",\n",
+ " \"90m\",\n",
+ " \"1h\",\n",
+ " \"1d\",\n",
+ " \"5d\",\n",
+ " \"1wk\",\n",
+ " \"1mo\",\n",
+ " \"3mo\",\n",
+ "]\n",
+ "\n",
+ "rows = [\n",
+ " \"sector\",\n",
+ " \"marketCap\",\n",
+ " \"beta\",\n",
+ " \"fiftyTwoWeekHigh\",\n",
+ " \"fiftyTwoWeekLow\",\n",
+ " \"floatShares\",\n",
+ " \"sharesShort\",\n",
+ " \"exDividendDate\",\n",
+ "]\n",
+ "\n",
+ "views = {\n",
+ " \"Raw Data\": lambda x, y: x,\n",
+ " \"Percent Change\": lambda x, y: x.pct_change(),\n",
+ " \"Rolling Average\": lambda x, y: x.rolling(y).mean(),\n",
+ " \"Rolling Variance\": lambda x, y: x.rolling(y).var(),\n",
+ " \"Rolling Standard Deviation\": lambda x, y: x.rolling(y).var() ** 0.5,\n",
+ " \"Rolling Coefficient of Variation\": lambda x, y: (x.rolling(y).var() ** 0.5)\n",
+ " / (x.rolling(y).mean()),\n",
+ "}\n",
+ "\n",
+ "clean_row = {\n",
+ " \"sector\": \"Sector\",\n",
+ " \"marketCap\": \"M Cap\",\n",
+ " \"beta\": \"Beta\",\n",
+ " \"fiftyTwoWeekHigh\": \"52W High\",\n",
+ " \"fiftyTwoWeekLow\": \"52W Low\",\n",
+ " \"floatShares\": \"Floats\",\n",
+ " \"sharesShort\": \"Shorts\",\n",
+ " \"exDividendDate\": \"Ex-Div\",\n",
+ "}\n",
+ "\n",
+ "clean_data = {\n",
+ " \"sector\": lambda x: \"N/A\" if x is None else x,\n",
+ " \"marketCap\": lambda x: \"N/A\" if x is None else big_num(x),\n",
+ " \"beta\": lambda x: \"N/A\" if x is None else f\"{round(x,2)}\",\n",
+ " \"fiftyTwoWeekHigh\": lambda x: \"N/A\" if x is None else f\"${round(x,2)}\",\n",
+ " \"fiftyTwoWeekLow\": lambda x: \"N/A\" if x is None else f\"${round(x,2)}\",\n",
+ " \"floatShares\": lambda x: \"N/A\" if x is None else big_num(x),\n",
+ " \"sharesShort\": lambda x: \"N/A\" if x is None else big_num(x),\n",
+ " \"exDividendDate\": lambda x: \"N/A\"\n",
+ " if x is None\n",
+ " else datetime.fromtimestamp(x).strftime(\"%Y/%m/%d\"),\n",
+ "}\n",
+ "\n",
+ "\n",
+ "def big_num(num):\n",
+ " if num > 1_000_000_000_000:\n",
+ " return f\"{round(num/1_000_000_000_000,2)}T\"\n",
+ " if num > 1_000_000_000:\n",
+ " return f\"{round(num/1_000_000_000,2)}B\"\n",
+ " if num > 1_000_000:\n",
+ " return f\"{round(num/1_000_000,2)}M\"\n",
+ " if num > 1_000:\n",
+ " return f\"{num/round(1_000,2)}K\"\n",
+ " return f\"{round(num,2)}\"\n",
+ "\n",
+ "\n",
+ "def clean_str(string):\n",
+ " new_str = \"\"\n",
+ " for letter in string:\n",
+ " if letter.isupper():\n",
+ " new_str += \" \"\n",
+ " new_str += letter\n",
+ " return new_str.title()\n",
+ "\n",
+ "\n",
+ "def format_plotly(fig, data, start, end, chart, calc=None):\n",
+ " fig.update_yaxes(title=None)\n",
+ " fig.update_xaxes(title=None)\n",
+ " start_t = start.strftime(\"%Y/%m/%d\")\n",
+ " end_t = end.strftime(\"%Y/%m/%d\")\n",
+ " if calc:\n",
+ " if len(calc) == 1:\n",
+ " fig_title = f\"{calc[0]} of {data} from {start_t} to {end_t}\"\n",
+ " else:\n",
+ " fig_title = f\"{', '.join(calc)} of {data} from {start_t} to {end_t}\"\n",
+ " else:\n",
+ " fig_title = \"Volume\"\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, data, fig):\n",
+ " if visual == \"line\":\n",
+ " plot = go.Scatter(x=x, y=y[data], mode=\"lines\", name=name, connectgaps=True)\n",
+ " if visual == \"scatter\":\n",
+ " plot = go.Scatter(x=x, y=y[data], 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",
+ "\n",
+ "def table_data(infos):\n",
+ " cols = [\"Ticker\"] + list(infos)\n",
+ " data = pd.DataFrame(columns=cols)\n",
+ " data[\"Ticker\"] = [clean_row[x] for x in rows]\n",
+ " for ticker in list(infos):\n",
+ " data[ticker] = [clean_data[x](infos[ticker].get(x, None)) for x in rows]\n",
+ " new_cols = {k: clean_str(k) for k in rows}\n",
+ " return data"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "f8c2f65c",
+ "metadata": {
+ "tags": [
+ "parameters"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "class Chart:\n",
+ " def __init__(self):\n",
+ " self.last_tickers = \"\"\n",
+ " self.last_interval = \"1d\"\n",
+ " self.df = pd.DataFrame()\n",
+ " self.infos = {}\n",
+ "\n",
+ " def create_stock(\n",
+ " self, calculation, data, rolling, start, end, interval, tickers, chart\n",
+ " ):\n",
+ " if tickers and tickers[-1] == \",\":\n",
+ " if tickers != self.last_tickers or interval != self.last_interval:\n",
+ " if interval in [\"1d\", \"5d\", \"1wk\", \"1mo\", \"3mo\"]:\n",
+ " self.df = yf.download(\n",
+ " tickers, period=\"max\", interval=interval, progress=False\n",
+ " )\n",
+ " else:\n",
+ " end_date = end + timedelta(days=1)\n",
+ " self.df = yf.download(\n",
+ " tickers,\n",
+ " start=start,\n",
+ " end=end_date,\n",
+ " interval=interval,\n",
+ " progress=False,\n",
+ " )\n",
+ " self.last_tickers = tickers\n",
+ " self.last_interval = interval\n",
+ "\n",
+ " start_n = datetime(start.year, start.month, start.day)\n",
+ " end_n = datetime(end.year, end.month, end.day)\n",
+ " fig = go.Figure()\n",
+ " for item in calculation:\n",
+ " calcs = views[item](self.df, rolling)\n",
+ " if interval in [\"1d\", \"5d\", \"1wk\", \"1mo\", \"3mo\"]:\n",
+ " result = calcs.loc[\n",
+ " (calcs.index >= start_n) & (calcs.index <= end_n)\n",
+ " ]\n",
+ " else:\n",
+ " result = calcs\n",
+ "\n",
+ " if len(result.columns) == 6:\n",
+ " name = f\"{tickers.split(',')[0]} {item}\"\n",
+ " create_line(chart, result.index, result, name, data, fig)\n",
+ "\n",
+ " else:\n",
+ " for val in result.columns.levels[1]:\n",
+ " vals = result.xs(val, axis=1, level=1, drop_level=True)\n",
+ " name = f\"{val.upper()} {item}\"\n",
+ " create_line(chart, result.index, vals, name, data, fig)\n",
+ "\n",
+ " format_plotly(fig, data, start, end, \"main\", calculation)\n",
+ " show_fig(fig)\n",
+ "\n",
+ " def create_volume(self, start, end, interval, tickers):\n",
+ " start_n = datetime(start.year, start.month, start.day)\n",
+ " end_n = datetime(end.year, end.month, end.day)\n",
+ " result = self.df.loc[(self.df.index >= start_n) & (self.df.index <= end_n)]\n",
+ " fig = go.Figure()\n",
+ " if len(result.columns) == 6:\n",
+ " name = f\"{tickers.split(',')[0]}\"\n",
+ " create_line(\"line\", result.index, result, name, \"Volume\", fig)\n",
+ " else:\n",
+ " for val in result.columns.levels[1]:\n",
+ " vals = result.xs(val, axis=1, level=1, drop_level=True)\n",
+ " name = f\"{val.upper()}\"\n",
+ " create_line(\"line\", result.index, vals, name, \"Volume\", fig)\n",
+ " format_plotly(fig, \"Volume\", start, end, \"volume\")\n",
+ " show_fig(fig)\n",
+ "\n",
+ " def create_table(self, tickers):\n",
+ " if tickers and tickers[-1] == \",\":\n",
+ " clean_tickers = [x for x in tickers.split(\",\") if x]\n",
+ " for ticker in clean_tickers:\n",
+ " if ticker not in self.infos:\n",
+ " self.infos[ticker] = yf.Ticker(ticker).info\n",
+ " for ticker in self.infos:\n",
+ " if ticker not in tickers:\n",
+ " self.infos.pop(ticker)\n",
+ " result = table_data(self.infos)\n",
+ " fig = go.Figure(\n",
+ " data=[\n",
+ " go.Table(\n",
+ " header=dict(\n",
+ " values=result.columns,\n",
+ " fill_color=\"lightgray\",\n",
+ " font=dict(color=\"black\"),\n",
+ " align=\"left\",\n",
+ " ),\n",
+ " cells=dict(\n",
+ " values=[result[x] for x in result.columns],\n",
+ " font=dict(color=\"black\"),\n",
+ " align=\"left\",\n",
+ " ),\n",
+ " )\n",
+ " ],\n",
+ " )\n",
+ " fig.update_layout(margin=dict(l=0, r=20, t=0, b=0), width=350)\n",
+ " show_fig(fig)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "e0d4de31-1b4f-4c1f-8467-ca314a578d56",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "w_auto = widgets.Layout(width=\"auto\")\n",
+ "calc_widget = widgets.SelectMultiple(\n",
+ " options=list(views.keys()), value=[\"Raw Data\"], layout=w_auto\n",
+ ")\n",
+ "\n",
+ "data_opts = [\"Open\", \"Close\", \"High\", \"Low\"]\n",
+ "data_widget = widgets.Dropdown(\n",
+ " options=data_opts, value=\"Close\", layout=w_auto, description=\"Data\"\n",
+ ")\n",
+ "rolling_widget = widgets.Dropdown(\n",
+ " options=list(range(2, 101)), value=60, layout=w_auto, description=\"Rolling\"\n",
+ ")\n",
+ "\n",
+ "base_date = (datetime.today() - timedelta(days=365)).date()\n",
+ "start_widget = widgets.DatePicker(value=base_date, layout=w_auto, description=\"Start\")\n",
+ "end_widget = widgets.DatePicker(\n",
+ " value=datetime.today().date(), layout=w_auto, description=\"End\"\n",
+ ")\n",
+ "\n",
+ "interval_widget = widgets.Dropdown(\n",
+ " options=interval_opts, value=\"1d\", layout=w_auto, description=\"Interval\"\n",
+ ")\n",
+ "tickers_widget = widgets.Textarea(\n",
+ " value=\"TSLA,\", layout=widgets.Layout(width=\"auto\", height=\"100%\")\n",
+ ")\n",
+ "chart_opts = [\"line\", \"scatter\", \"candle\"]\n",
+ "chart_widget = widgets.Dropdown(\n",
+ " options=chart_opts, value=\"line\", layout=w_auto, description=\"Chart\"\n",
+ ")\n",
+ "data_box = widgets.VBox([data_widget, rolling_widget, chart_widget])\n",
+ "date_box = widgets.VBox([start_widget, end_widget, interval_widget])\n",
+ "controls = widgets.HBox(\n",
+ " [tickers_widget, calc_widget, date_box, data_box],\n",
+ " layout=widgets.Layout(width=\"90%\"),\n",
+ ")\n",
+ "chart = Chart()\n",
+ "stocks_view = widgets.interactive_output(\n",
+ " chart.create_stock,\n",
+ " {\n",
+ " \"calculation\": calc_widget,\n",
+ " \"data\": data_widget,\n",
+ " \"rolling\": rolling_widget,\n",
+ " \"start\": start_widget,\n",
+ " \"end\": end_widget,\n",
+ " \"interval\": interval_widget,\n",
+ " \"tickers\": tickers_widget,\n",
+ " \"chart\": chart_widget,\n",
+ " },\n",
+ ")\n",
+ "\n",
+ "volume_view = widgets.interactive_output(\n",
+ " chart.create_volume,\n",
+ " {\n",
+ " \"start\": start_widget,\n",
+ " \"end\": end_widget,\n",
+ " \"interval\": interval_widget,\n",
+ " \"tickers\": tickers_widget,\n",
+ " },\n",
+ ")\n",
+ "\n",
+ "table_view = widgets.interactive_output(chart.create_table, {\"tickers\": tickers_widget})\n",
+ "\n",
+ "charts = widgets.VBox(\n",
+ " [stocks_view, volume_view],\n",
+ " layout=widgets.Layout(width=\"100%\", padding=\"0\", margin=\"0\"),\n",
+ ")\n",
+ "figures = widgets.HBox(\n",
+ " [charts, table_view], layout=widgets.Layout(padding=\"0\", margin=\"0\")\n",
+ ")\n",
+ "\n",
+ "title_html = \"
Stock Analysis Dashboard
\"\n",
+ "warning_html = 'Use a comma after EVERY stock typed.
'\n",
+ "\n",
+ "app_contents = [widgets.HTML(title_html), controls, widgets.HTML(warning_html), figures]\n",
+ "app = widgets.VBox(app_contents)\n",
+ "display(app)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "8f33793c-adc9-4bc1-8fd4-aeff5a00ccba",
+ "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.8.12"
+ },
+ "metadata": {
+ "interpreter": {
+ "hash": "e896a00ead8b521528d79ac9ef24990696f2b751eb283ab8e0d078c9c4971ffc"
+ }
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/openbb_terminal/jupyter/dashboards/vsurf.ipynb b/openbb_terminal/jupyter/dashboards/vsurf.ipynb
new file mode 100644
index 00000000000..eff046fbefa
--- /dev/null
+++ b/openbb_terminal/jupyter/dashboards/vsurf.ipynb
@@ -0,0 +1,161 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "68b664c7-c52d-42c1-b170-575370323d22",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import os\n",
+ "import warnings\n",
+ "import sys\n",
+ "import ipywidgets as widgets\n",
+ "import plotly.graph_objects as go\n",
+ "import numpy as np\n",
+ "import pandas as pd\n",
+ "from IPython.display import display\n",
+ "from openbb_terminal import api as openbb\n",
+ "\n",
+ "warnings.filterwarnings(\"ignore\")\n",
+ "module_path = os.path.abspath(os.path.join(\"../..\"))\n",
+ "\n",
+ "if module_path not in sys.path:\n",
+ " sys.path.append(module_path)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "6c98dc75-6325-43da-93a2-1b8ec96bd368",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "z_dict = {\n",
+ " \"IV\": \"Implied Volatility\",\n",
+ " \"OI\": \"Open Interest\",\n",
+ " \"LP\": \"Last Price\",\n",
+ "}\n",
+ "strings = {\n",
+ " \"IV\": \"DTE: %{x}
Strike: %{y}
IV: %{z}\",\n",
+ " \"OI\": \"DTE: %{x}
Strike: %{y}
OI: %{z}\",\n",
+ " \"LP\": \"DTE: %{x}
Strike: %{y}
LP: %{z}\",\n",
+ "}\n",
+ "\n",
+ "\n",
+ "def create_layout(fig, width, height, z, ticker):\n",
+ " fig.update_layout(\n",
+ " title=f\"{z.upper()} Surface for {ticker.upper()}\",\n",
+ " autosize=False,\n",
+ " width=width,\n",
+ " height=height,\n",
+ " scene=dict(\n",
+ " xaxis_title=\"Days to Expiration\",\n",
+ " yaxis_title=\"Strike\",\n",
+ " zaxis_title=z_dict[z],\n",
+ " ),\n",
+ " )"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "c1bc5c6a-ccb2-4ef5-9c79-1f619fbf95a6",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "class Chart:\n",
+ " def __init__(self):\n",
+ " self.last_ticker = \"\"\n",
+ " self.df = pd.DataFrame()\n",
+ "\n",
+ " def create(self, z, ticker, height, width):\n",
+ " if ticker:\n",
+ " if ticker != self.last_ticker:\n",
+ " self.df = openbb.stocks.options.models.yfinance.get_iv_surface(ticker)\n",
+ " self.last_ticker = ticker\n",
+ "\n",
+ " if not self.df.empty:\n",
+ " z_dict = {\n",
+ " \"IV\": self.df.impliedVolatility,\n",
+ " \"OI\": self.df.openInterest,\n",
+ " \"LP\": self.df.lastPrice,\n",
+ " }\n",
+ " fig = go.Figure(\n",
+ " data=[\n",
+ " go.Mesh3d(\n",
+ " z=z_dict[z],\n",
+ " x=self.df.dte,\n",
+ " y=self.df.strike,\n",
+ " intensity=np.sqrt(z_dict[z]),\n",
+ " colorscale=\"Jet\",\n",
+ " hovertemplate=strings[z],\n",
+ " showscale=False,\n",
+ " )\n",
+ " ]\n",
+ " )\n",
+ "\n",
+ " create_layout(fig, height, width, z, ticker)\n",
+ " if os.environ.get(\"SERVER_SOFTWARE\", \"jupyter\").startswith(\"voila\"):\n",
+ " fig.show(config={\"showTips\": False}, renderer=\"notebook\")\n",
+ " else:\n",
+ " fig.show(config={\"showTips\": False})\n",
+ "\n",
+ "\n",
+ "opts = [\"IV\", \"OI\", \"LP\"]\n",
+ "z_widget = widgets.Dropdown(options=opts, value=\"IV\", description=\"Data\")\n",
+ "tickers_widget = widgets.Text(description=\"Ticker\", value=\"TSLA\")\n",
+ "h_widget = widgets.IntText(value=1000, description=\"Height\")\n",
+ "w_widget = widgets.IntText(value=1000, description=\"Width\")\n",
+ "\n",
+ "controls = widgets.VBox([tickers_widget, z_widget])\n",
+ "size = widgets.VBox([h_widget, w_widget])\n",
+ "controls = widgets.HBox([controls, size])\n",
+ "\n",
+ "chart = Chart()\n",
+ "stocks_view = widgets.interactive_output(\n",
+ " chart.create,\n",
+ " {\"z\": z_widget, \"ticker\": tickers_widget, \"height\": h_widget, \"width\": w_widget},\n",
+ ")\n",
+ "\n",
+ "title_html = \"Option Surface Dashboard
\"\n",
+ "app_contents = [\n",
+ " widgets.HTML(title_html),\n",
+ " controls,\n",
+ " stocks_view,\n",
+ "]\n",
+ "app = widgets.VBox(app_contents)\n",
+ "display(app)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "014f267a-92ba-4f23-afb1-9720d8a68cbb",
+ "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.8.12"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/openbb_terminal/jupyter/reports/crypto_market.ipynb b/openbb_terminal/jupyter/reports/crypto_market.ipynb
new file mode 100644
index 00000000000..41f571e9280
--- /dev/null
+++ b/openbb_terminal/jupyter/reports/crypto_market.ipynb
@@ -0,0 +1,273 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "elect-highway",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Import most generic modules\n",
+ "import os\n",
+ "import sys\n",
+ "from datetime import datetime\n",
+ "from IPython.display import display, Markdown\n",
+ "import warnings\n",
+ "\n",
+ "warnings.filterwarnings(\"ignore\")\n",
+ "module_path = os.path.abspath(os.path.join(\"../..\"))\n",
+ "\n",
+ "if module_path not in sys.path:\n",
+ " sys.path.append(module_path)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "fatty-colony",
+ "metadata": {
+ "tags": [
+ "parameters"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "report_name = f\"{datetime.now().strftime('%Y%m%d_%H%M%S')}_crypto_market\""
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "medieval-majority",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "display(Markdown(f\"# Crypto Market - {datetime.now().strftime('%Y/%m/%d %H:%M:%S')}\"))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "basic-sucking",
+ "metadata": {},
+ "source": [
+ "## Bitcoin Chart"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "318022a0",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from openbb_terminal.cryptocurrency import cryptocurrency_helpers\n",
+ "\n",
+ "coin_map_df = (\n",
+ " cryptocurrency_helpers.prepare_all_coins_df().set_index(\"Symbol\").loc[\"btc\"]\n",
+ ")\n",
+ "cryptocurrency_helpers.plot_chart(\n",
+ " coin=\"btc-bitcoin\", source=\"cp\", currency=\"USD\", days=60, coin_map_df=coin_map_df\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "animal-titanium",
+ "metadata": {},
+ "source": [
+ "## Global Market Information"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "artistic-stewart",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from openbb_terminal.cryptocurrency.overview import coinpaprika_view\n",
+ "\n",
+ "coinpaprika_view.display_global_market(export=\"\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "twelve-visiting",
+ "metadata": {},
+ "source": [
+ "## Top coins market information"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "photographic-payday",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from openbb_terminal.cryptocurrency.overview import coinpaprika_view\n",
+ "\n",
+ "coinpaprika_view.display_all_coins_market_info(\n",
+ " currency=\"USD\", sortby=\"volume_24h\", descend=True, top=10, export=\"\"\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "median-spirituality",
+ "metadata": {},
+ "source": [
+ "## Top gainers in last 24h"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "threaded-archives",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from openbb_terminal.cryptocurrency.discovery import pycoingecko_view\n",
+ "\n",
+ "pycoingecko_view.display_gainers(period=\"24h\", top=10, export=\"\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "recognized-intent",
+ "metadata": {},
+ "source": [
+ "## Top losers in last 24h"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "exceptional-objective",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from openbb_terminal.cryptocurrency.discovery import pycoingecko_view\n",
+ "\n",
+ "pycoingecko_view.display_losers(period=\"24h\", top=10, export=\"\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "rough-routine",
+ "metadata": {},
+ "source": [
+ "## Coins trending on coingecko"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "matched-syria",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from openbb_terminal.cryptocurrency.discovery import pycoingecko_view\n",
+ "\n",
+ "pycoingecko_view.display_trending(\n",
+ " export=\"\",\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "established-order",
+ "metadata": {},
+ "source": [
+ "## Decentralized Finance Global Market Info"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "artistic-grocery",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from openbb_terminal.cryptocurrency.overview import pycoingecko_view\n",
+ "\n",
+ "pycoingecko_view.display_global_defi_info(export=\"\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "elect-universe",
+ "metadata": {},
+ "source": [
+ "## Top DeFi Coins"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "configured-macedonia",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from openbb_terminal.cryptocurrency.discovery import pycoingecko_view\n",
+ "\n",
+ "pycoingecko_view.display_coins(\"decentralized-finance-defi\", top=10, export=\"\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "comparative-congo",
+ "metadata": {},
+ "source": [
+ "## Top Decentralized Exchanges"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "scientific-healthcare",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from openbb_terminal.cryptocurrency.discovery import dappradar_view\n",
+ "\n",
+ "dappradar_view.display_top_dexes(top=10, export=\"\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "knowing-imagination",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "!jupyter nbconvert {report_name + '.ipynb'} --to html --no-input"
+ ]
+ }
+ ],
+ "metadata": {
+ "celltoolbar": "Tags",
+ "interpreter": {
+ "hash": "158b8ab50e95ded652d8f2b468df64cac8eaa223c5e60f12cdaaeaccc6039b6d"
+ },
+ "kernelspec": {
+ "display_name": "Python 3.8.12 64-bit ('gst': conda)",
+ "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.9.10"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/openbb_terminal/jupyter/reports/dark_pool.ipynb b/openbb_terminal/jupyter/reports/dark_pool.ipynb
new file mode 100644
index 00000000000..782c8707a8b
--- /dev/null
+++ b/openbb_terminal/jupyter/reports/dark_pool.ipynb
@@ -0,0 +1,253 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "driven-billion",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Import most generic modules\n",
+ "import importlib\n",
+ "import pathlib\n",
+ "import os\n",
+ "import sys\n",
+ "from datetime import datetime, timedelta\n",
+ "import pandas as pd\n",
+ "from IPython.display import display, Markdown\n",
+ "import warnings\n",
+ "\n",
+ "warnings.filterwarnings(\"ignore\")\n",
+ "module_path = os.path.abspath(os.path.join(\"../..\"))\n",
+ "\n",
+ "if module_path not in sys.path:\n",
+ " sys.path.append(module_path)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "intended-sherman",
+ "metadata": {
+ "tags": [
+ "parameters"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "# Parameters that will be replaced when calling this notebook\n",
+ "ticker = \"AMC\"\n",
+ "\n",
+ "report_name = f\"{datetime.now().strftime('%Y%m%d_%H%M%S')}_dark_pool_{ticker.upper()}\""
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "mounted-phase",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "display(\n",
+ " Markdown(\n",
+ " f\"# {ticker.upper()} - Dark Pool - {datetime.now().strftime('%Y/%m/%d %H:%M:%S')}\"\n",
+ " )\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "capable-allergy",
+ "metadata": {},
+ "source": [
+ "## Top 10 Negative Dark Pool Positions"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "statewide-debate",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from openbb_terminal.stocks.dark_pool_shorts import stockgrid_view\n",
+ "\n",
+ "stockgrid_view.dark_pool_short_positions(\n",
+ " num=10, sort_field=\"dpp_dollar\", ascending=True, export=\"\"\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "artificial-tampa",
+ "metadata": {},
+ "source": [
+ "## Top 10 Most Highly Shorted Stocks"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "smaller-association",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from openbb_terminal.stocks.dark_pool_shorts import shortinterest_view\n",
+ "\n",
+ "shortinterest_view.high_short_interest(num=10, export=\"\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "cleared-contemporary",
+ "metadata": {},
+ "source": [
+ "## Dark Pool Activity"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "medical-tomato",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from openbb_terminal.stocks.dark_pool_shorts import stockgrid_view\n",
+ "\n",
+ "stockgrid_view.net_short_position(ticker=ticker.upper(), num=60, raw=False, export=\"\")\n",
+ "\n",
+ "stockgrid_view.net_short_position(ticker=ticker.upper(), num=10, raw=True, export=\"\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "comprehensive-nashville",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from openbb_terminal.stocks.dark_pool_shorts import stockgrid_view\n",
+ "\n",
+ "stockgrid_view.short_interest_volume(\n",
+ " ticker=ticker.upper(), num=60, raw=False, export=\"\"\n",
+ ")\n",
+ "\n",
+ "stockgrid_view.short_interest_volume(ticker=ticker.upper(), num=10, raw=True, export=\"\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "decreased-mills",
+ "metadata": {},
+ "source": [
+ "## Options info"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "medical-shaft",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from openbb_terminal.stocks.options import barchart_view\n",
+ "\n",
+ "barchart_view.print_options_data(ticker=ticker.upper(), export=\"\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "understood-houston",
+ "metadata": {},
+ "source": [
+ "## Put and Call Open Interest Expiring next"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "acute-burning",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from openbb_terminal.stocks.options import yfinance_model, yfinance_view\n",
+ "\n",
+ "selected_date = yfinance_model.option_expirations(ticker)[0]\n",
+ "options = yfinance_model.get_option_chain(ticker, selected_date)\n",
+ "\n",
+ "yfinance_view.plot_oi(\n",
+ " ticker=ticker,\n",
+ " expiry=selected_date,\n",
+ " min_sp=-1,\n",
+ " max_sp=-1,\n",
+ " calls_only=False,\n",
+ " puts_only=False,\n",
+ " export=\"\",\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "convinced-orleans",
+ "metadata": {},
+ "source": [
+ "## Failure-to-deliver (30 days lag)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "capital-narrow",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from openbb_terminal.stocks import stocks_helper\n",
+ "from openbb_terminal.stocks.dark_pool_shorts import sec_view\n",
+ "\n",
+ "stock = stocks_helper.load(ticker)\n",
+ "\n",
+ "sec_view.fails_to_deliver(\n",
+ " ticker=ticker.upper(),\n",
+ " stock=stock,\n",
+ " start=datetime.now() - timedelta(days=60),\n",
+ " end=datetime.now(),\n",
+ " num=0,\n",
+ " raw=False,\n",
+ " export=\"\",\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "above-prior",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "!jupyter nbconvert {report_name + \".ipynb\"} --to html --no-input"
+ ]
+ }
+ ],
+ "metadata": {
+ "celltoolbar": "Tags",
+ "kernelspec": {
+ "display_name": "",
+ "language": "python",
+ "name": ""
+ },
+ "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.8.6"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/openbb_terminal/jupyter/reports/due_dilligence.ipynb b/openbb_terminal/jupyter/reports/due_dilligence.ipynb
new file mode 100644
index 00000000000..728c5aac7b2
--- /dev/null
+++ b/openbb_terminal/jupyter/reports/due_dilligence.ipynb
@@ -0,0 +1,445 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "70ba2c8a",
+ "metadata": {},
+ "source": [
+ "## Notebook setup"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "driven-billion",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import io\n",
+ "import warnings\n",
+ "from datetime import datetime, timedelta\n",
+ "\n",
+ "import matplotlib.pyplot as plt\n",
+ "import matplotlib_inline.backend_inline\n",
+ "\n",
+ "from openbb_terminal import api as openbb\n",
+ "from openbb_terminal.helper_classes import TerminalStyle\n",
+ "\n",
+ "%matplotlib inline\n",
+ "matplotlib_inline.backend_inline.set_matplotlib_formats(\"svg\")\n",
+ "warnings.filterwarnings(\"ignore\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "c3fe7db5-ec6a-42cf-9e66-52dc1de22370",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "try:\n",
+ " theme = TerminalStyle(\"light\", \"light\", \"light\")\n",
+ "except:\n",
+ " pass\n",
+ "stylesheet = openbb.widgets.html_report_stylesheet()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "807fda4e",
+ "metadata": {},
+ "source": [
+ "## Select Ticker"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "intended-sherman",
+ "metadata": {
+ "tags": [
+ "parameters"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "# Parameters that will be replaced when calling this notebook\n",
+ "ticker = \"AMC\"\n",
+ "report_name = \"\""
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "1be26dae-cafe-4a22-80aa-eff296fc1a9b",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "ticker_data = openbb.stocks.load(ticker, start=datetime.now() - timedelta(days=365))\n",
+ "ticker_data = openbb.stocks.process_candle(ticker_data)\n",
+ "\n",
+ "report_title = f\"{ticker.upper()} Due Diligence report ({datetime.now().strftime('%Y-%m-%d %H:%M:%S')})\"\n",
+ "report_title"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "e3b15d6f-dc9e-4f97-aa07-37d949a4e4bb",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "overview = openbb.stocks.fa.models.yahoo_finance.get_info(ticker=ticker).transpose()[\n",
+ " \"Long business summary\"\n",
+ "][0]\n",
+ "overview"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "f8a0d747",
+ "metadata": {},
+ "source": [
+ "## Data"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "aca4b6ef",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "(\n",
+ " df_year_estimates,\n",
+ " df_quarter_earnings,\n",
+ " df_quarter_revenues,\n",
+ ") = openbb.stocks.dd.models.business_insider.get_estimates(ticker)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "b9c8feff",
+ "metadata": {
+ "tags": []
+ },
+ "source": [
+ "### 1. Yearly Estimates"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "c0f0a1ca",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "display_year = sorted(df_year_estimates.columns.tolist())[:3]\n",
+ "df_year_estimates = df_year_estimates[display_year].head(5)\n",
+ "df_year_estimates"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "64d3d490",
+ "metadata": {
+ "tags": []
+ },
+ "source": [
+ "### 2. Quarterly Earnings"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "fde46353",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "df_quarter_earnings"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "d13a1e5e",
+ "metadata": {
+ "tags": []
+ },
+ "source": [
+ "### 3. Quarterly Revenues"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "51dfd9d2",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "df_quarter_revenues"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "6303e520",
+ "metadata": {
+ "tags": []
+ },
+ "source": [
+ "### 4. SEC Filings"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "3022130e",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "df_sec_filings = openbb.stocks.dd.models.marketwatch.get_sec_filings(ticker)[\n",
+ " [\"Type\", \"Category\", \"Link\"]\n",
+ "].head(5)\n",
+ "df_sec_filings"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "1e201003",
+ "metadata": {
+ "tags": []
+ },
+ "source": [
+ "### 5. Analyst Ratings"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "4662b1ac",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "df_analyst = openbb.stocks.dd.models.finviz.get_analyst_data(ticker)\n",
+ "df_analyst[\"target_to\"] = df_analyst[\"target_to\"].combine_first(df_analyst[\"target\"])\n",
+ "df_analyst = df_analyst[[\"category\", \"analyst\", \"rating\", \"target_to\"]].rename(\n",
+ " columns={\n",
+ " \"category\": \"Category\",\n",
+ " \"analyst\": \"Analyst\",\n",
+ " \"rating\": \"Rating\",\n",
+ " \"target_to\": \"Price Target\",\n",
+ " }\n",
+ ")\n",
+ "df_analyst"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "ade589d6-d80f-4651-acb7-929943114ef0",
+ "metadata": {},
+ "source": [
+ "## Plots"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "621ed931-57e9-4ca6-afe8-8ef278122c77",
+ "metadata": {},
+ "source": [
+ "### 1. Price history"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "394668e1-1158-4a2b-8a38-04c72a6abdd6",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "fig, (candles, volume) = plt.subplots(nrows=2, ncols=1, figsize=(5, 3), dpi=150)\n",
+ "openbb.stocks.candle(\n",
+ " s_ticker=ticker,\n",
+ " df_stock=ticker_data,\n",
+ " use_matplotlib=True,\n",
+ " external_axes=[candles, volume],\n",
+ ")\n",
+ "candles.set_xticklabels(\"\")\n",
+ "fig.tight_layout()\n",
+ "\n",
+ "f = io.BytesIO()\n",
+ "fig.savefig(f, format=\"svg\")\n",
+ "price_chart = f.getvalue().decode(\"utf-8\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "bf07a909",
+ "metadata": {},
+ "source": [
+ "### 2. Price Target"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "900686a3",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "fig, ax = plt.subplots(figsize=(8, 3), dpi=150)\n",
+ "openbb.stocks.dd.pt(\n",
+ " ticker=ticker,\n",
+ " start=\"2021-10-25\",\n",
+ " interval=\"1440min\",\n",
+ " stock=ticker_data,\n",
+ " num=10,\n",
+ " raw=False,\n",
+ " external_axes=[ax],\n",
+ ")\n",
+ "fig.tight_layout()\n",
+ "f = io.BytesIO()\n",
+ "fig.savefig(f, format=\"svg\")\n",
+ "price_target_chart = f.getvalue().decode(\"utf-8\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "63c0538c",
+ "metadata": {},
+ "source": [
+ "### 3. Ratings over time"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "f3733ff2",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "fig, ax = plt.subplots(figsize=(8, 3), dpi=150)\n",
+ "openbb.stocks.dd.rot(\n",
+ " ticker=ticker,\n",
+ " num=10,\n",
+ " raw=False,\n",
+ " export=\"\",\n",
+ " external_axes=[ax],\n",
+ ")\n",
+ "fig.tight_layout()\n",
+ "f = io.BytesIO()\n",
+ "fig.savefig(f, format=\"svg\")\n",
+ "ratings_over_time_chart = f.getvalue().decode(\"utf-8\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "ac501a32-124d-4d21-aae1-a8d147bb1071",
+ "metadata": {},
+ "source": [
+ "## Render the report template to a file"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "mounted-phase",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "body = \"\""
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "abfe37e4-ea38-42c3-8fb5-7cceb233fb12",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Title\n",
+ "body += openbb.widgets.h(1, report_title)\n",
+ "\n",
+ "body += openbb.widgets.h(2, \"Overview\")\n",
+ "body += openbb.widgets.row([openbb.widgets.p(overview)])\n",
+ "\n",
+ "\n",
+ "# Analysts ratings\n",
+ "body += openbb.widgets.h(2, \"Analyst assessments\")\n",
+ "body += openbb.widgets.row([price_target_chart])\n",
+ "body += openbb.widgets.row([df_analyst.to_html()])\n",
+ "body += openbb.widgets.row([ratings_over_time_chart])\n",
+ "\n",
+ "# Price history and yearly estimates\n",
+ "body += openbb.widgets.row(\n",
+ " [\n",
+ " openbb.widgets.h(3, \"Price history\") + price_chart,\n",
+ " openbb.widgets.h(3, \"Estimates\") + df_year_estimates.head().to_html(),\n",
+ " ]\n",
+ ")\n",
+ "\n",
+ "# Earnings and revenues\n",
+ "body += openbb.widgets.h(2, \"Earnings and revenues\")\n",
+ "body += openbb.widgets.row([df_quarter_earnings.head().to_html()])\n",
+ "body += openbb.widgets.row([df_quarter_revenues.head().to_html()])\n",
+ "\n",
+ "# Sec filings and insider trading\n",
+ "body += openbb.widgets.h(2, \"SEC filings\")\n",
+ "body += openbb.widgets.row([df_sec_filings.to_html()])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "eb26492f-d13f-4302-b36d-ea8ee0020f82",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "report = openbb.widgets.html_report(title=report_name, stylesheet=stylesheet, body=body)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "ee07c30c-9b38-4035-b128-20b7c9989951",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# to save the results\n",
+ "with open(report_name + \".html\", \"w\") as fh:\n",
+ " fh.write(report)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "34991096-bc3a-4134-b519-aa3a490abe98",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "metadata": {
+ "celltoolbar": "Tags",
+ "interpreter": {
+ "hash": "31090e8428bc3cbe850895ffb75aca3a30f914a21038b56ab61f04d2ddd7301b"
+ },
+ "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.8.12"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/openbb_terminal/jupyter/reports/econ_data.ipynb b/openbb_terminal/jupyter/reports/econ_data.ipynb
new file mode 100644
index 00000000000..c4e9799de42
--- /dev/null
+++ b/openbb_terminal/jupyter/reports/econ_data.ipynb
@@ -0,0 +1,648 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "another-behalf",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Import most generic modules\n",
+ "import importlib\n",
+ "import pathlib\n",
+ "import os\n",
+ "import sys\n",
+ "from datetime import datetime\n",
+ "from IPython.display import display, Markdown\n",
+ "import warnings\n",
+ "\n",
+ "warnings.filterwarnings(\"ignore\")\n",
+ "module_path = os.path.abspath(os.path.join(\"../..\"))\n",
+ "\n",
+ "if module_path not in sys.path:\n",
+ " sys.path.append(module_path)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "racial-graduation",
+ "metadata": {
+ "tags": [
+ "parameters"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "report_name = f\"{datetime.now().strftime('%Y%m%d_%H%M%S')}_econ_data\""
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "commercial-cargo",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "display(Markdown(f\"# Economy Data - {datetime.now().strftime('%Y/%m/%d %H:%M:%S')}\"))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "informative-behavior",
+ "metadata": {},
+ "source": [
+ "## Dow Jones - 2 year trend with 20, 50 and 200 day SMA"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "stylish-elite",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from openbb_terminal.economy import econ_data_helper\n",
+ "\n",
+ "econ_data_helper.draw_graph(\n",
+ " \"^DJI\",\n",
+ " \"\",\n",
+ " line_type=\"line\",\n",
+ " draw_mas=(20, 50, 200),\n",
+ " draw_volume=True,\n",
+ " time_delta=720,\n",
+ " low_trend=False,\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "fifty-happiness",
+ "metadata": {},
+ "source": [
+ "## Dow Jones - 1 year trend with 20, 50 and 200 day SMA"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "identical-classification",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from openbb_terminal.economy import econ_data_helper\n",
+ "\n",
+ "econ_data_helper.draw_graph(\n",
+ " \"^DJI\",\n",
+ " \"\",\n",
+ " line_type=\"line\",\n",
+ " draw_mas=(20, 50, 200),\n",
+ " draw_volume=True,\n",
+ " time_delta=360,\n",
+ " low_trend=True,\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "boxed-turning",
+ "metadata": {},
+ "source": [
+ "## S&P 500 - 2 year trend with 20, 50 and 200 day SMA"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "threaded-language",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from openbb_terminal.economy import econ_data_helper\n",
+ "\n",
+ "econ_data_helper.draw_graph(\n",
+ " \"^GSPC\",\n",
+ " \"\",\n",
+ " line_type=\"line\",\n",
+ " draw_mas=(20, 50, 200),\n",
+ " draw_volume=True,\n",
+ " time_delta=720,\n",
+ " low_trend=False,\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "fleet-transparency",
+ "metadata": {},
+ "source": [
+ "## Market Volatility (VIX) - 2 year trend with 20, 50 and 200 day SMA"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "disturbed-workstation",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from openbb_terminal.economy import econ_data_helper\n",
+ "\n",
+ "econ_data_helper.draw_graph(\n",
+ " \"^VIX\",\n",
+ " \"\",\n",
+ " line_type=\"line\",\n",
+ " draw_mas=(20, 50, 200),\n",
+ " draw_volume=False,\n",
+ " time_delta=720,\n",
+ " high_trend=False,\n",
+ " low_trend=False,\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "civilian-november",
+ "metadata": {},
+ "source": [
+ "## Market Volatility (VIX) - 1 year trend with 20, 50 and 200 day SMA"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "several-inventory",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from openbb_terminal.economy import econ_data_helper\n",
+ "\n",
+ "econ_data_helper.draw_graph(\n",
+ " \"^VIX\",\n",
+ " \"\",\n",
+ " line_type=\"line\",\n",
+ " draw_mas=(20, 50, 200),\n",
+ " draw_volume=False,\n",
+ " time_delta=360,\n",
+ " high_trend=False,\n",
+ " low_trend=False,\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "bizarre-record",
+ "metadata": {},
+ "source": [
+ "## Yield on 5-Year US Treasury Notes - 2 year trend with 20, 50 and 200 day SMA"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "military-temperature",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from openbb_terminal.economy import econ_data_helper\n",
+ "\n",
+ "econ_data_helper.draw_graph(\n",
+ " \"^FVX\",\n",
+ " \"\",\n",
+ " line_type=\"line\",\n",
+ " draw_mas=(20, 50, 200),\n",
+ " draw_volume=False,\n",
+ " time_delta=720,\n",
+ " low_trend=False,\n",
+ " high_trend=False,\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "greater-party",
+ "metadata": {},
+ "source": [
+ "## Yield on 10-Year US Treasury Notes - 2 year trend with 20, 50 and 200 day SMA"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "aboriginal-violin",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from openbb_terminal.economy import econ_data_helper\n",
+ "\n",
+ "econ_data_helper.draw_graph(\n",
+ " \"^TNX\",\n",
+ " \"\",\n",
+ " line_type=\"line\",\n",
+ " draw_mas=(20, 50, 200),\n",
+ " draw_volume=False,\n",
+ " time_delta=720,\n",
+ " low_trend=False,\n",
+ " high_trend=False,\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "continent-sally",
+ "metadata": {},
+ "source": [
+ "## Yield on 30-Year US Treasury Notes - 2 year trend with 20, 50 and 200 day SMA"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "formed-heating",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from openbb_terminal.economy import econ_data_helper\n",
+ "\n",
+ "econ_data_helper.draw_graph(\n",
+ " \"^TYX\",\n",
+ " \"\",\n",
+ " line_type=\"line\",\n",
+ " draw_mas=(20, 50, 200),\n",
+ " draw_volume=False,\n",
+ " time_delta=720,\n",
+ " low_trend=False,\n",
+ " high_trend=False,\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "handled-insurance",
+ "metadata": {},
+ "source": [
+ "## Gold - 2 year trend with 20, 50 and 200 day SMA"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "advisory-johnston",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from openbb_terminal.economy import econ_data_helper\n",
+ "\n",
+ "econ_data_helper.draw_graph(\n",
+ " \"GLD\",\n",
+ " \"\",\n",
+ " line_type=\"line\",\n",
+ " draw_mas=(20, 50, 200),\n",
+ " draw_volume=True,\n",
+ " time_delta=720,\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "played-writer",
+ "metadata": {},
+ "source": [
+ "## Silver - 2 year trend with 20, 50 and 200 day SMA"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "light-harvest",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from openbb_terminal.economy import econ_data_helper\n",
+ "\n",
+ "econ_data_helper.draw_graph(\n",
+ " \"SLV\",\n",
+ " \"\",\n",
+ " line_type=\"line\",\n",
+ " draw_mas=(20, 50, 200),\n",
+ " draw_volume=True,\n",
+ " time_delta=720,\n",
+ " low_trend=False,\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "floral-giant",
+ "metadata": {},
+ "source": [
+ "## Euro vs US Dollar - 2 year trend with 20, 50 and 200 day SMA"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "corrected-estimate",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from openbb_terminal.economy import econ_data_helper\n",
+ "\n",
+ "econ_data_helper.draw_graph(\n",
+ " \"FXE\",\n",
+ " \"\",\n",
+ " line_type=\"line\",\n",
+ " draw_mas=(20, 50, 200),\n",
+ " draw_volume=True,\n",
+ " time_delta=720,\n",
+ " low_trend=True,\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "neither-montana",
+ "metadata": {},
+ "source": [
+ "## Yen vs US Dollar - 2 year trend with 20, 50 and 200 day SMA"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "middle-geneva",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from openbb_terminal.economy import econ_data_helper\n",
+ "\n",
+ "econ_data_helper.draw_graph(\n",
+ " \"FXY\",\n",
+ " \"\",\n",
+ " line_type=\"line\",\n",
+ " draw_mas=(20, 50, 200),\n",
+ " draw_volume=True,\n",
+ " time_delta=720,\n",
+ " low_trend=True,\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "theoretical-grammar",
+ "metadata": {},
+ "source": [
+ "## Energy - 2 year trend with 20, 50 and 200 day SMA"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "swedish-thickness",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from openbb_terminal.economy import econ_data_helper\n",
+ "\n",
+ "econ_data_helper.draw_graph(\n",
+ " \"XLE\",\n",
+ " \"\",\n",
+ " line_type=\"line\",\n",
+ " draw_mas=(20, 50, 200),\n",
+ " draw_volume=True,\n",
+ " time_delta=720,\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "gentle-humor",
+ "metadata": {},
+ "source": [
+ "## Crude Oil - 2 year trend with 20, 50 and 200 day SMA"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "instructional-serve",
+ "metadata": {
+ "scrolled": false
+ },
+ "outputs": [],
+ "source": [
+ "from openbb_terminal.economy import econ_data_helper\n",
+ "\n",
+ "econ_data_helper.draw_graph(\n",
+ " \"CL=F\",\n",
+ " \"\",\n",
+ " line_type=\"line\",\n",
+ " draw_mas=(20, 50, 200),\n",
+ " draw_volume=True,\n",
+ " time_delta=720,\n",
+ " low_trend=False,\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "classical-listening",
+ "metadata": {},
+ "source": [
+ "## Real Estate - 2 year trend with 20, 50 and 200 day SMA"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "enclosed-administration",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from openbb_terminal.economy import econ_data_helper\n",
+ "\n",
+ "econ_data_helper.draw_graph(\n",
+ " \"XLRE\",\n",
+ " \"\",\n",
+ " line_type=\"line\",\n",
+ " draw_mas=(20, 50, 200),\n",
+ " draw_volume=True,\n",
+ " time_delta=720,\n",
+ " low_trend=False,\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "turned-percentage",
+ "metadata": {},
+ "source": [
+ "## Real Estate - 1 year trend with 20, 50 and 200 day SMA"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "sharing-removal",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from openbb_terminal.economy import econ_data_helper\n",
+ "\n",
+ "econ_data_helper.draw_graph(\n",
+ " \"VNQ\",\n",
+ " \"\",\n",
+ " line_type=\"line\",\n",
+ " draw_mas=(20, 50, 200),\n",
+ " draw_volume=True,\n",
+ " time_delta=360,\n",
+ " low_trend=True,\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "swedish-happiness",
+ "metadata": {},
+ "source": [
+ "## Financials - 2 year trend with 20, 50 and 200 day SMA"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "beginning-aspect",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from openbb_terminal.economy import econ_data_helper\n",
+ "\n",
+ "econ_data_helper.draw_graph(\n",
+ " \"XLF\",\n",
+ " \"\",\n",
+ " line_type=\"line\",\n",
+ " draw_mas=(20, 50, 200),\n",
+ " draw_volume=True,\n",
+ " time_delta=720,\n",
+ " low_trend=False,\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "restricted-glucose",
+ "metadata": {},
+ "source": [
+ "## Financials - 1 year trend with 20, 50 and 200 day SMA"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "personal-whole",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from openbb_terminal.economy import econ_data_helper\n",
+ "\n",
+ "econ_data_helper.draw_graph(\n",
+ " \"XLF\",\n",
+ " \"\",\n",
+ " line_type=\"line\",\n",
+ " draw_mas=(20, 50, 200),\n",
+ " draw_volume=True,\n",
+ " time_delta=360,\n",
+ " low_trend=True,\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "detailed-strike",
+ "metadata": {},
+ "source": [
+ "## Materials - 2 year trend with 20, 50 and 200 day SMA"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "negative-mitchell",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from openbb_terminal.economy import econ_data_helper\n",
+ "\n",
+ "econ_data_helper.draw_graph(\n",
+ " \"XLB\",\n",
+ " \"\",\n",
+ " line_type=\"line\",\n",
+ " draw_mas=(20, 50, 200),\n",
+ " draw_volume=True,\n",
+ " time_delta=720,\n",
+ " low_trend=False,\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "boolean-rotation",
+ "metadata": {},
+ "source": [
+ "## Materials - 1 year trend with 20, 50 and 200 day SMA"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "settled-orange",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from openbb_terminal.economy import econ_data_helper\n",
+ "\n",
+ "econ_data_helper.draw_graph(\n",
+ " \"XLB\",\n",
+ " \"\",\n",
+ " line_type=\"line\",\n",
+ " draw_mas=(20, 50, 200),\n",
+ " draw_volume=True,\n",
+ " time_delta=360,\n",
+ " low_trend=True,\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "premium-transportation",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "!jupyter nbconvert {report_name + \".ipynb\"} --to html --no-input"
+ ]
+ }
+ ],
+ "metadata": {
+ "celltoolbar": "Tags",
+ "kernelspec": {
+ "display_name": "",
+ "language": "python",
+ "name": ""
+ },
+ "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.8.6"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/openbb_terminal/jupyter/reports/similar_analysis.ipynb b/openbb_terminal/jupyter/reports/similar_analysis.ipynb
new file mode 100644
index 00000000000..9c19548df0f
--- /dev/null
+++ b/openbb_terminal/jupyter/reports/similar_analysis.ipynb
@@ -0,0 +1,397 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "phantom-facility",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Import most generic modules\n",
+ "import importlib\n",
+ "import pathlib\n",
+ "import os\n",
+ "import sys\n",
+ "from datetime import datetime, timedelta\n",
+ "import pandas as pd\n",
+ "from IPython.display import display, Markdown\n",
+ "import warnings\n",
+ "\n",
+ "warnings.filterwarnings(\"ignore\")\n",
+ "module_path = os.path.abspath(os.path.join(\"../..\"))\n",
+ "\n",
+ "if module_path not in sys.path:\n",
+ " sys.path.append(module_path)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "compact-count",
+ "metadata": {
+ "tags": [
+ "parameters"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "# Parameters that will be replaced when calling this notebook\n",
+ "ticker = \"TSLA\"\n",
+ "\n",
+ "report_name = f\"{datetime.now().strftime('%Y%m%d_%H%M%S')}_comparison_{ticker.upper()}\""
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "possible-constraint",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "display(\n",
+ " Markdown(\n",
+ " f\"# {ticker.upper()} - Comparison - {datetime.now().strftime('%Y/%m/%d %H:%M:%S')}\"\n",
+ " )\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "b9eaca4a-a46d-45a3-9306-e80e74234f12",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from openbb_terminal.stocks.comparison_analysis import (\n",
+ " finviz_compare_model,\n",
+ " yahoo_finance_model,\n",
+ ")\n",
+ "\n",
+ "ticker = ticker.upper()\n",
+ "finviz_similar = finviz_compare_model.get_similar_companies(\n",
+ " ticker, [\"Sector\", \"Industry\", \"Country\"]\n",
+ ")[0]"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "ffea4266-e801-4a4e-8cac-3d60e735aa4e",
+ "metadata": {},
+ "source": [
+ "### Similar companies and descriptions"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "21122245-457b-4347-b89f-d4aabb5bdc9a",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from openbb_terminal.stocks.fundamental_analysis import yahoo_finance_model\n",
+ "\n",
+ "df_info = yahoo_finance_model.get_info(ticker)\n",
+ "if \"Long business summary\" in df_info.index:\n",
+ " summary = df_info.loc[\"Long business summary\"].values[0]\n",
+ "if \"Website\" in df_info.index:\n",
+ " website = df_info.loc[\"Website\"].values[0]\n",
+ "\n",
+ "if finviz_similar:\n",
+ " print(f\"{ticker}: {website}\")\n",
+ " print(summary)\n",
+ "\n",
+ " for symbol in finviz_similar:\n",
+ " df_info = yahoo_finance_model.get_info(symbol)\n",
+ " if \"Long business summary\" in df_info.index:\n",
+ " summary = df_info.loc[\"Long business summary\"].values[0]\n",
+ " if \"Website\" in df_info.index:\n",
+ " website = df_info.loc[\"Website\"].values[0]\n",
+ "\n",
+ " print(\"\")\n",
+ " print(f\"{symbol}: {website}\")\n",
+ " print(summary)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "temporal-clerk",
+ "metadata": {
+ "tags": []
+ },
+ "source": [
+ "### Historical prices"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "1fdfac4c-62cd-4bd3-b7df-41ba67263798",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import math\n",
+ "from openbb_terminal.stocks.comparison_analysis import yahoo_finance_view\n",
+ "\n",
+ "if finviz_similar and finviz_similar != [\"\"]:\n",
+ " for i in range(math.ceil(len(finviz_similar) / 4)):\n",
+ " yahoo_finance_view.display_historical(\n",
+ " similar_tickers=finviz_similar[4 * (i) : 4 * (i + 1)],\n",
+ " )\n",
+ "else:\n",
+ " print(\"Ticker not found in CoinGeckoAPI\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "2a07f866-7939-4fb7-8b14-c0701087a8ae",
+ "metadata": {},
+ "source": [
+ "### Historical correlation"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "eb1850dc-1d62-4ad4-971f-1bbce6209726",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from matplotlib import pyplot as plt\n",
+ "\n",
+ "if finviz_similar and finviz_similar != [\"\"]:\n",
+ " plt.figure(figsize=(25, 10))\n",
+ " yahoo_finance_view.display_correlation(\n",
+ " similar_tickers=finviz_similar,\n",
+ " )\n",
+ "else:\n",
+ " print(\"Ticker not found in CoinGeckoAPI\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "21005668-7f21-4884-a231-846130695602",
+ "metadata": {
+ "tags": []
+ },
+ "source": [
+ "### Historical volumes"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "a7bf528c-427c-4d84-8cb9-ec5656f920e1",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "if finviz_similar and finviz_similar != [\"\"]:\n",
+ " for i in range(math.ceil(len(finviz_similar) / 4)):\n",
+ " yahoo_finance_view.display_volume(\n",
+ " similar_tickers=finviz_similar[4 * (i) : 4 * (i + 1)],\n",
+ " )\n",
+ "else:\n",
+ " print(\"Ticker not found in CoinGeckoAPI\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "6e370470-8014-4e97-95f2-13b4f66645c5",
+ "metadata": {
+ "tags": []
+ },
+ "source": [
+ "### Overview"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "f82b7162-f7e5-4d5c-8ca9-50466f789f48",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from openbb_terminal.stocks.comparison_analysis import finviz_compare_view\n",
+ "\n",
+ "if finviz_similar and finviz_similar != [\"\"]:\n",
+ " finviz_compare_view.screener(\n",
+ " similar=finviz_similar,\n",
+ " data_type=\"overview\",\n",
+ " )\n",
+ "else:\n",
+ " print(\"Ticker not found in CoinGeckoAPI\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "5277ae24-b7d7-48e6-b46c-fcffdf84631f",
+ "metadata": {
+ "tags": []
+ },
+ "source": [
+ "### Valuation"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "caed21ad-a31d-4063-a4cb-f5b6fd1c63ed",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from openbb_terminal.stocks.comparison_analysis import finviz_compare_view\n",
+ "\n",
+ "if finviz_similar and finviz_similar != [\"\"]:\n",
+ " finviz_compare_view.screener(\n",
+ " similar=finviz_similar,\n",
+ " data_type=\"valuation\",\n",
+ " )\n",
+ "else:\n",
+ " print(\"Ticker not found in CoinGeckoAPI\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "98030d12-9a77-4f08-b4ad-2c558d9ad225",
+ "metadata": {
+ "tags": []
+ },
+ "source": [
+ "### Financial"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "e98bf90d-bf2b-4eea-b533-08211e8eec47",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from openbb_terminal.stocks.comparison_analysis import finviz_compare_view\n",
+ "\n",
+ "if finviz_similar and finviz_similar != [\"\"]:\n",
+ " finviz_compare_view.screener(\n",
+ " similar=finviz_similar,\n",
+ " data_type=\"financial\",\n",
+ " )\n",
+ "else:\n",
+ " print(\"Ticker not found in CoinGeckoAPI\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "f7cf8774-5162-47ea-8bfe-5005ed2fb9d9",
+ "metadata": {
+ "tags": []
+ },
+ "source": [
+ "### Ownership"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "d3f90d1f-7a40-403f-bf3e-17703e151f4b",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from openbb_terminal.stocks.comparison_analysis import finviz_compare_view\n",
+ "\n",
+ "if finviz_similar and finviz_similar != [\"\"]:\n",
+ " finviz_compare_view.screener(\n",
+ " similar=finviz_similar,\n",
+ " data_type=\"ownership\",\n",
+ " )\n",
+ "else:\n",
+ " print(\"Ticker not found in CoinGeckoAPI\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "c1833238-5ea8-486b-a6e7-6043e7c0aa0e",
+ "metadata": {
+ "tags": []
+ },
+ "source": [
+ "### Performance"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "62057b47-2364-49ed-80e7-7d6938f2819d",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from openbb_terminal.stocks.comparison_analysis import finviz_compare_view\n",
+ "\n",
+ "if finviz_similar and finviz_similar != [\"\"]:\n",
+ " finviz_compare_view.screener(\n",
+ " similar=finviz_similar,\n",
+ " data_type=\"performance\",\n",
+ " )\n",
+ "else:\n",
+ " print(\"Ticker not found in CoinGeckoAPI\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "6d0494c0-e66a-414a-ba2d-89e4072e1a8f",
+ "metadata": {
+ "tags": []
+ },
+ "source": [
+ "### Technical"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "1178a080-83ce-4170-a355-9faa8cf9abe6",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from openbb_terminal.stocks.comparison_analysis import finviz_compare_view\n",
+ "\n",
+ "if finviz_similar and finviz_similar != [\"\"]:\n",
+ " finviz_compare_view.screener(\n",
+ " similar=finviz_similar,\n",
+ " data_type=\"technical\",\n",
+ " )\n",
+ "else:\n",
+ " print(\"Ticker not found in CoinGeckoAPI\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "sought-phase",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "!jupyter nbconvert {report_name + \".ipynb\"} --to html --no-input"
+ ]
+ }
+ ],
+ "metadata": {
+ "celltoolbar": "Tags",
+ "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.8.12"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/website/content/api/_index.md b/website/content/api/_index.md
index f3c60f94325..3772f781996 100644
--- a/website/content/api/_index.md
+++ b/website/content/api/_index.md
@@ -20,7 +20,7 @@ scripts and IPython Notebooks (Jupyter).
The API wraps the functionality of the terminal in a way that the python commands follow
the same convention as the terminal.
-For example `stocks/load aapl` becomes `gst.stocks.load("aapl")`.
+For example `stocks/load aapl` becomes `openbb.stocks.load("aapl")`.
---
@@ -29,7 +29,7 @@ For example `stocks/load aapl` becomes `gst.stocks.load("aapl")`.
Import the GST API into your python script or notebook with
```python
-from openbb_terminal import api as gst
+from openbb_terminal import api as openbb
```
## Understanding the API functions
@@ -39,7 +39,7 @@ docstring. Docstrings can be viewed using the code introspection tools of your
text/notebook editor or the built-in python `help` command. Docstrings contain both the
description of the functionality and the overview of the parameters.
-As an example this is the docstring of `gst.economy.bigmac`:
+As an example this is the docstring of `openbb.economy.bigmac`:
```txt
Display Big Mac Index for given countries
@@ -61,47 +61,47 @@ external_axes : Optional[List[plt.Axes]], optional
Load stock data into a dataframe:
```python
-aapl_data = gst.stocks.load(
+aapl_data = openbb.stocks.load(
ticker="aapl",
start="2021-06-10",
)
-aapl_data = gst.stocks.process_candle(aapl_data)
+aapl_data = openbb.stocks.process_candle(aapl_data)
```
Plot candle chart
```python
-gst.stocks.candle("AAPL", aapl_data, True)
+openbb.stocks.candle("AAPL", aapl_data, True)
```
Call the "What if" command of the backtesting menu
```python
-gst.stocks.bt.whatif("aapl", 10, datetime.strptime("2012-03-03", "%Y-%m-%d"))
+openbb.stocks.bt.whatif("aapl", 10, datetime.strptime("2012-03-03", "%Y-%m-%d"))
```
Get sentiment for a list of tickers
```python
-gst.stocks.ca.models.finbrain.get_sentiments(tickers=["aapl"])
+openbb.stocks.ca.models.finbrain.get_sentiments(tickers=["aapl"])
```
Print key fundamental metrics for past 2 years
```python
-gst.stocks.fa.fmp.metrics(ticker="AAPL", number=2)
+openbb.stocks.fa.fmp.metrics(ticker="AAPL", number=2)
```
Get fundamental metrics for past 3 years as a pandas dataframe
```python
-gst.stocks.fa.fmp.models.fmp.get_key_metrics(ticker="AAPL", number=3)
+openbb.stocks.fa.fmp.models.fmp.get_key_metrics(ticker="AAPL", number=3)
```
Perform an OLS regression on multiple custom datasets
```python
-gst.econometrics.ols(
+openbb.econometrics.ols(
regression_variables=[
'close-tsla', 'volume-aapl'
],
@@ -124,14 +124,14 @@ Example:
```python
# Load stock data
ticker = "AAPL"
-stock_data = gst.stocks.load(ticker="aapl")
+stock_data = openbb.stocks.load(ticker="aapl")
# Create a matplotlib figure
fig, axes = plt.subplots(3, 1, figsize=(10, 7))
# Use GST to add charts to the axes of the created figure
-gst.stocks.ta.macd(s_ticker=ticker, series=aapl["Close"], external_axes=axes[0:2])
-gst.stocks.options.voi_yf(
+openbb.stocks.ta.macd(s_ticker=ticker, series=aapl["Close"], external_axes=axes[0:2])
+openbb.stocks.options.voi_yf(
ticker=ticker,
expiry="2022-03-11",
min_sp=110,
diff --git a/website/content/terminal/portfolio/load/_index.md b/website/content/terminal/portfolio/load/_index.md
index 8f073f53981..1e1edc3a1b0 100644
--- a/website/content/terminal/portfolio/load/_index.md
+++ b/website/content/terminal/portfolio/load/_index.md
@@ -2,7 +2,7 @@
usage: load [-n NAME] [-h]
```
-Load a file from gamestonk_terminal/portfolio/portfolios
+Load a file from openbb_terminal/portfolio/portfolios
```
optional arguments:
diff --git a/website/content/terminal/portfolio/save/_index.md b/website/content/terminal/portfolio/save/_index.md
index cbfdce38b11..0326cd409d9 100644
--- a/website/content/terminal/portfolio/save/_index.md
+++ b/website/content/terminal/portfolio/save/_index.md
@@ -2,7 +2,7 @@
usage: save [-n NAME] [-h]
```
-Save a file from gamestonk_terminal/portfolio/portfolios
+Save a file from openbb_terminal/portfolio/portfolios
```
optional arguments: