bugfixing hedge fund
This commit is contained in:
parent
2fbe90f31b
commit
1172635016
@ -25,6 +25,22 @@ warnings.filterwarnings("ignore", category=RuntimeWarning, message="invalid valu
|
||||
start_date = datetime(2015, 1, 1).strftime("%Y-%m-%d")
|
||||
end_date = datetime.today().strftime("%Y-%m-%d")
|
||||
|
||||
def get_last_completed_quarter():
|
||||
today = datetime.today()
|
||||
year = today.year
|
||||
month = today.month
|
||||
# Calculate the current quarter (1 to 4)
|
||||
current_quarter = (month - 1) // 3 + 1
|
||||
|
||||
# The previous quarter is the last completed quarter.
|
||||
# If we're in Q1, the previous quarter is Q4 of last year.
|
||||
if current_quarter == 1:
|
||||
return 4, year - 1
|
||||
else:
|
||||
return current_quarter - 1, year
|
||||
|
||||
# Get last completed quarter and its year
|
||||
quarter, year = get_last_completed_quarter()
|
||||
|
||||
|
||||
if os.path.exists("backup_db/etf.db"):
|
||||
@ -188,7 +204,7 @@ class ETFDatabase:
|
||||
f"https://financialmodelingprep.com/api/v3/etf-country-weightings/{symbol}?apikey={api_key}",
|
||||
f"https://financialmodelingprep.com/api/v3/quote/{symbol}?apikey={api_key}",
|
||||
f"https://financialmodelingprep.com/stable/dividends?symbol={symbol}&apikey={api_key}",
|
||||
f"https://financialmodelingprep.com/api/v4/institutional-ownership/institutional-holders/symbol-ownership-percent?date=2023-09-30&symbol={symbol}&page=0&apikey={api_key}",
|
||||
f"https://financialmodelingprep.com/stable/institutional-ownership/symbol-positions-summary?symbol={symbol}&year={year}&quarter={quarter}&apikey={api_key}",
|
||||
]
|
||||
|
||||
fundamental_data = {}
|
||||
@ -238,7 +254,7 @@ class ETFDatabase:
|
||||
elif "dividends" in url:
|
||||
fundamental_data['etf_dividend'] = ujson.dumps(parsed_data)
|
||||
|
||||
elif "institutional-ownership/institutional-holders" in url:
|
||||
elif "institutional-ownership" in url:
|
||||
fundamental_data['shareholders'] = ujson.dumps(parsed_data)
|
||||
|
||||
except:
|
||||
|
||||
@ -49,20 +49,14 @@ etf_dict = {normalize_name(etf['name']): etf['symbol'] for etf in etf_data}
|
||||
etf_symbols = [item['symbol'] for item in etf_data]
|
||||
|
||||
|
||||
crypto_cursor = crypto_con.cursor()
|
||||
crypto_cursor.execute("PRAGMA journal_mode = wal")
|
||||
crypto_cursor.execute("SELECT DISTINCT symbol FROM cryptos")
|
||||
crypto_symbols = [row[0] for row in crypto_cursor.fetchall()]
|
||||
|
||||
total_symbols = stock_symbols + etf_symbols + crypto_symbols
|
||||
total_symbols = stock_symbols + etf_symbols
|
||||
con.close()
|
||||
etf_con.close()
|
||||
crypto_con.close()
|
||||
|
||||
|
||||
load_dotenv()
|
||||
api_key = os.getenv('FMP_API_KEY')
|
||||
quarter_date = '2024-09-30'
|
||||
quarter_date = '2024-12-31'
|
||||
|
||||
|
||||
|
||||
|
||||
@ -27,8 +27,22 @@ warnings.filterwarnings("ignore", category=RuntimeWarning, message="invalid valu
|
||||
start_date = datetime(2015, 1, 1).strftime("%Y-%m-%d")
|
||||
end_date = datetime.today().strftime("%Y-%m-%d")
|
||||
|
||||
quarter_date = '2024-06-30'
|
||||
def get_last_completed_quarter():
|
||||
today = datetime.today()
|
||||
year = today.year
|
||||
month = today.month
|
||||
# Calculate the current quarter (1 to 4)
|
||||
current_quarter = (month - 1) // 3 + 1
|
||||
|
||||
# The previous quarter is the last completed quarter.
|
||||
# If we're in Q1, the previous quarter is Q4 of last year.
|
||||
if current_quarter == 1:
|
||||
return 4, year - 1
|
||||
else:
|
||||
return current_quarter - 1, year
|
||||
|
||||
# Get last completed quarter and its year
|
||||
quarter, year = get_last_completed_quarter()
|
||||
|
||||
if os.path.exists("backup_db/stocks.db"):
|
||||
os.remove('backup_db/stocks.db')
|
||||
@ -104,7 +118,7 @@ class StockDatabase:
|
||||
f"https://financialmodelingprep.com/api/v4/historical/employee_count?symbol={symbol}&apikey={api_key}",
|
||||
f"https://financialmodelingprep.com/api/v3/historical-price-full/stock_split/{symbol}?apikey={api_key}",
|
||||
f"https://financialmodelingprep.com/api/v4/stock_peers?symbol={symbol}&apikey={api_key}",
|
||||
f"https://financialmodelingprep.com/api/v4/institutional-ownership/institutional-holders/symbol-ownership-percent?date={quarter_date}&symbol={symbol}&page=0&apikey={api_key}",
|
||||
f"https://financialmodelingprep.com/stable/institutional-ownership/symbol-positions-summary?symbol={symbol}&year={year}&quarter={quarter}&apikey={api_key}",
|
||||
f"https://financialmodelingprep.com/api/v4/historical/shares_float?symbol={symbol}&apikey={api_key}",
|
||||
f"https://financialmodelingprep.com/api/v4/revenue-product-segmentation?symbol={symbol}&structure=flat&period=annual&apikey={api_key}",
|
||||
f"https://financialmodelingprep.com/api/v4/revenue-geographic-segmentation?symbol={symbol}&structure=flat&apikey={api_key}",
|
||||
@ -165,7 +179,7 @@ class StockDatabase:
|
||||
elif "stock_peers" in url:
|
||||
# Handle list response, save as JSON object
|
||||
fundamental_data['stock_peers'] = ujson.dumps([item for item in parsed_data[0]['peersList'] if item != ""])
|
||||
elif "institutional-ownership/institutional-holders" in url:
|
||||
elif "institutional-ownership" in url:
|
||||
# Handle list response, save as JSON object
|
||||
fundamental_data['shareholders'] = ujson.dumps(parsed_data)
|
||||
elif "historical/shares_float" in url:
|
||||
|
||||
@ -114,24 +114,11 @@ def get_data(cik, stock_sectors):
|
||||
'marketValue': row[5],
|
||||
'winRate': row[6],
|
||||
'holdings': orjson.loads(row[7]),
|
||||
} for row in cik_data]
|
||||
} for row in cik_data][0]
|
||||
|
||||
if not res:
|
||||
return None # Exit if no data is found
|
||||
|
||||
'''
|
||||
filtered_data = []
|
||||
for item in res:
|
||||
try:
|
||||
filtered_data+=item['holdings']
|
||||
except:
|
||||
pass
|
||||
filtered_data = [item for item in filtered_data if datetime.strptime(item['date'], "%Y-%m-%d") >= cutoff_date]
|
||||
print(filtered_data)
|
||||
'''
|
||||
|
||||
res = res[0] #latest data
|
||||
|
||||
filtered_holdings = [
|
||||
{key: holding[key] for key in keys_to_keep}
|
||||
for holding in res['holdings']
|
||||
@ -162,9 +149,10 @@ def get_data(cik, stock_sectors):
|
||||
if quote_data:
|
||||
item['price'] = quote_data.get('price',None)
|
||||
item['changesPercentage'] = round(quote_data.get('changesPercentage'), 2) if quote_data.get('changesPercentage') is not None else None
|
||||
item['name'] = quote_data.get('name')
|
||||
except:
|
||||
pass
|
||||
#stock_screener_data_dict
|
||||
|
||||
res['holdings'] = filtered_holdings
|
||||
for rank, item in enumerate(res['holdings'], 1):
|
||||
item['rank'] = rank
|
||||
@ -209,7 +197,7 @@ if __name__ == '__main__':
|
||||
cursor.execute("SELECT DISTINCT cik FROM institutes")
|
||||
cik_symbols = [row[0] for row in cursor.fetchall()]
|
||||
#Test mode
|
||||
#cik_symbols = ['0001649339']
|
||||
cik_symbols = ['0001067983']
|
||||
try:
|
||||
stock_cursor = stock_con.cursor()
|
||||
stock_cursor.execute("SELECT DISTINCT symbol, sector FROM stocks")
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user