1
0
mirror of https://gitlab.com/simple-stock-bots/simple-telegram-stock-bot.git synced 2025-06-16 15:06:53 +00:00

using iex api for symbol list

This commit is contained in:
Anson 2020-04-15 07:32:36 -07:00
parent 1a7cfb71b6
commit 28a90b2472

View File

@ -6,6 +6,7 @@ from datetime import datetime, timedelta
import pandas as pd import pandas as pd
import requests as r import requests as r
from fuzzywuzzy import fuzz from fuzzywuzzy import fuzz
import schedule
class Symbol: class Symbol:
@ -14,14 +15,15 @@ class Symbol:
""" """
SYMBOL_REGEX = "[$]([a-zA-Z]{1,4})" SYMBOL_REGEX = "[$]([a-zA-Z]{1,4})"
LIST_URL = "http://oatsreportable.finra.org/OATSReportableSecurities-SOD.txt"
searched_symbols = {} searched_symbols = {}
def __init__(self, IEX_TOKEN: str): def __init__(self, IEX_TOKEN: str):
self.IEX_TOKEN = IEX_TOKEN self.IEX_TOKEN = IEX_TOKEN
self.symbol_list, self.symbol_ts = self.get_symbol_list() self.get_symbol_list()
schedule.every().day.do(self.get_symbol_list)
def get_symbol_list(self): def get_symbol_list(self, return_df=False):
""" """
Fetches a list of stock market symbols from FINRA Fetches a list of stock market symbols from FINRA
@ -29,15 +31,15 @@ class Symbol:
pd.DataFrame -- [DataFrame with columns: Symbol | Issue_Name | Primary_Listing_Mkt pd.DataFrame -- [DataFrame with columns: Symbol | Issue_Name | Primary_Listing_Mkt
datetime -- The time when the list of symbols was fetched. The Symbol list is updated every open and close of every trading day. datetime -- The time when the list of symbols was fetched. The Symbol list is updated every open and close of every trading day.
""" """
raw_symbols = r.get(self.LIST_URL).text raw_symbols = r.get(
symbols = pd.DataFrame( f"https://cloud.iexapis.com/stable/ref-data/symbols?token={self.IEX_TOKEN}"
[line.split("|") for line in raw_symbols.split("\n")][:-1] ).json()
) symbols = pd.DataFrame(data=raw_symbols)
symbols.columns = symbols.iloc[0]
symbols = symbols.drop(symbols.index[0]) symbols["description"] = symbols["symbol"] + ": " + symbols["name"]
symbols = symbols.drop(symbols.index[-1]) self.symbol_list = symbols
symbols["Description"] = symbols["Symbol"] + ": " + symbols["Issue_Name"] if return_df:
return symbols, datetime.now() return symbols, datetime.now()
def search_symbols(self, search: str): def search_symbols(self, search: str):
""" """
@ -49,28 +51,26 @@ class Symbol:
Returns: Returns:
List of Tuples -- A list tuples of every stock sorted in order of how well they match. Each tuple contains: (Symbol, Issue Name). List of Tuples -- A list tuples of every stock sorted in order of how well they match. Each tuple contains: (Symbol, Issue Name).
""" """
schedule.run_pending()
try: # https://stackoverflow.com/a/3845776/8774114 try: # https://stackoverflow.com/a/3845776/8774114
return self.searched_symbols[search] return self.searched_symbols[search]
except KeyError: except KeyError:
pass pass
if self.symbol_ts - datetime.now() > timedelta(hours=3):
self.symbol_list, self.symbol_ts = self.get_symbol_list()
symbols = self.symbol_list symbols = self.symbol_list
symbols["Match"] = symbols.apply( symbols["Match"] = symbols.apply(
lambda x: fuzz.ratio(search.lower(), f"{x['Symbol']}".lower()), axis=1, lambda x: fuzz.ratio(search.lower(), f"{x['symbol']}".lower()), axis=1,
) )
symbols.sort_values(by="Match", ascending=False, inplace=True) symbols.sort_values(by="Match", ascending=False, inplace=True)
if symbols["Match"].head().sum() < 300: if symbols["Match"].head().sum() < 300:
symbols["Match"] = symbols.apply( symbols["Match"] = symbols.apply(
lambda x: fuzz.partial_ratio(search.lower(), x["Issue_Name"].lower()), lambda x: fuzz.partial_ratio(search.lower(), x["name"].lower()), axis=1,
axis=1,
) )
symbols.sort_values(by="Match", ascending=False, inplace=True) symbols.sort_values(by="Match", ascending=False, inplace=True)
symbols = symbols.head(10) symbols = symbols.head(10)
symbol_list = list(zip(list(symbols["Symbol"]), list(symbols["Description"]))) symbol_list = list(zip(list(symbols["symbol"]), list(symbols["description"])))
self.searched_symbols[search] = symbol_list self.searched_symbols[search] = symbol_list
return symbol_list return symbol_list