From 4266c69239278cc923c0f71bc34583cc29c679be Mon Sep 17 00:00:00 2001 From: James Maslek Date: Thu, 15 Dec 2022 14:00:29 -0500 Subject: [PATCH] Editing the SDK functions (#3723) * etf compare into sdk * docstring + #3510 * #3712 * Add stats to sdk + isort folder * Add filter function * add 10 insider functions * add new fa models * update equity.ipynb --- openbb_terminal/etf/stockanalysis_model.py | 5 + .../miscellaneous/library/trail_map.csv | 22 +- .../reports/templates/equity.ipynb | 8 +- .../seeking_alpha_model.py | 8 + .../stocks/insider/businessinsider_view.py | 10 +- .../stocks/insider/finviz_model.py | 2 +- .../stocks/insider/insider_controller.py | 8 +- .../stocks/insider/openinsider_model.py | 4 +- .../stocks/insider/openinsider_view.py | 2 +- openbb_terminal/stocks/insider/sdk_helper.py | 229 ++++++++++++++++++ 10 files changed, 279 insertions(+), 19 deletions(-) create mode 100644 openbb_terminal/stocks/insider/sdk_helper.py diff --git a/openbb_terminal/etf/stockanalysis_model.py b/openbb_terminal/etf/stockanalysis_model.py index b2feb68d876..bfb15ef224e 100644 --- a/openbb_terminal/etf/stockanalysis_model.py +++ b/openbb_terminal/etf/stockanalysis_model.py @@ -122,6 +122,11 @@ def compare_etfs(symbols: List[str]) -> pd.DataFrame: ------- df_compare : pd.DataFrame Dataframe of etf comparisons + + Examples + -------- + >>> from openbb_terminal.sdk import openbb + >>> compare_etfs = openbb.etf.compare(["SPY", "QQQ", "IWM"]) """ df_compare = pd.DataFrame() diff --git a/openbb_terminal/miscellaneous/library/trail_map.csv b/openbb_terminal/miscellaneous/library/trail_map.csv index e58ff1be98e..f59743d5ead 100644 --- a/openbb_terminal/miscellaneous/library/trail_map.csv +++ b/openbb_terminal/miscellaneous/library/trail_map.csv @@ -277,6 +277,7 @@ etf.overview,openbb_terminal.etf.stockanalysis_model.get_etf_overview, etf.etf_by_name,openbb_terminal.etf.stockanalysis_model.get_etfs_by_name, etf.weights,openbb_terminal.etf.yfinance_model.get_etf_sector_weightings, etf.summary,openbb_terminal.etf.yfinance_model.get_etf_summary_description, +etf.compare,openbb_terminal.etf.stockanalysis_model.compare_etfs, forex.get_currency_list,openbb_terminal.forex.av_model.get_currency_list, forex.quote,openbb_terminal.forex.sdk_helpers.quote, forex.fwd,openbb_terminal.forex.fxempire_model.get_forward_rates, @@ -398,7 +399,7 @@ stocks.fa.fama_raw,openbb_terminal.stocks.fundamental_analysis.dcf_model.get_fam stocks.fa.historical_5,openbb_terminal.stocks.fundamental_analysis.dcf_model.get_historical_5, stocks.fa.similar_dfs,openbb_terminal.stocks.fundamental_analysis.dcf_model.get_similar_dfs, stocks.fa.analysis,openbb_terminal.stocks.fundamental_analysis.eclect_us_model.get_filings_analysis, -stocks.fa.dcf,openbb_terminal.stocks.fundamental_analysis.fmp_model.get_dcf, +stocks.fa.dcfc,openbb_terminal.stocks.fundamental_analysis.fmp_model.get_dcf, stocks.fa.enterprise,openbb_terminal.stocks.fundamental_analysis.fmp_model.get_enterprise, stocks.fa.growth,openbb_terminal.stocks.fundamental_analysis.fmp_model.get_financial_growth, stocks.fa.metrics,openbb_terminal.stocks.fundamental_analysis.fmp_model.get_key_metrics, @@ -416,6 +417,8 @@ stocks.fa.shrs,openbb_terminal.stocks.fundamental_analysis.yahoo_finance_model.g stocks.fa.splits,openbb_terminal.stocks.fundamental_analysis.yahoo_finance_model.get_splits,openbb_terminal.stocks.fundamental_analysis.yahoo_finance_view.display_splits stocks.fa.sust,openbb_terminal.stocks.fundamental_analysis.yahoo_finance_model.get_sustainability, stocks.fa.website,openbb_terminal.stocks.fundamental_analysis.yahoo_finance_model.get_website, +stocks.fa.revfc,openbb_terminal.stocks.fundamental_analysis.seeking_alpha_model.get_estimates_rev, +stocks.fa.epsfc,openbb_terminal.stocks.fundamental_analysis.seeking_alpha_model.get_estimates_eps, stocks.gov.qtrcontracts,openbb_terminal.stocks.government.quiverquant_model.get_qtr_contracts,openbb_terminal.stocks.government.quiverquant_view.display_qtr_contracts stocks.gov.government_trading,openbb_terminal.stocks.government.quiverquant_model.get_government_trading, stocks.gov.contracts,openbb_terminal.stocks.government.quiverquant_model.get_contracts,openbb_terminal.stocks.government.quiverquant_view.display_contracts @@ -430,6 +433,19 @@ stocks.gov.toplobbying,openbb_terminal.stocks.government.quiverquant_model.get_t stocks.ins.act,openbb_terminal.stocks.insider.businessinsider_model.get_insider_activity,openbb_terminal.stocks.insider.businessinsider_view.insider_activity stocks.ins.lins,openbb_terminal.stocks.insider.finviz_model.get_last_insider_activity,openbb_terminal.stocks.insider.finviz_view.last_insider_activity stocks.ins.print_insider_data,openbb_terminal.stocks.insider.openinsider_model.get_print_insider_data,openbb_terminal.stocks.insider.openinsider_view.print_insider_data +stocks.ins.stats,openbb_terminal.stocks.insider.sdk_helper.stats, +stocks.ins.filter,openbb_terminal.stocks.insider.sdk_helper.insider_filter, +stocks.ins.lcb,openbb_terminal.stocks.insider.sdk_helper.lcb, +stocks.ins.lpsb,openbb_terminal.stocks.insider.sdk_helper.lpsb, +stocks.ins.lit,openbb_terminal.stocks.insider.sdk_helper.lit, +stocks.ins.lip,openbb_terminal.stocks.insider.sdk_helper.lip, +stocks.ins.blip,openbb_terminal.stocks.insider.sdk_helper.blip, +stocks.ins.blop,openbb_terminal.stocks.insider.sdk_helper.blop, +stocks.ins.blcp,openbb_terminal.stocks.insider.sdk_helper.blcp, +stocks.ins.lis,openbb_terminal.stocks.insider.sdk_helper.lis, +stocks.ins.blis,openbb_terminal.stocks.insider.sdk_helper.blis, +stocks.ins.blos,openbb_terminal.stocks.insider.sdk_helper.blos, +stocks.ins.blcs,openbb_terminal.stocks.insider.sdk_helper.blcs, stocks.options.pcr,openbb_terminal.stocks.options.alphaquery_model.get_put_call_ratio,openbb_terminal.stocks.options.alphaquery_view.display_put_call_ratio stocks.options.info,openbb_terminal.stocks.options.yfinance_model.get_info,openbb_terminal.stocks.options.barchart_view.print_options_data stocks.options.hist_ce,openbb_terminal.stocks.options.chartexchange_model.get_option_history,openbb_terminal.stocks.options.chartexchange_view.display_raw @@ -459,7 +475,7 @@ stocks.sia.cpis,openbb_terminal.stocks.sector_industry_analysis.financedatabase_ stocks.sia.cps,openbb_terminal.stocks.sector_industry_analysis.financedatabase_model.get_companies_per_sector_in_country,openbb_terminal.stocks.sector_industry_analysis.financedatabase_view.display_companies_per_sector_in_country stocks.sia.countries,openbb_terminal.stocks.sector_industry_analysis.financedatabase_model.get_countries, stocks.sia.industries,openbb_terminal.stocks.sector_industry_analysis.financedatabase_model.get_industries, -stocks.sia.maketcap,openbb_terminal.stocks.sector_industry_analysis.financedatabase_model.get_marketcap, +stocks.sia.marketcap,openbb_terminal.stocks.sector_industry_analysis.financedatabase_model.get_marketcap, stocks.sia.sectors,openbb_terminal.stocks.sector_industry_analysis.financedatabase_model.get_sectors, stocks.sia.stocks_data,openbb_terminal.stocks.sector_industry_analysis.stockanalysis_model.get_stocks_data, stocks.ta.summary,openbb_terminal.stocks.technical_analysis.finbrain_model.get_technical_summary_report,openbb_terminal.stocks.technical_analysis.finbrain_view.technical_summary_report @@ -524,4 +540,4 @@ keys.stocksera,openbb_terminal.keys_model.set_stocksera_key, futures.search,openbb_terminal.futures.yfinance_model.get_search_futures, futures.historical,openbb_terminal.futures.yfinance_model.get_historical_futures,openbb_terminal.futures.yfinance_view.display_historical futures.curve,openbb_terminal.futures.yfinance_model.get_curve_futures,openbb_terminal.futures.yfinance_view.display_curve -economy.get_groups,openbb_terminal.economy.finviz_model.get_groups, \ No newline at end of file +economy.get_groups,openbb_terminal.economy.finviz_model.get_groups, diff --git a/openbb_terminal/reports/templates/equity.ipynb b/openbb_terminal/reports/templates/equity.ipynb index c3ff7630c8e..a76c63f0a6b 100644 --- a/openbb_terminal/reports/templates/equity.ipynb +++ b/openbb_terminal/reports/templates/equity.ipynb @@ -960,7 +960,7 @@ " lambda x: f'{x}' if x != \"-\" else x\n", " )\n", "try:\n", - " hist_dcf = openbb.stocks.fa.dcf(symbol)\n", + " hist_dcf = openbb.stocks.fa.dcfc(symbol)\n", "except:\n", " pass\n", "enterprise_df = openbb.stocks.fa.enterprise(symbol)\n", @@ -1450,7 +1450,7 @@ "metadata": { "celltoolbar": "Tags", "kernelspec": { - "display_name": "Python 3.9.6 ('obb')", + "display_name": "obb", "language": "python", "name": "python3" }, @@ -1464,11 +1464,11 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.6" + "version": "3.9.6 | packaged by conda-forge | (default, Jul 11 2021, 03:36:15) \n[Clang 11.1.0 ]" }, "vscode": { "interpreter": { - "hash": "e784374cc4f9a84ed6af2983247aaf351b155c82bcc2188134a65f3c99031000" + "hash": "cb66ba39c97f15743fbb79e204a841ea03600987d49579cfb0ffc8e8dd934c69" } } }, diff --git a/openbb_terminal/stocks/fundamental_analysis/seeking_alpha_model.py b/openbb_terminal/stocks/fundamental_analysis/seeking_alpha_model.py index a686fe034ad..7f3e2c9ce76 100644 --- a/openbb_terminal/stocks/fundamental_analysis/seeking_alpha_model.py +++ b/openbb_terminal/stocks/fundamental_analysis/seeking_alpha_model.py @@ -23,6 +23,10 @@ def get_estimates_eps(ticker: str) -> pd.DataFrame: ------- pd.DataFrame eps estimates for the next 10yrs + Examples + -------- + >>> from openbb_terminal.sdk import openbb + >>> openbb.stocks.fa.epsfc("AAPL") """ url = "https://seekingalpha.com/api/v3/symbol_data/estimates" @@ -158,6 +162,10 @@ def get_estimates_rev(ticker: str) -> pd.DataFrame: ------- pd.DataFrame rev estimates for the next 10yrs + Examples + -------- + >>> from openbb_terminal.sdk import openbb + >>> openbb.stocks.fa.revfc("AAPL") """ url = "https://seekingalpha.com/api/v3/symbol_data/estimates" diff --git a/openbb_terminal/stocks/insider/businessinsider_view.py b/openbb_terminal/stocks/insider/businessinsider_view.py index 293b7152577..3f5efab17b5 100644 --- a/openbb_terminal/stocks/insider/businessinsider_view.py +++ b/openbb_terminal/stocks/insider/businessinsider_view.py @@ -1,25 +1,25 @@ """ Business Insider View """ __docformat__ = "numpy" -from datetime import datetime, timedelta import logging -import os import math +import os +from datetime import datetime, timedelta from typing import List, Optional import matplotlib.pyplot as plt import pandas as pd from pandas.plotting import register_matplotlib_converters -from openbb_terminal.config_terminal import theme from openbb_terminal.config_plot import PLOT_DPI +from openbb_terminal.config_terminal import theme from openbb_terminal.decorators import log_start_end from openbb_terminal.helper_funcs import ( export_data, get_next_stock_market_days, - print_rich_table, - plot_autoscale, is_valid_axes_count, + plot_autoscale, + print_rich_table, ) from openbb_terminal.rich_config import console from openbb_terminal.stocks.insider import businessinsider_model diff --git a/openbb_terminal/stocks/insider/finviz_model.py b/openbb_terminal/stocks/insider/finviz_model.py index ee263e624fe..e17c78742f8 100644 --- a/openbb_terminal/stocks/insider/finviz_model.py +++ b/openbb_terminal/stocks/insider/finviz_model.py @@ -5,9 +5,9 @@ import logging import finviz import pandas as pd -from openbb_terminal.rich_config import console from openbb_terminal.decorators import log_start_end +from openbb_terminal.rich_config import console logger = logging.getLogger(__name__) diff --git a/openbb_terminal/stocks/insider/insider_controller.py b/openbb_terminal/stocks/insider/insider_controller.py index 968a0d286bf..b7f07a936ad 100644 --- a/openbb_terminal/stocks/insider/insider_controller.py +++ b/openbb_terminal/stocks/insider/insider_controller.py @@ -5,19 +5,21 @@ import argparse import configparser import logging from typing import List + import pandas as pd -from openbb_terminal.custom_prompt_toolkit import NestedCompleter + from openbb_terminal import feature_flags as obbff +from openbb_terminal.custom_prompt_toolkit import NestedCompleter from openbb_terminal.decorators import log_start_end from openbb_terminal.helper_funcs import EXPORT_ONLY_RAW_DATA_ALLOWED, check_positive from openbb_terminal.menu import session from openbb_terminal.parent_classes import StockBaseController -from openbb_terminal.rich_config import console, MenuText +from openbb_terminal.rich_config import MenuText, console from openbb_terminal.stocks.insider import ( businessinsider_view, finviz_view, - openinsider_view, openinsider_model, + openinsider_view, ) logger = logging.getLogger(__name__) diff --git a/openbb_terminal/stocks/insider/openinsider_model.py b/openbb_terminal/stocks/insider/openinsider_model.py index 1bcb09ff0da..e3f8cb914ed 100644 --- a/openbb_terminal/stocks/insider/openinsider_model.py +++ b/openbb_terminal/stocks/insider/openinsider_model.py @@ -1,16 +1,16 @@ import configparser import logging -from pathlib import Path import textwrap from datetime import datetime +from pathlib import Path from typing import Dict, List import pandas as pd import requests from bs4 import BeautifulSoup -from openbb_terminal.decorators import log_start_end from openbb_terminal.core.config.paths import USER_PRESETS_DIRECTORY +from openbb_terminal.decorators import log_start_end from openbb_terminal.rich_config import console logger = logging.getLogger(__name__) diff --git a/openbb_terminal/stocks/insider/openinsider_view.py b/openbb_terminal/stocks/insider/openinsider_view.py index 5343b07a7b5..2128cce3325 100644 --- a/openbb_terminal/stocks/insider/openinsider_view.py +++ b/openbb_terminal/stocks/insider/openinsider_view.py @@ -6,6 +6,7 @@ from typing import List import numpy as np import pandas as pd +from openbb_terminal import rich_config from openbb_terminal.decorators import log_start_end from openbb_terminal.helper_funcs import ( export_data, @@ -18,7 +19,6 @@ from openbb_terminal.stocks.insider.openinsider_model import ( get_open_insider_link, get_print_insider_data, ) -from openbb_terminal import rich_config logger = logging.getLogger(__name__) diff --git a/openbb_terminal/stocks/insider/sdk_helper.py b/openbb_terminal/stocks/insider/sdk_helper.py new file mode 100644 index 00000000000..ea4163d177a --- /dev/null +++ b/openbb_terminal/stocks/insider/sdk_helper.py @@ -0,0 +1,229 @@ +"""Insider SDK Helpers""" +__docformat__ = "numpy" + +import pandas as pd + +from openbb_terminal.stocks.insider import openinsider_model + + +def stats(symbol: str) -> pd.DataFrame: + """Get OpenInsider stats for ticker + + Parameters + ---------- + symbol : str + Ticker to get insider stats for + + Returns + ------- + pd.DataFrame + DataFrame of insider stats + + Examples + -------- + >>> from openbb_terminal.sdk import openbb + >>> openbb.stocks.ins.stats("AAPL") + """ + link = f"http://openinsider.com/screener?s={symbol}" + return openinsider_model.get_open_insider_data(link, has_company_name=False) + + +def insider_filter(preset: str) -> pd.DataFrame: + """GEt insider trades based on preset filter + + Parameters + ---------- + preset : str + Name of preset filter + + Returns + ------- + pd.DataFrame + DataFrame of filtered insider data + + Examples + -------- + >>> from openbb_terminal.sdk import openbb + + In order to filter, we pass one of the predefined .ini filters from OpenBBUserData/presets/stocks/insider + >>> filter = "Gold-Silver" + >>> insider_trades = openbb.stocks.ins.filter(filter) + """ + url = openinsider_model.get_open_insider_link(preset) + return openinsider_model.get_open_insider_data(url, has_company_name=True) + + +def lcb() -> pd.DataFrame: + """Get latest cluster buys + + Returns + ------- + pd.DataFrame + DataFrame of latest insider trades + + Examples + -------- + >>> from openbb_terminal.sdk import openbb + >>> openbb.stocks.ins.lcb() + """ + return openinsider_model.get_print_insider_data("lcb") + + +def lpsb() -> pd.DataFrame: + """Get latest penny stock buys + + Returns + ------- + pd.DataFrame + DataFrame of latest insider trades + + Examples + -------- + >>> from openbb_terminal.sdk import openbb + >>> openbb.stocks.ins.lpsb() + """ + return openinsider_model.get_print_insider_data("lpsb") + + +def lit() -> pd.DataFrame: + """Get latest insider trades + + Returns + ------- + pd.DataFrame + DataFrame of latest insider trades + + Examples + -------- + >>> from openbb_terminal.sdk import openbb + >>> openbb.stocks.ins.lit() + """ + return openinsider_model.get_print_insider_data("lit") + + +def lip() -> pd.DataFrame: + """Get latest insider purchases + + Returns + ------- + pd.DataFrame + DataFrame of latest insider trades + + Examples + -------- + >>> from openbb_terminal.sdk import openbb + >>> openbb.stocks.ins.lip() + """ + return openinsider_model.get_print_insider_data("lip") + + +def blip() -> pd.DataFrame: + """Get latest insider purchases > 25k + + Returns + ------- + pd.DataFrame + DataFrame of latest insider trades + + Examples + -------- + >>> from openbb_terminal.sdk import openbb + >>> openbb.stocks.ins.blip() + """ + return openinsider_model.get_print_insider_data("blip") + + +def blop() -> pd.DataFrame: + """Get latest officer purchases > 25k + + Returns + ------- + pd.DataFrame + DataFrame of latest insider trades + + Examples + -------- + >>> from openbb_terminal.sdk import openbb + >>> openbb.stocks.ins.blop() + """ + return openinsider_model.get_print_insider_data("blop") + + +def blcp() -> pd.DataFrame: + """Get latest CEO/CFO purchases > 25k + + Returns + ------- + pd.DataFrame + DataFrame of latest insider trades + + Examples + -------- + >>> from openbb_terminal.sdk import openbb + >>> openbb.stocks.ins.bclp() + """ + return openinsider_model.get_print_insider_data("blcp") + + +def lis() -> pd.DataFrame: + """Get latest insider sales + + Returns + ------- + pd.DataFrame + DataFrame of latest insider trades + + Examples + -------- + >>> from openbb_terminal.sdk import openbb + >>> openbb.stocks.ins.lis() + """ + return openinsider_model.get_print_insider_data("lis") + + +def blis() -> pd.DataFrame: + """Get latest insider sales > 100k + + Returns + ------- + pd.DataFrame + DataFrame of latest insider trades + + Examples + -------- + >>> from openbb_terminal.sdk import openbb + >>> openbb.stocks.ins.blis() + """ + return openinsider_model.get_print_insider_data("blis") + + +def blos() -> pd.DataFrame: + """Get latest officer sales > 100k + + Returns + ------- + pd.DataFrame + DataFrame of latest insider trades + + Examples + -------- + >>> from openbb_terminal.sdk import openbb + >>> openbb.stocks.ins.blos() + """ + return openinsider_model.get_print_insider_data("blos") + + +def blcs() -> pd.DataFrame: + """Get latest CEO/CFO sales > 100k + + Returns + ------- + pd.DataFrame + DataFrame of latest insider trades + + Examples + -------- + >>> from openbb_terminal.sdk import openbb + >>> openbb.stocks.ins.blcs() + """ + return openinsider_model.get_print_insider_data("blcs")