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:
Paul Symonds
2022-08-31 16:17:29 +01:00
committed by GitHub
parent 7df711d32c
commit 2b0a9e27d6
9 changed files with 318 additions and 1113 deletions

View File

@@ -8,7 +8,8 @@
"yf",
"iex",
"av",
"polygon"
"polygon",
"eodhd"
],
"dps": {
"psi": [

View File

@@ -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"

View File

@@ -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]:

View File

@@ -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"

View File

@@ -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

File diff suppressed because it is too large Load Diff

1
pyproject.toml vendored
View File

@@ -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
View File

@@ -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
View File

@@ -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