mirror of
https://github.com/OpenBB-finance/OpenBB.git
synced 2026-10-27 12:40:35 +00:00
Add new premium source End of Day Historical Data (#2019)
* Add new premium source https://eodhistoricaldata.com/r/?ref=869U7F4J * Added eod dependency to requirements.txt * Added eod dependency to requirements.txt via poetry and fixed typo * fixed some display bugs for stock info * Implemented stock/load for eodhd, use keys / eodhd demo for key. * Commit before Pull -Implemented stock/load for eodhd, use keys / eodhd demo for key. * Committing files so I can merge * Committing files so I can merge * Committing files so I can merge * Committing files so I can merge * Committing files so I can merge * Committing files so I can merge * Committing files so I can merge * Merge * Fixed dependencies * Committing files so I can merge * Committing Stock_Helper with pylint: disable=R091 * Downgraded charset normalizer * Fixed issues with keys * Committing fixes to eodhd * Committing fixes to eodhd remove eod library Co-authored-by: Colin Delahunty <72827203+colin99d@users.noreply.github.com> Co-authored-by: colin99d <colin99delahunty@gmail.com>
This commit is contained in:
3
data_sources_default.json
vendored
3
data_sources_default.json
vendored
@@ -8,7 +8,8 @@
|
||||
"yf",
|
||||
"iex",
|
||||
"av",
|
||||
"polygon"
|
||||
"polygon",
|
||||
"eodhd"
|
||||
],
|
||||
"dps": {
|
||||
"psi": [
|
||||
|
||||
@@ -167,3 +167,6 @@ API_GITHUB_KEY = os.getenv("OPENBB_API_GITHUB_KEY") or "REPLACE_ME"
|
||||
|
||||
# https://academy.santiment.net/products-and-plans/create-an-api-key/
|
||||
API_SANTIMENT_KEY = os.getenv("OPENBB_API_SANTIMENT_KEY") or "REPLACE_ME"
|
||||
|
||||
# https://eodhistoricaldata.com/r/?ref=869U7F4J
|
||||
API_EODHD_TOKEN = os.getenv("OPENBB_API_EODHD_KEY") or "REPLACE_ME"
|
||||
|
||||
@@ -70,6 +70,7 @@ class KeysController(BaseController): # pylint: disable=too-many-public-methods
|
||||
"ethplorer",
|
||||
"smartstake",
|
||||
"github",
|
||||
"eodhd",
|
||||
"messari",
|
||||
"santiment",
|
||||
]
|
||||
@@ -755,6 +756,24 @@ class KeysController(BaseController): # pylint: disable=too-many-public-methods
|
||||
if show_output:
|
||||
console.print(self.key_dict["MESSARI"] + "\n")
|
||||
|
||||
def check_eodhd_key(self, show_output: bool = False) -> None:
|
||||
"""Check End of Day Historical Data key"""
|
||||
self.cfg_dict["EODHD"] = "eodhd"
|
||||
if cfg.API_EODHD_TOKEN == "REPLACE_ME": # nosec
|
||||
logger.info("End of Day Historical Data key not defined")
|
||||
self.key_dict["EODHD"] = "not defined"
|
||||
else:
|
||||
try:
|
||||
pyEX.Client(api_token=cfg.API_EODHD_TOKEN, version="v1")
|
||||
logger.info("End of Day Historical Data key defined, test passed")
|
||||
self.key_dict["EODHD"] = "defined, test passed"
|
||||
except PyEXception:
|
||||
logger.exception("End of Day Historical Data key defined, test failed")
|
||||
self.key_dict["EODHD"] = "defined, test failed"
|
||||
|
||||
if show_output:
|
||||
console.print(self.key_dict["EODHD"] + "\n")
|
||||
|
||||
def check_santiment_key(self, show_output: bool = False) -> None:
|
||||
"""Check Santiment key"""
|
||||
self.cfg_dict["SANTIMENT"] = "santiment"
|
||||
@@ -816,6 +835,7 @@ class KeysController(BaseController): # pylint: disable=too-many-public-methods
|
||||
self.check_smartstake_key()
|
||||
self.check_github_key()
|
||||
self.check_messari_key()
|
||||
self.check_eodhd_key()
|
||||
self.check_santiment_key()
|
||||
|
||||
def print_help(self):
|
||||
@@ -1693,6 +1713,7 @@ class KeysController(BaseController): # pylint: disable=too-many-public-methods
|
||||
other_args.insert(0, "-k")
|
||||
ns_parser = parse_simple_args(parser, other_args)
|
||||
if ns_parser:
|
||||
print(type(ns_parser.key))
|
||||
os.environ["OPENBB_API_COINGLASS_KEY"] = ns_parser.key
|
||||
dotenv.set_key(self.env_file, "OPENBB_API_COINGLASS_KEY", ns_parser.key)
|
||||
cfg.API_COINGLASS_KEY = ns_parser.key
|
||||
@@ -1832,6 +1853,35 @@ class KeysController(BaseController): # pylint: disable=too-many-public-methods
|
||||
self.check_messari_key(show_output=True)
|
||||
|
||||
@log_start_end(log=logger)
|
||||
def call_eodhd(self, other_args: List[str]):
|
||||
"""Process eodhd command"""
|
||||
parser = argparse.ArgumentParser(
|
||||
add_help=False,
|
||||
formatter_class=argparse.ArgumentDefaultsHelpFormatter,
|
||||
prog="eodhd",
|
||||
description="Set End of Day Historical Data API key.",
|
||||
)
|
||||
parser.add_argument(
|
||||
"-k",
|
||||
"--key",
|
||||
type=str,
|
||||
dest="key",
|
||||
help="key",
|
||||
)
|
||||
if not other_args:
|
||||
console.print(
|
||||
"For your API Key, visit: https://eodhistoricaldata.com/r/?ref=869U7F4J\n"
|
||||
)
|
||||
return
|
||||
if other_args and "-" not in other_args[0][0]:
|
||||
other_args.insert(0, "-k")
|
||||
ns_parser = parse_simple_args(parser, other_args)
|
||||
if ns_parser:
|
||||
os.environ["API_EODHD_TOKEN"] = ns_parser.key
|
||||
dotenv.set_key(self.env_file, "API_EODHD_TOKEN", ns_parser.key)
|
||||
cfg.API_EODHD_TOKEN = ns_parser.key
|
||||
self.check_eodhd_key(show_output=True)
|
||||
|
||||
def call_santiment(self, other_args: List[str]):
|
||||
"""Process santiment command"""
|
||||
parser = argparse.ArgumentParser(
|
||||
@@ -1849,7 +1899,8 @@ class KeysController(BaseController): # pylint: disable=too-many-public-methods
|
||||
)
|
||||
if not other_args:
|
||||
console.print(
|
||||
"For your API Key, visit: https://academy.santiment.net/products-and-plans/create-an-api-key\n"
|
||||
"For your API Key, visit: "
|
||||
"https://academy.santiment.net/products-and-plans/create-an-api-key\n"
|
||||
)
|
||||
return
|
||||
if other_args and "-" not in other_args[0][0]:
|
||||
|
||||
@@ -798,10 +798,7 @@ class StockBaseController(BaseController, metaclass=ABCMeta):
|
||||
if other_args and "-" not in other_args[0][0]:
|
||||
other_args.insert(0, "-t")
|
||||
|
||||
ns_parser = self.parse_known_args_and_warn(
|
||||
parser,
|
||||
other_args,
|
||||
)
|
||||
ns_parser = self.parse_known_args_and_warn(parser, other_args)
|
||||
|
||||
if ns_parser:
|
||||
if ns_parser.weekly and ns_parser.monthly:
|
||||
@@ -864,6 +861,8 @@ class StockBaseController(BaseController, metaclass=ABCMeta):
|
||||
|
||||
if ns_parser.source == "iex":
|
||||
self.start = self.stock.index[0].to_pydatetime()
|
||||
elif ns_parser.source == "eodhd":
|
||||
self.start = self.stock.index[0].to_pydatetime()
|
||||
else:
|
||||
self.start = ns_parser.start
|
||||
self.interval = f"{ns_parser.interval}min"
|
||||
|
||||
@@ -35,9 +35,10 @@ from openbb_terminal.rich_config import console
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
# pylint: disable=no-member,too-many-branches,C0302,R0913
|
||||
# pylint: disable=R0915
|
||||
|
||||
INTERVALS = [1, 5, 15, 30, 60]
|
||||
SOURCES = ["yf", "av", "iex"]
|
||||
SOURCES = ["yf", "av", "iex", "eodhd"]
|
||||
|
||||
market_coverage_suffix = {
|
||||
"USA": ["CBT", "CME", "NYB", "CMX", "NYM", "US", ""],
|
||||
@@ -626,14 +627,21 @@ def load(
|
||||
monthly: bool = False,
|
||||
):
|
||||
"""
|
||||
Load a symbol to perform analysis using the string above as a template. Optional arguments and their
|
||||
descriptions are listed above. The default source is, yFinance (https://pypi.org/project/yfinance/).
|
||||
Alternatively, one may select either AlphaVantage (https://www.alphavantage.co/documentation/)
|
||||
or IEX Cloud (https://iexcloud.io/docs/api/) as the data source for the analysis.
|
||||
Please note that certain analytical features are exclusive to the source.
|
||||
Load a symbol to perform analysis using the string above as a template.
|
||||
|
||||
Optional arguments and their descriptions are listed above.
|
||||
|
||||
The default source is, yFinance (https://pypi.org/project/yfinance/).
|
||||
Other sources:
|
||||
- AlphaVantage (https://www.alphavantage.co/documentation/)
|
||||
- IEX Cloud (https://iexcloud.io/docs/api/)
|
||||
- Eod Historical Data (https://eodhistoricaldata.com/financial-apis/)
|
||||
|
||||
Please note that certain analytical features are exclusive to the specific source.
|
||||
|
||||
To load a symbol from an exchange outside of the NYSE/NASDAQ default, use yFinance as the source and
|
||||
add the corresponding exchange to the end of the symbol. i.e. ‘BNS.TO’.
|
||||
add the corresponding exchange to the end of the symbol. i.e. ‘BNS.TO’. Note this may be possible with
|
||||
other paid sources check their docs.
|
||||
|
||||
BNS is a dual-listed stock, there are separate options chains and order books for each listing.
|
||||
Opportunities for arbitrage may arise from momentary pricing discrepancies between listings
|
||||
@@ -749,6 +757,70 @@ def load(
|
||||
|
||||
df_stock_candidate.index.name = "date"
|
||||
|
||||
# TODO: eodhd start ###########################
|
||||
|
||||
# End of Day Historical Data Source
|
||||
elif source == "eodhd":
|
||||
df_stock_candidate = pd.DataFrame()
|
||||
|
||||
if weekly:
|
||||
int_ = "w"
|
||||
int_string = "Weekly"
|
||||
elif monthly:
|
||||
int_ = "m"
|
||||
int_string = "Monthly"
|
||||
else:
|
||||
int_ = "d"
|
||||
int_string = "Daily"
|
||||
|
||||
request_url = (
|
||||
f"https://eodhistoricaldata.com/api/eod/"
|
||||
f"{symbol.upper()}?"
|
||||
f"{start_date.strftime('%Y-%m-%d')}&"
|
||||
f"to={end_date.strftime('%Y-%m-%d')}&"
|
||||
f"period={int_}&"
|
||||
f"api_token={cfg.API_EODHD_TOKEN}&"
|
||||
f"fmt=json&"
|
||||
f"order=d"
|
||||
)
|
||||
|
||||
r = requests.get(request_url)
|
||||
if r.status_code != 200:
|
||||
console.print("[red]Invalid API Key for eodhistoricaldata [/red]")
|
||||
console.print(
|
||||
"Get your Key here: https://eodhistoricaldata.com/r/?ref=869U7F4J\n"
|
||||
)
|
||||
return pd.DataFrame()
|
||||
|
||||
r_json = r.json()
|
||||
|
||||
df_stock_candidate = pd.DataFrame(r_json).dropna(axis=0)
|
||||
|
||||
# Check that loading a stock was not successful
|
||||
if df_stock_candidate.empty:
|
||||
console.print("No data found from End Of Day Historical Data.\n")
|
||||
return df_stock_candidate
|
||||
|
||||
df_stock_candidate = df_stock_candidate[
|
||||
["date", "open", "high", "low", "close", "adjusted_close", "volume"]
|
||||
]
|
||||
|
||||
df_stock_candidate = df_stock_candidate.rename(
|
||||
columns={
|
||||
"date": "Date",
|
||||
"close": "Close",
|
||||
"high": "High",
|
||||
"low": "Low",
|
||||
"open": "Open",
|
||||
"adjusted_close": "Adj Close",
|
||||
"volume": "Volume",
|
||||
}
|
||||
)
|
||||
df_stock_candidate["Date"] = pd.to_datetime(df_stock_candidate.Date)
|
||||
df_stock_candidate.set_index("Date", inplace=True)
|
||||
df_stock_candidate.sort_index(ascending=True, inplace=True)
|
||||
# TODO: ###########################
|
||||
|
||||
# IEX Cloud Source
|
||||
elif source == "iex":
|
||||
df_stock_candidate = pd.DataFrame()
|
||||
@@ -1382,12 +1454,10 @@ def find_trendline(
|
||||
|
||||
def additional_info_about_ticker(ticker: str) -> str:
|
||||
"""Information about trading the ticker such as exchange, currency, timezone and market status
|
||||
|
||||
Parameters
|
||||
----------
|
||||
ticker : str
|
||||
The stock ticker to extract if stock market is open or not
|
||||
|
||||
Returns
|
||||
-------
|
||||
str
|
||||
|
||||
1162
poetry.lock
generated
vendored
1162
poetry.lock
generated
vendored
File diff suppressed because it is too large
Load Diff
1
pyproject.toml
vendored
1
pyproject.toml
vendored
@@ -96,6 +96,7 @@ pyinstaller = {version = "^4.10", optional = true}
|
||||
jupyterlab-code-formatter = {version = "^1.4.10", optional = true}
|
||||
jupyterlab-lsp = {version = "^3.10.1", optional = true}
|
||||
jedi-language-server = {version = "^0.35.1", optional = true}
|
||||
charset-normalizer = "2.1.0"
|
||||
|
||||
[tool.poetry.dev-dependencies]
|
||||
pytest = "^6.2.2"
|
||||
|
||||
64
requirements-full.txt
vendored
64
requirements-full.txt
vendored
@@ -31,18 +31,18 @@ bleach==5.0.1; python_version >= "3.7"
|
||||
bs4==0.0.1
|
||||
bt==0.2.9; (python_version >= "2.7" and python_full_version < "3.0.0") or (python_full_version >= "3.6.0")
|
||||
cachetools==5.2.0; python_version >= "3.7" and python_version < "4.0" and (python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.7")
|
||||
ccxt==1.92.30
|
||||
certifi==2022.6.15; python_version >= "3.8" and python_version < "4" and (python_version >= "3.7" and python_full_version < "3.0.0" and python_version < "4" or python_full_version >= "3.6.0" and python_version < "4" and python_version >= "3.7") and python_full_version >= "3.7.1" and python_full_version < "4.0.0"
|
||||
cffi==1.15.1; python_version >= "3.7"
|
||||
ccxt==1.92.93
|
||||
certifi==2022.6.15; python_version >= "3.8" and python_version < "4" and python_full_version >= "3.7.1" and python_full_version < "4.0.0"
|
||||
cffi==1.15.1
|
||||
cfgv==3.3.1; python_full_version >= "3.6.1" and python_version >= "3.7"
|
||||
charset-normalizer==2.1.0; python_version >= "3.8" and python_version < "4" and python_full_version >= "3.7.1" and python_full_version < "4.0.0"
|
||||
charset-normalizer==2.1.0; python_full_version >= "3.6.0"
|
||||
click==8.1.3; python_version >= "3.7" and python_full_version >= "3.6.2"
|
||||
codespell==2.1.0; python_version >= "3.5"
|
||||
codespell==2.2.1; python_version >= "3.6"
|
||||
colorama==0.4.5; python_full_version >= "3.6.2" and python_full_version < "4.0.0" and (python_version >= "3.5" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.5") and (python_version >= "3.6" and python_full_version < "3.0.0" and sys_platform == "win32" or sys_platform == "win32" and python_version >= "3.6" and python_full_version >= "3.5.0") and sys_platform == "win32" and (python_version >= "3.7" and python_full_version < "3.0.0" and platform_system == "Windows" or platform_system == "Windows" and python_version >= "3.7" and python_full_version >= "3.5.0") and platform_system == "Windows" and python_version >= "3.8" and (python_version >= "3.7" and python_full_version < "3.0.0" and sys_platform == "win32" or sys_platform == "win32" and python_version >= "3.7" and python_full_version >= "3.5.0")
|
||||
commonmark==0.9.1; python_full_version >= "3.6.2" and python_full_version < "4.0.0"
|
||||
convertdate==2.4.0; python_version >= "3.7" and python_version < "4"
|
||||
coverage==6.4.4; python_version >= "3.7"
|
||||
cryptography==37.0.4; python_version >= "3.7" and python_full_version < "3.0.0" and python_version < "4" or python_full_version >= "3.6.0" and python_version < "4" and python_version >= "3.7"
|
||||
cryptography==37.0.4; python_version >= "3.6"
|
||||
cssselect==1.1.0; python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.4.0"
|
||||
cvxpy==1.2.1; python_version >= "3.8" and python_version < "3.11"
|
||||
cycler==0.11.0; python_version >= "3.7"
|
||||
@@ -56,14 +56,15 @@ degiro-connector==2.0.21; python_full_version >= "3.7.1" and python_full_version
|
||||
deprecation==2.1.0
|
||||
detecta==0.0.5; python_version >= "3.6"
|
||||
dill==0.3.5.1; python_full_version >= "3.7.0"
|
||||
distlib==0.3.5; python_version >= "3.7"
|
||||
distlib==0.3.6; python_version >= "3.7"
|
||||
dnspython==2.2.1; python_version >= "3.6" and python_version < "4.0"
|
||||
docutils==0.17.1; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6"
|
||||
ecos==2.0.10; python_version >= "3.8" and python_version < "3.11"
|
||||
entrypoints==0.4; python_full_version >= "3.7.0" and python_version >= "3.7"
|
||||
eod==0.2.1
|
||||
et-xmlfile==1.1.0; python_version >= "3.6"
|
||||
exchange-calendars==4.2; python_version >= "3.8" and python_version < "4.0" and python_full_version >= "3.7.0"
|
||||
executing==0.10.0; python_full_version >= "3.6.2" and python_version >= "3.8"
|
||||
executing==1.0.0; python_full_version >= "3.6.2" and python_version >= "3.8"
|
||||
fastjsonschema==2.16.1; python_full_version >= "3.7.0" and python_version >= "3.7"
|
||||
feedparser==6.0.10; python_version >= "3.6"
|
||||
ffn==0.3.6; python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.6.0"
|
||||
@@ -74,7 +75,7 @@ finviz==1.4.4
|
||||
finvizfinance==0.14.3; python_version >= "3.5"
|
||||
flake8==3.9.2; (python_version >= "2.7" and python_full_version < "3.0.0") or (python_full_version >= "3.5.0")
|
||||
flatbuffers==1.12; python_version >= "3.7"
|
||||
fonttools==4.35.0; python_version >= "3.7"
|
||||
fonttools==4.37.1; python_version >= "3.7"
|
||||
formulaic==0.3.4; python_full_version >= "3.7.1" and python_full_version < "4.0.0" and python_version >= "3.8"
|
||||
fred==3.1
|
||||
fredapi==0.4.3
|
||||
@@ -86,7 +87,7 @@ gast==0.4.0; python_version >= "3.7" and python_full_version < "3.0.0" or python
|
||||
gitdb==4.0.9; python_version >= "3.7"
|
||||
gitpython==3.1.27; python_version >= "3.7"
|
||||
google-auth-oauthlib==0.4.6; python_version >= "3.7"
|
||||
google-auth==2.10.0; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.7"
|
||||
google-auth==2.11.0; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.7"
|
||||
google-pasta==0.2.0; python_version >= "3.7"
|
||||
grpcio==1.48.0; python_full_version >= "3.7.1" and python_full_version < "4.0.0" and python_version >= "3.7"
|
||||
h11==0.13.0; python_version >= "3.7" and python_version < "4.0" and python_full_version >= "3.7.0"
|
||||
@@ -95,32 +96,32 @@ hijri-converter==2.2.4; python_version >= "3.6"
|
||||
holidays==0.11.3.1; python_version >= "3.6"
|
||||
html5lib==1.1; (python_version >= "2.7" and python_full_version < "3.0.0") or (python_full_version >= "3.5.0")
|
||||
identify==2.5.3; python_version >= "3.7"
|
||||
idna==3.3; python_version >= "3.8" and python_version < "4" and (python_version >= "3.7" and python_full_version < "3.0.0" and python_version < "4" or python_full_version >= "3.6.0" and python_version < "4" and python_version >= "3.7") and python_full_version >= "3.7.1" and python_full_version < "4.0.0"
|
||||
idna==3.3; python_version >= "3.8" and python_version < "4" and python_full_version >= "3.7.1" and python_full_version < "4.0.0"
|
||||
imagesize==1.4.1; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.6"
|
||||
importlib-metadata==4.12.0; python_version < "3.10" and python_version >= "3.7"
|
||||
inflection==0.5.1; python_version >= "3.6"
|
||||
iniconfig==1.1.1; python_version >= "3.7"
|
||||
interface-meta==1.3.0; python_version >= "3.8" and python_version < "4.0" and python_full_version >= "3.7.1" and python_full_version < "4.0.0"
|
||||
investpy==1.0.8; python_version >= "3.7"
|
||||
ipykernel==6.15.1; python_version >= "3.7"
|
||||
ipykernel==6.15.2; python_version >= "3.7"
|
||||
ipympl==0.8.8
|
||||
ipython-genutils==0.2.0; python_version >= "3.7"
|
||||
ipython==8.4.0; python_full_version >= "3.6.2" and python_version >= "3.8"
|
||||
ipywidgets==7.7.1
|
||||
ipywidgets==7.7.2
|
||||
iso8601==0.1.16
|
||||
isort==5.10.1; python_full_version >= "3.6.2" and python_version < "4.0"
|
||||
jedi==0.18.1; python_full_version >= "3.6.2" and python_version >= "3.8"
|
||||
jinja2==3.1.2; python_version >= "3.7"
|
||||
joblib==1.1.0; python_version >= "3.8" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.8"
|
||||
json5==0.9.9; python_version >= "3.7"
|
||||
json5==0.9.10; python_version >= "3.7"
|
||||
jsonschema==3.2.0
|
||||
jupyter-client==7.3.4; python_full_version >= "3.7.0" and python_version >= "3.7"
|
||||
jupyter-client==7.3.5; python_full_version >= "3.7.0" and python_version >= "3.7"
|
||||
jupyter-console==6.4.4; python_version >= "3.7"
|
||||
jupyter-core==4.11.1; python_full_version >= "3.7.0" and python_version >= "3.7"
|
||||
jupyter-server==1.18.1; python_version >= "3.7"
|
||||
jupyter==1.0.0
|
||||
jupyterlab-pygments==0.2.2; python_version >= "3.7"
|
||||
jupyterlab-server==2.15.0; python_version >= "3.7"
|
||||
jupyterlab-server==2.15.1; python_version >= "3.7"
|
||||
jupyterlab-widgets==1.1.1; python_version >= "3.6"
|
||||
jupyterlab==3.4.5; python_version >= "3.7"
|
||||
keras-preprocessing==1.1.2; python_version >= "3.7"
|
||||
@@ -134,7 +135,7 @@ lxml==4.9.1; python_version >= "3.7" and python_full_version < "3.0.0" or python
|
||||
markdown-it-py==1.1.0; python_version >= "3.6" and python_version < "4.0"
|
||||
markdown==3.4.1; python_version >= "3.7"
|
||||
markupsafe==2.1.1; python_version >= "3.7"
|
||||
matplotlib-inline==0.1.5; python_full_version >= "3.6.2" and python_version >= "3.8"
|
||||
matplotlib-inline==0.1.6; python_full_version >= "3.6.2" and python_version >= "3.8"
|
||||
matplotlib==3.5.3; python_version >= "3.7"
|
||||
mccabe==0.6.1; python_full_version >= "3.6.2"
|
||||
mdit-py-plugins==0.2.8; python_version >= "3.6" and python_version < "4.0"
|
||||
@@ -152,7 +153,7 @@ nbclient==0.5.13; python_full_version >= "3.7.0" and python_version >= "3.7"
|
||||
nbconvert==6.5.3; python_version >= "3.7"
|
||||
nbformat==5.4.0; python_full_version >= "3.7.0" and python_version >= "3.7"
|
||||
nest-asyncio==1.5.5; python_full_version >= "3.7.0" and python_version >= "3.7"
|
||||
networkx==2.8.5; python_version >= "3.8"
|
||||
networkx==2.8.6; python_version >= "3.8"
|
||||
nodeenv==1.7.0; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.7.0" and python_version >= "3.7"
|
||||
notebook-shim==0.1.0; python_version >= "3.7"
|
||||
notebook==6.4.12; python_version >= "3.7"
|
||||
@@ -199,20 +200,19 @@ pyasn1-modules==0.2.8; python_version >= "3.7" and python_full_version < "3.0.0"
|
||||
pyasn1==0.4.8; python_version >= "3.7" and python_full_version < "3.0.0" and python_version < "4" and (python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.7") or python_full_version >= "3.6.0" and python_version >= "3.7" and python_version < "4" and (python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.7")
|
||||
pycares==4.2.2; python_version >= "3.5.2"
|
||||
pycodestyle==2.7.0; python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.5.0"
|
||||
pycoingecko==2.2.0
|
||||
pycparser==2.21; python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.4.0"
|
||||
pycoingecko==2.3.0
|
||||
pycparser==2.21
|
||||
pyerfa==2.0.0.1; python_version >= "3.8"
|
||||
pyex==0.5.0
|
||||
pyflakes==2.3.1; python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.5.0"
|
||||
pygments==2.13.0; python_version >= "3.6"
|
||||
pyhdfe==0.1.0; python_version >= "3.8"
|
||||
pylint==2.13.9; python_full_version >= "3.6.2"
|
||||
pyluach==2.0.0; python_version >= "3.8" and python_version < "4.0" and python_full_version >= "3.7.0"
|
||||
pyluach==2.0.1; python_version >= "3.8" and python_version < "4.0" and python_full_version >= "3.7.0"
|
||||
pymeeus==0.5.11; python_version >= "3.7" and python_version < "4"
|
||||
pymongo==3.12.3
|
||||
pyobjc-core==8.5; python_version >= "3.6" and sys_platform == "darwin"
|
||||
pyobjc-framework-cocoa==8.5; python_version >= "3.6" and sys_platform == "darwin"
|
||||
pyopenssl==22.0.0; python_version >= "3.7" and python_full_version < "3.0.0" and python_version < "4" or python_full_version >= "3.6.0" and python_version < "4" and python_version >= "3.7"
|
||||
pyotp==2.6.0; python_version >= "3"
|
||||
pyparsing==3.0.9; python_full_version >= "3.6.8" and python_version >= "3.7"
|
||||
pyportfolioopt==1.5.3; python_version >= "3.8" and python_version < "3.11"
|
||||
@@ -237,7 +237,7 @@ pywinpty==2.0.7; os_name == "nt" and python_version >= "3.7"
|
||||
pyyaml==6.0; python_version >= "3.8"
|
||||
pyzmq==23.2.1; python_full_version >= "3.7.0" and python_version >= "3.7"
|
||||
qdldl==0.1.5.post2; python_version >= "3.8" and python_version < "3.11"
|
||||
qtconsole==5.3.1; python_version >= "3.7"
|
||||
qtconsole==5.3.2; python_version >= "3.7"
|
||||
qtpy==2.2.0; python_version >= "3.7"
|
||||
quandl==3.7.0; python_version >= "3.6"
|
||||
rapidfuzz==1.9.1; python_version >= "2.7"
|
||||
@@ -254,7 +254,7 @@ scipy==1.8.1; python_version >= "3.8" and python_version < "3.11"
|
||||
screeninfo==0.6.7
|
||||
scs==3.2.0; python_version >= "3.8" and python_version < "3.11"
|
||||
seaborn==0.11.2; python_version >= "3.6"
|
||||
selenium==4.4.0; python_version >= "3.7" and python_version < "4.0"
|
||||
selenium==4.4.3; python_version >= "3.7" and python_version < "4.0"
|
||||
send2trash==1.8.0; python_version >= "3.7"
|
||||
sentiment-investor==2.1.0; python_version >= "3.8" and python_version < "4.0"
|
||||
setuptools-scm==6.4.2; python_version >= "3.8"
|
||||
@@ -275,7 +275,7 @@ sphinxcontrib-qthelp==1.0.3; python_version >= "3.6"
|
||||
sphinxcontrib-serializinghtml==1.1.5; python_version >= "3.6"
|
||||
squarify==0.4.3
|
||||
sseclient==0.0.27
|
||||
stack-data==0.4.0; python_full_version >= "3.6.2" and python_version >= "3.8"
|
||||
stack-data==0.5.0; python_full_version >= "3.6.2" and python_version >= "3.8"
|
||||
statsmodels==0.13.2; python_version >= "3.7"
|
||||
stevedore==4.0.0; python_version >= "3.8"
|
||||
tabulate==0.8.10; python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.6.0"
|
||||
@@ -306,31 +306,31 @@ trio==0.21.0; python_version >= "3.7" and python_version < "4.0"
|
||||
types-python-dateutil==2.8.19
|
||||
types-pytz==2021.3.8
|
||||
types-pyyaml==6.0.11
|
||||
types-requests==2.28.8
|
||||
types-requests==2.28.9
|
||||
types-setuptools==57.4.18
|
||||
types-six==1.16.18
|
||||
types-urllib3==1.26.22
|
||||
types-six==1.16.19
|
||||
types-urllib3==1.26.23
|
||||
typing-extensions==4.3.0; python_version < "3.10" and python_full_version >= "3.6.2" and python_version >= "3.7"
|
||||
tzdata==2022.2; platform_system == "Windows" and python_version >= "3.6" and (python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.6")
|
||||
tzlocal==4.2; python_version >= "3.6"
|
||||
ujson==5.4.0; python_version >= "3.7"
|
||||
unidecode==1.3.4; python_version >= "3.7"
|
||||
update-checker==0.18.0; python_version >= "3.7" and python_version < "4.0"
|
||||
urllib3==1.26.11; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.8" and python_full_version < "4.0.0"
|
||||
urllib3==1.26.12; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.8" and python_full_version < "4.0.0"
|
||||
user-agent==0.1.10
|
||||
vadersentiment==3.3.2
|
||||
valinvest==0.0.2; python_version >= "3.6"
|
||||
vcrpy==4.2.0; python_version >= "3.7"
|
||||
virtualenv==20.16.3; python_version >= "3.7"
|
||||
virtualenv==20.16.4; python_version >= "3.7"
|
||||
voila==0.3.6; python_version >= "3.7"
|
||||
wcwidth==0.2.5; python_full_version >= "3.6.2" and python_version >= "3.8"
|
||||
webencodings==0.5.1; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.7"
|
||||
websocket-client==1.3.3; python_version >= "3.8" and python_version < "4.0"
|
||||
websocket-client==1.4.0; python_version >= "3.8" and python_version < "4.0"
|
||||
websockets==10.3; python_version >= "3.7"
|
||||
werkzeug==2.2.2; python_version >= "3.7"
|
||||
widgetsnbextension==3.6.1
|
||||
wrapt==1.14.1; python_full_version >= "3.7.1" and python_full_version < "4.0.0" and (python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.7") and python_version >= "3.8"
|
||||
wsproto==1.1.0; python_version >= "3.7" and python_version < "4.0" and python_full_version >= "3.7.0"
|
||||
wsproto==1.2.0; python_version >= "3.7" and python_version < "4.0" and python_full_version >= "3.7.0"
|
||||
xlsxwriter==3.0.3; python_version >= "3.7"
|
||||
yarl==1.7.2; python_version >= "3.7"
|
||||
yfinance==0.1.74
|
||||
|
||||
50
requirements.txt
vendored
50
requirements.txt
vendored
@@ -24,15 +24,15 @@ black==22.6.0; python_full_version >= "3.6.2"
|
||||
bleach==5.0.1; python_version >= "3.7"
|
||||
bs4==0.0.1
|
||||
bt==0.2.9; (python_version >= "2.7" and python_full_version < "3.0.0") or (python_full_version >= "3.6.0")
|
||||
ccxt==1.92.30
|
||||
certifi==2022.6.15; python_version >= "3.8" and python_version < "4" and (python_version >= "3.7" and python_full_version < "3.0.0" and python_version < "4" or python_full_version >= "3.6.0" and python_version < "4" and python_version >= "3.7") and python_full_version >= "3.7.1" and python_full_version < "4.0.0"
|
||||
cffi==1.15.1; python_version >= "3.7"
|
||||
charset-normalizer==2.1.0; python_version >= "3.8" and python_version < "4" and python_full_version >= "3.7.1" and python_full_version < "4.0.0"
|
||||
ccxt==1.92.93
|
||||
certifi==2022.6.15; python_version >= "3.8" and python_version < "4" and python_full_version >= "3.7.1" and python_full_version < "4.0.0"
|
||||
cffi==1.15.1
|
||||
charset-normalizer==2.1.0; python_full_version >= "3.6.0"
|
||||
click==8.1.3; python_version >= "3.7" and python_full_version >= "3.6.2"
|
||||
colorama==0.4.5; python_full_version >= "3.6.2" and python_full_version < "4.0.0" and (python_version >= "3.5" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.5") and (python_version >= "3.7" and python_full_version < "3.0.0" and platform_system == "Windows" or python_full_version >= "3.5.0" and platform_system == "Windows" and python_version >= "3.7") and platform_system == "Windows" and python_version >= "3.8" and sys_platform == "win32"
|
||||
commonmark==0.9.1; python_full_version >= "3.6.2" and python_full_version < "4.0.0"
|
||||
convertdate==2.4.0; python_version >= "3.7" and python_version < "4"
|
||||
cryptography==37.0.4; python_version >= "3.7" and python_full_version < "3.0.0" and python_version < "4" or python_full_version >= "3.6.0" and python_version < "4" and python_version >= "3.7"
|
||||
cryptography==37.0.4; python_version >= "3.6"
|
||||
cssselect==1.1.0; python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.4.0"
|
||||
cvxpy==1.2.1; python_version >= "3.8" and python_version < "3.11"
|
||||
cycler==0.11.0; python_version >= "3.7"
|
||||
@@ -48,9 +48,10 @@ detecta==0.0.5; python_version >= "3.6"
|
||||
dnspython==2.2.1; python_version >= "3.6" and python_version < "4.0"
|
||||
ecos==2.0.10; python_version >= "3.8" and python_version < "3.11"
|
||||
entrypoints==0.4; python_full_version >= "3.7.0" and python_version >= "3.7"
|
||||
eod==0.2.1
|
||||
et-xmlfile==1.1.0; python_version >= "3.6"
|
||||
exchange-calendars==4.2; python_version >= "3.8" and python_version < "4.0" and python_full_version >= "3.7.0"
|
||||
executing==0.10.0; python_full_version >= "3.6.2" and python_version >= "3.8"
|
||||
executing==1.0.0; python_full_version >= "3.6.2" and python_version >= "3.8"
|
||||
fastjsonschema==2.16.1; python_full_version >= "3.7.0" and python_version >= "3.7"
|
||||
feedparser==6.0.10; python_version >= "3.6"
|
||||
ffn==0.3.6; python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.6.0"
|
||||
@@ -58,7 +59,7 @@ financedatabase==1.0.2
|
||||
finnhub-python==2.4.14
|
||||
finviz==1.4.4
|
||||
finvizfinance==0.14.3; python_version >= "3.5"
|
||||
fonttools==4.35.0; python_version >= "3.7"
|
||||
fonttools==4.37.1; python_version >= "3.7"
|
||||
formulaic==0.3.4; python_full_version >= "3.7.1" and python_full_version < "4.0.0" and python_version >= "3.8"
|
||||
fred==3.1
|
||||
fredapi==0.4.3
|
||||
@@ -73,29 +74,29 @@ h11==0.13.0; python_version >= "3.7" and python_version < "4.0" and python_full_
|
||||
hijri-converter==2.2.4; python_version >= "3.6"
|
||||
holidays==0.11.3.1; python_version >= "3.6"
|
||||
html5lib==1.1; (python_version >= "2.7" and python_full_version < "3.0.0") or (python_full_version >= "3.5.0")
|
||||
idna==3.3; python_version >= "3.8" and python_version < "4" and (python_version >= "3.7" and python_full_version < "3.0.0" and python_version < "4" or python_full_version >= "3.6.0" and python_version < "4" and python_version >= "3.7") and python_full_version >= "3.7.1" and python_full_version < "4.0.0"
|
||||
idna==3.3; python_version >= "3.8" and python_version < "4" and python_full_version >= "3.7.1" and python_full_version < "4.0.0"
|
||||
importlib-metadata==4.12.0; python_version < "3.10" and python_version >= "3.7"
|
||||
inflection==0.5.1; python_version >= "3.6"
|
||||
interface-meta==1.3.0; python_version >= "3.8" and python_version < "4.0" and python_full_version >= "3.7.1" and python_full_version < "4.0.0"
|
||||
investpy==1.0.8; python_version >= "3.7"
|
||||
ipykernel==6.15.1; python_version >= "3.7"
|
||||
ipykernel==6.15.2; python_version >= "3.7"
|
||||
ipympl==0.8.8
|
||||
ipython-genutils==0.2.0; python_version >= "3.7"
|
||||
ipython==8.4.0; python_full_version >= "3.6.2" and python_version >= "3.8"
|
||||
ipywidgets==7.7.1
|
||||
ipywidgets==7.7.2
|
||||
iso8601==0.1.16
|
||||
jedi==0.18.1; python_full_version >= "3.6.2" and python_version >= "3.8"
|
||||
jinja2==3.1.2; python_version >= "3.7"
|
||||
joblib==1.1.0; python_version >= "3.8" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.8"
|
||||
json5==0.9.9; python_version >= "3.7"
|
||||
json5==0.9.10; python_version >= "3.7"
|
||||
jsonschema==3.2.0
|
||||
jupyter-client==7.3.4; python_full_version >= "3.7.0" and python_version >= "3.7"
|
||||
jupyter-client==7.3.5; python_full_version >= "3.7.0" and python_version >= "3.7"
|
||||
jupyter-console==6.4.4; python_version >= "3.7"
|
||||
jupyter-core==4.11.1; python_full_version >= "3.7.0" and python_version >= "3.7"
|
||||
jupyter-server==1.18.1; python_version >= "3.7"
|
||||
jupyter==1.0.0
|
||||
jupyterlab-pygments==0.2.2; python_version >= "3.7"
|
||||
jupyterlab-server==2.15.0; python_version >= "3.7"
|
||||
jupyterlab-server==2.15.1; python_version >= "3.7"
|
||||
jupyterlab-widgets==1.1.1; python_version >= "3.6"
|
||||
jupyterlab==3.4.5; python_version >= "3.7"
|
||||
kiwisolver==1.4.4; python_version >= "3.7"
|
||||
@@ -103,7 +104,7 @@ korean-lunar-calendar==0.2.1; python_version >= "3.8" and python_version < "4.0"
|
||||
linearmodels==4.27; python_version >= "3.8"
|
||||
lxml==4.9.1; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.7"
|
||||
markupsafe==2.1.1; python_version >= "3.7"
|
||||
matplotlib-inline==0.1.5; python_full_version >= "3.6.2" and python_version >= "3.8"
|
||||
matplotlib-inline==0.1.6; python_full_version >= "3.6.2" and python_version >= "3.8"
|
||||
matplotlib==3.5.3; python_version >= "3.7"
|
||||
mistune==0.8.4; python_version >= "3.7"
|
||||
more-itertools==8.14.0; python_version >= "3.6"
|
||||
@@ -117,7 +118,7 @@ nbclient==0.5.13; python_full_version >= "3.7.0" and python_version >= "3.7"
|
||||
nbconvert==6.5.3; python_version >= "3.7"
|
||||
nbformat==5.4.0; python_full_version >= "3.7.0" and python_version >= "3.7"
|
||||
nest-asyncio==1.5.5; python_full_version >= "3.7.0" and python_version >= "3.7"
|
||||
networkx==2.8.5; python_version >= "3.8"
|
||||
networkx==2.8.6; python_version >= "3.8"
|
||||
notebook-shim==0.1.0; python_version >= "3.7"
|
||||
notebook==6.4.12; python_version >= "3.7"
|
||||
numpy==1.23.2; python_version >= "3.8"
|
||||
@@ -156,18 +157,17 @@ pure-eval==0.2.2; python_full_version >= "3.6.2" and python_version >= "3.8"
|
||||
py==1.11.0; implementation_name == "pypy" and python_version >= "3.7" and python_full_version >= "3.7.0"
|
||||
pyally==1.1.2
|
||||
pycares==4.2.2; python_version >= "3.5.2"
|
||||
pycoingecko==2.2.0
|
||||
pycparser==2.21; python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.4.0"
|
||||
pycoingecko==2.3.0
|
||||
pycparser==2.21
|
||||
pyerfa==2.0.0.1; python_version >= "3.8"
|
||||
pyex==0.5.0
|
||||
pygments==2.13.0; python_version >= "3.6"
|
||||
pyhdfe==0.1.0; python_version >= "3.8"
|
||||
pyluach==2.0.0; python_version >= "3.8" and python_version < "4.0" and python_full_version >= "3.7.0"
|
||||
pyluach==2.0.1; python_version >= "3.8" and python_version < "4.0" and python_full_version >= "3.7.0"
|
||||
pymeeus==0.5.11; python_version >= "3.7" and python_version < "4"
|
||||
pymongo==3.12.3
|
||||
pyobjc-core==8.5; python_version >= "3.6" and sys_platform == "darwin"
|
||||
pyobjc-framework-cocoa==8.5; python_version >= "3.6" and sys_platform == "darwin"
|
||||
pyopenssl==22.0.0; python_version >= "3.7" and python_full_version < "3.0.0" and python_version < "4" or python_full_version >= "3.6.0" and python_version < "4" and python_version >= "3.7"
|
||||
pyotp==2.6.0; python_version >= "3"
|
||||
pyparsing==3.0.9; python_full_version >= "3.6.8" and python_version >= "3.7"
|
||||
pyportfolioopt==1.5.3; python_version >= "3.8" and python_version < "3.11"
|
||||
@@ -187,7 +187,7 @@ pywinpty==2.0.7; os_name == "nt" and python_version >= "3.7"
|
||||
pyyaml==6.0; python_version >= "3.8"
|
||||
pyzmq==23.2.1; python_full_version >= "3.7.0" and python_version >= "3.7"
|
||||
qdldl==0.1.5.post2; python_version >= "3.8" and python_version < "3.11"
|
||||
qtconsole==5.3.1; python_version >= "3.7"
|
||||
qtconsole==5.3.2; python_version >= "3.7"
|
||||
qtpy==2.2.0; python_version >= "3.7"
|
||||
quandl==3.7.0; python_version >= "3.6"
|
||||
rapidfuzz==1.9.1; python_version >= "2.7"
|
||||
@@ -203,7 +203,7 @@ scipy==1.8.1; python_version >= "3.8" and python_version < "3.11"
|
||||
screeninfo==0.6.7
|
||||
scs==3.2.0; python_version >= "3.8" and python_version < "3.11"
|
||||
seaborn==0.11.2; python_version >= "3.6"
|
||||
selenium==4.4.0; python_version >= "3.7" and python_version < "4.0"
|
||||
selenium==4.4.3; python_version >= "3.7" and python_version < "4.0"
|
||||
send2trash==1.8.0; python_version >= "3.7"
|
||||
sentiment-investor==2.1.0; python_version >= "3.8" and python_version < "4.0"
|
||||
setuptools-scm==6.4.2; python_version >= "3.8"
|
||||
@@ -216,7 +216,7 @@ sortedcontainers==2.4.0; python_version >= "3.7" and python_version < "4.0"
|
||||
soupsieve==2.3.2.post1; python_version >= "3.6" and python_full_version >= "3.6.0"
|
||||
squarify==0.4.3
|
||||
sseclient==0.0.27
|
||||
stack-data==0.4.0; python_full_version >= "3.6.2" and python_version >= "3.8"
|
||||
stack-data==0.5.0; python_full_version >= "3.6.2" and python_version >= "3.8"
|
||||
statsmodels==0.13.2; python_version >= "3.7"
|
||||
tabulate==0.8.10; python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.6.0"
|
||||
temporal-cache==0.1.4
|
||||
@@ -240,18 +240,18 @@ tzlocal==4.2; python_version >= "3.6"
|
||||
ujson==5.4.0; python_version >= "3.7"
|
||||
unidecode==1.3.4; python_version >= "3.7"
|
||||
update-checker==0.18.0; python_version >= "3.7" and python_version < "4.0"
|
||||
urllib3==1.26.11; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.8" and python_full_version < "4.0.0"
|
||||
urllib3==1.26.12; python_full_version >= "3.7.1" and python_version < "4" and python_version >= "3.8" and python_full_version < "4.0.0"
|
||||
user-agent==0.1.10
|
||||
vadersentiment==3.3.2
|
||||
valinvest==0.0.2; python_version >= "3.6"
|
||||
voila==0.3.6; python_version >= "3.7"
|
||||
wcwidth==0.2.5; python_full_version >= "3.6.2" and python_version >= "3.8"
|
||||
webencodings==0.5.1; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.7"
|
||||
websocket-client==1.3.3; python_version >= "3.8" and python_version < "4.0"
|
||||
websocket-client==1.4.0; python_version >= "3.8" and python_version < "4.0"
|
||||
websockets==10.3; python_version >= "3.7"
|
||||
widgetsnbextension==3.6.1
|
||||
wrapt==1.14.1; python_full_version >= "3.7.1" and python_full_version < "4.0.0" and python_version >= "3.8"
|
||||
wsproto==1.1.0; python_version >= "3.7" and python_version < "4.0" and python_full_version >= "3.7.0"
|
||||
wsproto==1.2.0; python_version >= "3.7" and python_version < "4.0" and python_full_version >= "3.7.0"
|
||||
xlsxwriter==3.0.3; python_version >= "3.7"
|
||||
yarl==1.7.2; python_version >= "3.6"
|
||||
yfinance==0.1.74
|
||||
|
||||
Reference in New Issue
Block a user