stock_system/src/main.py

74 lines
3.7 KiB
Python
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import datetime
from screener.data_fetcher import validate_date_range, fetch_financial_data, get_stocks_in_time_range
from screener.c_canslim import check_quarterly_earnings, check_return_on_equity, check_sales_growth
from screener.a_canslim import check_annual_eps_growth
from screener.l_canslim import check_industry_leadership # ✅ NEW: Import L Score function
from screener.i_canslim import check_institutional_sponsorship # ✅ NEW: Import I Score function
from screener.csv_appender import append_scores_to_csv
from screener.screeners import SCREENERS # Import categories
from screener.user_input import get_user_screener_selection # Import function
def main():
# 1⃣ Ask user for start and end date
user_start_date = input("Enter start date (YYYY-MM-DD): ")
user_end_date = input("Enter end date (YYYY-MM-DD): ")
# 2⃣ Validate and adjust date range if needed
start_date, end_date = validate_date_range(user_start_date, user_end_date, required_quarters=4)
# 3⃣ Get selected screeners & customization preferences
selected_screeners = get_user_screener_selection()
print(f"\n✅ Selected Screeners: {selected_screeners}\n") # ✅ DEBUG LOG
# 4⃣ Get all stock symbols dynamically
symbol_list = get_stocks_in_time_range(start_date, end_date)
if not symbol_list:
print("No stocks found within the given date range.")
return
print(f"Processing {len(symbol_list)} stocks within the given date range...\n")
# 5⃣ Process each stock symbol
for symbol in symbol_list:
data = fetch_financial_data(symbol, start_date, end_date)
if not data:
print(f"⚠️ Warning: No data returned for {symbol}. Assigning default score.\n")
scores = {screener: 0.25 for category in selected_screeners for screener in selected_screeners[category]}
else:
scores = {}
# 6⃣ Compute scores dynamically based on user selection
for category, screeners in selected_screeners.items():
for screener, threshold in screeners.items():
if screener == "EPS_Score":
scores[screener] = check_quarterly_earnings(data.get("quarterly_eps", []))
elif screener == "Annual_EPS_Score":
scores[screener] = check_annual_eps_growth(data.get("annual_eps", []))
elif screener == "Sales_Score":
scores[screener] = check_sales_growth(data.get("sales_growth", []))
elif screener == "ROE_Score":
scores[screener] = check_return_on_equity(data.get("roe", []))
elif screener == "L_Score":
scores[screener] = check_industry_leadership(symbol) # ✅ NEW: Industry Leadership Calculation
print(f"🟢 {symbol} - L_Score: {scores[screener]}") # ✅ DEBUG LOG
elif screener == "I_Score":
scores[screener] = check_institutional_sponsorship(symbol) # ✅ NEW: Institutional Sponsorship Check
print(f"🏢 {symbol} - I_Score: {scores[screener]}") # ✅ DEBUG LOG
# Apply user-defined threshold if applicable
if isinstance(threshold, (int, float)):
scores[screener] = scores[screener] >= threshold
# 7⃣ Calculate Total Score
scores["Total_Score"] = sum(scores.values()) # ✅ NEW: Total Score Calculation
# 8⃣ Append results to CSV
append_scores_to_csv(symbol, scores)
print("✅ Scores saved in data/metrics/stock_scores.csv\n")
if __name__ == "__main__":
main()