Spaces:
Sleeping
Sleeping
| import yfinance as yf | |
| import pandas as pd | |
| import numpy as np | |
| import streamlit as st | |
| from ta.momentum import RSIIndicator | |
| from ta.trend import MACD | |
| from ta.volatility import BollingerBands | |
| # Function to fetch data from Yahoo Finance | |
| def fetch_data(stock_ticker): | |
| stock_data = yf.Ticker(stock_ticker) | |
| df = stock_data.history(period="1y") | |
| return df, stock_data | |
| # Function to calculate fundamental metrics | |
| def calculate_fundamentals(stock_data): | |
| market_price = stock_data.history(period="1d")['Close'].iloc[-1] | |
| eps = stock_data.info.get('regularMarketEPS', stock_data.info.get('epsTrailingTwelveMonths', 0)) | |
| if eps == 0: | |
| eps = 0 | |
| shares_outstanding = stock_data.info.get('sharesOutstanding', 0) | |
| book_value = stock_data.info.get('bookValue', 0) | |
| annual_dividend = stock_data.info.get('dividendRate', 0) | |
| revenue = stock_data.info.get('totalRevenue', 0) | |
| debt = stock_data.info.get('totalDebt', 0) | |
| cash = stock_data.info.get('cash', 0) | |
| # Calculate P/E, P/B, Dividend Yield | |
| pe_ratio = market_price / eps if eps != 0 else None | |
| pb_ratio = market_price / book_value if book_value != 0 else None | |
| dividend_yield = (annual_dividend / market_price) * 100 if annual_dividend else 0 | |
| # Additional ratios | |
| ps_ratio = stock_data.info.get('marketCap', 0) / revenue if revenue != 0 else None | |
| de_ratio = debt / stock_data.info.get('totalEquity', 1) | |
| # Calculate PEG ratio | |
| peg_ratio = pe_ratio / (stock_data.info.get('earningsGrowth', 0) if stock_data.info.get('earningsGrowth', 0) != 0 else 1) | |
| return { | |
| "P/E Ratio": pe_ratio, | |
| "EPS": eps, | |
| "P/B Ratio": pb_ratio, | |
| "Dividend Yield (%)": dividend_yield, | |
| "P/S Ratio": ps_ratio, | |
| "D/E Ratio": de_ratio, | |
| "PEG Ratio": peg_ratio | |
| } | |
| # Function for Buy/Sell Signal based on P/E, RSI, Moving Averages | |
| def generate_buy_sell_signal(pe_ratio, rsi, sma_50, sma_200): | |
| signal = "Hold" | |
| if pe_ratio and pe_ratio < 15: | |
| signal = "Buy" | |
| elif rsi > 70: | |
| signal = "Sell" | |
| elif sma_50 > sma_200: | |
| signal = "Buy" | |
| elif sma_50 < sma_200: | |
| signal = "Sell" | |
| return signal | |
| # Function to calculate DCF (Discounted Cash Flow) Model | |
| def calculate_dcf(stock_data, growth_rate=0.05, discount_rate=0.08): | |
| fcf = stock_data.info.get('freeCashflow', 0) # Example: FCF (Free Cash Flow) | |
| if fcf == 0: | |
| return None | |
| # Project future FCF for 5 years | |
| future_fcf = [fcf * (1 + growth_rate) ** i for i in range(1, 6)] | |
| # Calculate DCF value | |
| dcf_value = sum([cf / (1 + discount_rate) ** i for i, cf in enumerate(future_fcf, 1)]) | |
| return dcf_value | |
| # Streamlit UI | |
| def app(): | |
| st.title("Stock Prediction and Analysis") | |
| # User input for stock ticker | |
| stock_ticker = st.text_input("Enter Stock Ticker (e.g., AAPL, TATAMOTORS.NS):") | |
| if stock_ticker: | |
| # Fetch stock data | |
| df, stock_data = fetch_data(stock_ticker) | |
| # Display stock data and technical indicators | |
| st.write(f"**Displaying last 5 rows of {stock_ticker} data:**") | |
| st.write(df.tail()) | |
| # Calculate fundamental metrics | |
| fundamentals = calculate_fundamentals(stock_data) | |
| st.subheader("Fundamental Analysis") | |
| st.write(fundamentals) | |
| # Calculate technical indicators (SMA, RSI) | |
| sma_50 = df['Close'].rolling(window=50).mean().iloc[-1] | |
| sma_200 = df['Close'].rolling(window=200).mean().iloc[-1] | |
| rsi_indicator = RSIIndicator(df['Close']) | |
| rsi = rsi_indicator.rsi().iloc[-1] | |
| # Display technical indicators | |
| st.write(f"50-day SMA: {sma_50}") | |
| st.write(f"200-day SMA: {sma_200}") | |
| st.write(f"RSI: {rsi}") | |
| # Generate Buy/Sell Signal | |
| buy_sell_signal = generate_buy_sell_signal(fundamentals['P/E Ratio'], rsi, sma_50, sma_200) | |
| st.subheader("Buy/Sell Signal") | |
| st.write(f"Signal: {buy_sell_signal}") | |
| # DCF Value (example) | |
| dcf_value = calculate_dcf(stock_data) | |
| if dcf_value: | |
| st.subheader("Discounted Cash Flow (DCF) Analysis") | |
| st.write(f"DCF Value: {dcf_value}") | |
| else: | |
| st.write("DCF not available due to lack of Free Cash Flow data") | |
| # Run the app | |
| if __name__ == "__main__": | |
| app() | |