update
This commit is contained in:
parent
044288eb02
commit
c31554742f
@ -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)
|
||||||
|
|||||||
@ -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')
|
||||||
|
|||||||
@ -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']
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user