This commit is contained in:
MuslemRahimi 2024-10-28 13:48:08 +01:00
parent 044288eb02
commit c31554742f
3 changed files with 43 additions and 27 deletions

View File

@ -63,6 +63,12 @@ async def get_financial_statements(session, symbol, semaphore, request_counter):
await asyncio.sleep(60) # Pause for 60 seconds await asyncio.sleep(60) # Pause for 60 seconds
request_counter[0] = 0 # Reset the request counter after the pause request_counter[0] = 0 # Reset the request counter after the pause
url = f"https://financialmodelingprep.com/api/v3/key-metrics-ttm/{symbol}?apikey={api_key}"
data = await fetch_data(session, url, symbol)
if data:
await save_json(symbol, 'ttm', 'key-metrics', data)
# Fetch owner earnings data # Fetch owner earnings data
owner_earnings_url = f"https://financialmodelingprep.com/api/v4/owner_earnings?symbol={symbol}&apikey={api_key}" owner_earnings_url = f"https://financialmodelingprep.com/api/v4/owner_earnings?symbol={symbol}&apikey={api_key}"
owner_earnings_data = await fetch_data(session, owner_earnings_url, symbol) owner_earnings_data = await fetch_data(session, owner_earnings_url, symbol)

View File

@ -1,4 +1,4 @@
import ujson import orjson
import asyncio import asyncio
import sqlite3 import sqlite3
import pandas as pd import pandas as pd
@ -6,11 +6,11 @@ from tqdm import tqdm
async def save_stockdeck(symbol, data): async def save_stockdeck(symbol, data):
with open(f"json/stockdeck/{symbol}.json", 'w') as file: with open(f"json/stockdeck/{symbol}.json", 'w') as file:
ujson.dump(data, file) file.write(orjson.dumps(data).decode('utf-8'))
query_template = """ query_template = """
SELECT SELECT
profile, quote, profile,
stock_split stock_split
FROM FROM
stocks stocks
@ -18,45 +18,49 @@ query_template = """
symbol = ? symbol = ?
""" """
with open(f"json/stock-screener/data.json", 'rb') as file:
stock_screener_data = orjson.loads(file.read())
stock_screener_data_dict = {item['symbol']: item for item in stock_screener_data}
screener_columns = ['floatShares', 'forwardPE','shortOutStandingPercent','shortFloatPercent','revenueTTM',"netIncomeTTM"]
async def get_data(ticker): async def get_data(ticker):
try: try:
df = pd.read_sql_query(query_template, con, params=(ticker,)) df = pd.read_sql_query(query_template, con, params=(ticker,))
if df.empty: if df.empty:
final_res =[{}] res_list =[{}]
return final_res return res_list
else: else:
data= df.to_dict(orient='records') data= df.to_dict(orient='records')
data =data[0] data =data[0]
company_profile = ujson.loads(data['profile']) company_profile = orjson.loads(data['profile'])
#company_quote = ujson.loads(data['quote'])
try: try:
with open(f"json/quote/{ticker}.json", 'r') as file: with open(f"json/quote/{ticker}.json", 'r') as file:
company_quote = ujson.load(file) company_quote = orjson.loads(file.read())
except: except:
company_quote = {} company_quote = {}
try: try:
with open(f"json/ai-score/companies/{ticker}.json", 'r') as file: with open(f"json/ai-score/companies/{ticker}.json", 'r') as file:
score = ujson.load(file)['score'] score = orjson.loads(file.read())['score']
except: except:
score = None score = None
try: try:
with open(f"json/forward-pe/{ticker}.json", 'r') as file: screener_result = {column: stock_screener_data_dict.get(ticker, {}).get(column, None) for column in screener_columns}
forward_pe = ujson.load(file)['forwardPE']
if forward_pe == 0:
forward_pe = None
except: except:
forward_pe = None screener_result = {column: None for column in screener_columns}
if data['stock_split'] == None: if data['stock_split'] == None:
company_stock_split = [] company_stock_split = []
else: else:
company_stock_split = ujson.loads(data['stock_split']) company_stock_split = orjson.loads(data['stock_split'])
res_profile = [ res_list = {
{ **screener_result,
"ipoDate": company_profile[0]['ipoDate'],
'ceoName': company_profile[0]['ceo'], 'ceoName': company_profile[0]['ceo'],
'companyName': company_profile[0]['companyName'], 'companyName': company_profile[0]['companyName'],
'industry': company_profile[0]['industry'], 'industry': company_profile[0]['industry'],
@ -70,7 +74,6 @@ async def get_data(ticker):
'pe': company_quote['pe'], 'pe': company_quote['pe'],
'eps': company_quote['eps'], 'eps': company_quote['eps'],
'sharesOutstanding': company_quote['sharesOutstanding'], 'sharesOutstanding': company_quote['sharesOutstanding'],
'forwardPE': forward_pe,
'score': score, 'score': score,
'previousClose': company_quote['price'], #This is true because I update my db before the market opens hence the price will be the previousClose price. 'previousClose': company_quote['price'], #This is true because I update my db before the market opens hence the price will be the previousClose price.
'website': company_profile[0]['website'], 'website': company_profile[0]['website'],
@ -78,16 +81,12 @@ async def get_data(ticker):
'fullTimeEmployees': company_profile[0]['fullTimeEmployees'], 'fullTimeEmployees': company_profile[0]['fullTimeEmployees'],
'stockSplits': company_stock_split, 'stockSplits': company_stock_split,
} }
]
return res_list
final_res = {k: v for d in [res_profile] for dict in d for k, v in dict.items()}
return final_res
except Exception as e: except Exception as e:
print(e) print(e)
final_res =[{}] res_list ={}
return final_res return res_list
async def run(): async def run():
cursor = con.cursor() cursor = con.cursor()
@ -96,7 +95,7 @@ async def run():
stocks_symbols = [row[0] for row in cursor.fetchall()] stocks_symbols = [row[0] for row in cursor.fetchall()]
for ticker in tqdm(stocks_symbols): for ticker in tqdm(stocks_symbols):
res = await get_data(ticker) res = await get_data(ticker)
await save_stockdeck(ticker, [res]) await save_stockdeck(ticker, res)
try: try:
con = sqlite3.connect('stocks.db') con = sqlite3.connect('stocks.db')

View File

@ -563,7 +563,7 @@ async def get_stock_screener(con):
try: try:
with open(f"json/stockdeck/{symbol}.json", 'r') as file: with open(f"json/stockdeck/{symbol}.json", 'r') as file:
res = orjson.loads(file.read())[0] res = orjson.loads(file.read())
item['employees'] = int(res['fullTimeEmployees']) item['employees'] = int(res['fullTimeEmployees'])
item['sharesOutStanding'] = int(res['sharesOutstanding']) item['sharesOutStanding'] = int(res['sharesOutstanding'])
item['country'] = get_country_name(res['country']) item['country'] = get_country_name(res['country'])
@ -687,6 +687,17 @@ async def get_stock_screener(con):
item['grahamNumber'] = None item['grahamNumber'] = None
try:
with open(f"json/financial-statements/key-metrics/ttm/{symbol}.json", 'r') as file:
res = orjson.loads(file.read())[0]
item['revenueTTM'] = round(res['revenuePerShareTTM']*item['sharesOutStanding'],2)
item['netIncomeTTM'] = round(res['netIncomePerShareTTM']*item['sharesOutStanding'],2)
except:
item['revenueTTM'] = None
item['netIncomeTTM'] = None
try: try:
with open(f"json/ai-score/companies/{symbol}.json", 'r') as file: with open(f"json/ai-score/companies/{symbol}.json", 'r') as file:
score = orjson.loads(file.read())['score'] score = orjson.loads(file.read())['score']