From 59cecedc47ce5edc584d67e0bd8bd3d65b25d224 Mon Sep 17 00:00:00 2001 From: jmaslek Date: Sun, 14 Nov 2021 01:34:19 -0500 Subject: [PATCH] Add NASDAQ datalink retail trader dataset (#941) Co-authored-by: James Maslek --- .../stocks/discovery/disc_controller.py | 35 +++++++++++++++- .../stocks/discovery/nasdaq_model.py | 25 +++++++++++ .../stocks/discovery/nasdaq_view.py | 41 +++++++++++++++++++ .../content/stocks/discovery/rtat/_index.md | 14 +++++++ website/data/menu/main.yml | 2 + 5 files changed, 116 insertions(+), 1 deletion(-) create mode 100644 gamestonk_terminal/stocks/discovery/nasdaq_model.py create mode 100644 gamestonk_terminal/stocks/discovery/nasdaq_view.py create mode 100644 website/content/stocks/discovery/rtat/_index.md diff --git a/gamestonk_terminal/stocks/discovery/disc_controller.py b/gamestonk_terminal/stocks/discovery/disc_controller.py index 5138cf5c9fc..53f28921ab6 100644 --- a/gamestonk_terminal/stocks/discovery/disc_controller.py +++ b/gamestonk_terminal/stocks/discovery/disc_controller.py @@ -10,7 +10,7 @@ from matplotlib import pyplot as plt from prompt_toolkit.completion import NestedCompleter from gamestonk_terminal import feature_flags as gtff -from gamestonk_terminal.helper_funcs import get_flair +from gamestonk_terminal.helper_funcs import EXPORT_ONLY_RAW_DATA_ALLOWED, get_flair from gamestonk_terminal.helper_funcs import ( parse_known_args_and_warn, check_non_negative, @@ -30,6 +30,7 @@ from gamestonk_terminal.stocks.discovery import ( finnhub_view, geekofwallstreet_view, financedatabase_view, + nasdaq_view, ) @@ -64,6 +65,7 @@ class DiscoveryController: "rtearn", "fds", "cnews", + "rtat", ] CHOICES += CHOICES_COMMANDS @@ -113,6 +115,8 @@ pennystockflow.com hotpenny today's hot penny stocks Finance Database: fds advanced Equities search based on country, sector, industry, name and/or description +NASDAQ Data Link (Formerly Quandl): + rtat top 10 retail traded stocks per day """ print(help_text) @@ -1008,6 +1012,35 @@ Finance Database: options=ns_parser.options, ) + @try_except + def call_rtat(self, other_args: List[str]): + """Process fds command""" + parser = argparse.ArgumentParser( + add_help=False, + formatter_class=argparse.ArgumentDefaultsHelpFormatter, + prog="rtat", + description=""" + Tracking over $30B USD/day of individual investors trades, + RTAT gives a daily view into retail activity and sentiment for over 9,500 US traded stocks, + ADRs, and ETPs + """, + ) + parser.add_argument( + "-n", + "--num", + dest="n_days", + help="Number of days to show", + default=3, + type=check_positive, + ) + + ns_parser = parse_known_args_and_warn( + parser, other_args, export_allowed=EXPORT_ONLY_RAW_DATA_ALLOWED + ) + if not ns_parser: + return + nasdaq_view.display_top_retail(n_days=ns_parser.n_days, export=ns_parser.export) + def menu(): """Discovery Menu""" diff --git a/gamestonk_terminal/stocks/discovery/nasdaq_model.py b/gamestonk_terminal/stocks/discovery/nasdaq_model.py new file mode 100644 index 00000000000..2858852c700 --- /dev/null +++ b/gamestonk_terminal/stocks/discovery/nasdaq_model.py @@ -0,0 +1,25 @@ +"""NASDAQ DataLink Model""" +__docformat__ = "numpy" + +import pandas as pd +import requests +import gamestonk_terminal.config_terminal as cfg + + +def get_retail_tickers() -> pd.DataFrame: + """Gets the top 10 retail stocks per day + + Returns + ------- + pd.DataFrame + Dataframe of tickers + """ + r = requests.get( + f"https://data.nasdaq.com/api/v3/datatables/NDAQ/RTAT10/?api_key={cfg.API_KEY_QUANDL}" + ) + if r.status_code != 200: + return pd.DataFrame() + + df = pd.DataFrame(r.json()["datatable"]["data"]) + df.columns = ["Date", "Ticker", "Activity", "Sentiment"] + return df diff --git a/gamestonk_terminal/stocks/discovery/nasdaq_view.py b/gamestonk_terminal/stocks/discovery/nasdaq_view.py new file mode 100644 index 00000000000..b19c650e0be --- /dev/null +++ b/gamestonk_terminal/stocks/discovery/nasdaq_view.py @@ -0,0 +1,41 @@ +"""NASDAQ DataLink View""" +__docformat__ = "numpy" + +import os + +from colorama import Style +from tabulate import tabulate + +from gamestonk_terminal.helper_funcs import export_data +from gamestonk_terminal.stocks.discovery import nasdaq_model +import gamestonk_terminal.feature_flags as gtff + + +def display_top_retail(n_days: int = 3, export: str = ""): + """Display the top 10 retail traded stocks for last days + + Parameters + ---------- + n_days : int, optional + Number of days to show by default 3 + export : str, optional + Format to export data, by default "" + """ + retails = nasdaq_model.get_retail_tickers() + for date, df in retails.head(n_days * 10).groupby("Date"): + print(f"{Style.BRIGHT}{date} Top Retail:{Style.RESET_ALL}") + df = df.drop(columns=["Date"]) + if gtff.USE_TABULATE_DF: + print( + tabulate( + df.reset_index(drop=True), + headers=df.columns[1:], + showindex=False, + tablefmt="fancy_grid", + ) + ) + else: + print(df.reset_index(drop=True).to_string(index=False)) + + print("") + export_data(export, os.path.dirname(os.path.abspath(__file__)), "rtat", retails) diff --git a/website/content/stocks/discovery/rtat/_index.md b/website/content/stocks/discovery/rtat/_index.md new file mode 100644 index 00000000000..eb46e4ed9ab --- /dev/null +++ b/website/content/stocks/discovery/rtat/_index.md @@ -0,0 +1,14 @@ +``` +usage: rtat [-n N_DAYS] [-h] [--export {csv,json,xlsx}] +``` + +Tracking over $30B USD/day of individual investors trades, RTAT gives a daily view into retail activity and sentiment for over 9,500 US traded stocks, ADRs, and ETPs + +``` +optional arguments: + -n N_DAYS, --num N_DAYS + Number of days to show (default: 3) + -h, --help show this help message (default: False) + --export {csv,json,xlsx} + Export raw data into csv, json, xlsx (default: ) +``` diff --git a/website/data/menu/main.yml b/website/data/menu/main.yml index 15649db07a2..a1977b908f2 100755 --- a/website/data/menu/main.yml +++ b/website/data/menu/main.yml @@ -50,6 +50,8 @@ main: ref: "/stocks/discovery/hotpenny" - name: fds ref: "/stocks/discovery/fds" + - name: rtat + ref: "/stocks/discovery/rtat" - name: dark pool shorts ref: "/stocks/dark_pool_shorts" sub: