Spaces:
Sleeping
Sleeping
File size: 3,339 Bytes
6ca5d0a ad5130b 899a973 6ca5d0a |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 |
import yfinance as yf
import pandas as pd
import streamlit as st
from fpdf import FPDF
import requests
from bs4 import BeautifulSoup
from textblob import TextBlob
# Function to fetch financial statements
def get_financials(ticker):
stock = yf.Ticker(ticker)
return stock.balance_sheet, stock.financials, stock.cashflow
# Function to compute key financial ratios
def calculate_ratios(balance_sheet, income_statement):
try:
ratios = {
"Current Ratio": balance_sheet.loc["Current Assets"][0] / balance_sheet.loc["Current Liabilities"][0],
"Debt-to-Equity": balance_sheet.loc["Long Term Debt"][0] / balance_sheet.loc["Stockholders Equity"][0],
"Net Profit Margin": income_statement.loc["Net Income"][0] / income_statement.loc["Total Revenue"][0]
}
except Exception as e:
ratios = {"Error": f"Could not compute ratios: {e}"}
return ratios
# Function to fetch latest news headlines for sentiment analysis
def get_news_sentiment(ticker):
url = f"https://finance.yahoo.com/quote/{ticker}/news"
headers = {'User-Agent': 'Mozilla/5.0'}
response = requests.get(url, headers=headers)
soup = BeautifulSoup(response.text, 'html.parser')
headlines = [h.text for h in soup.find_all('h3')][:5] # Get top 5 headlines
sentiments = {}
for headline in headlines:
sentiment_score = TextBlob(headline).sentiment.polarity
sentiments[headline] = "Positive" if sentiment_score > 0 else "Negative" if sentiment_score < 0 else "Neutral"
return sentiments
# Function to generate a PDF report
def generate_report(ticker, ratios, sentiments):
pdf = FPDF()
pdf.add_page()
pdf.set_font("Arial", size=12)
pdf.cell(200, 10, f"Financial Report for {ticker}", ln=True, align='C')
pdf.ln(10)
pdf.cell(200, 10, "Key Financial Ratios:", ln=True)
for key, value in ratios.items():
pdf.cell(200, 10, f"{key}: {value:.2f}" if isinstance(value, (int, float)) else f"{key}: {value}", ln=True)
pdf.ln(10)
pdf.cell(200, 10, "Recent News Sentiment Analysis:", ln=True)
for news, sentiment in sentiments.items():
pdf.multi_cell(0, 10, f"{news} - Sentiment: {sentiment}")
pdf.output("financial_report.pdf")
# Streamlit UI
st.title("AI-Based Financial Analysis App")
ticker = st.text_input("Enter Stock Ticker Symbol (e.g., AAPL, TSLA, MSFT)")
if st.button("Analyze"):
try:
balance_sheet, income_statement, cash_flow = get_financials(ticker)
ratios = calculate_ratios(balance_sheet, income_statement)
sentiments = get_news_sentiment(ticker)
generate_report(ticker, ratios, sentiments)
st.success("Financial Report Generated: financial_report.pdf")
with open("financial_report.pdf", "rb") as file:
st.download_button("Download Report", file, file_name="financial_report.pdf", mime="application/pdf")
st.write("### Key Financial Ratios")
for key, value in ratios.items():
st.write(f"**{key}**: {value:.2f}" if isinstance(value, (int, float)) else f"**{key}**: {value}")
st.write("### Recent News Sentiment Analysis")
for news, sentiment in sentiments.items():
st.write(f"**{news}** - Sentiment: {sentiment}")
except Exception as e:
st.error(f"Error: {e}") |