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}")