riteshcp's picture
Rename app.py to app
835a44b verified
import yfinance as yf
import pandas as pd
import numpy as np
import plotly.graph_objects as go
import streamlit as st
from datetime import datetime
# Step 1: Define a function to fetch real-time market data up to the current date
def fetch_data(ticker_symbol):
ticker = yf.Ticker(ticker_symbol)
end_date = datetime.now().strftime('%Y-%m-%d') # Get the current date
data = ticker.history(start="2023-01-01", end=end_date) # Fetches data from the start of this year to the current date
return data
# Step 2: Define a function to calculate indicators
def calculate_indicators(df, lengthEMA=3, lengthRSI=14, momentumLength=3, trendLength=50):
# Calculate Moving Averages
df['MA20'] = df['Close'].rolling(window=20).mean()
df['MA50'] = df['Close'].rolling(window=50).mean()
# Calculate EMA for Buy Signal
buy_signal = df['Close'] - df['Open']
df['SignalEMA'] = df['Close'].ewm(span=lengthEMA, adjust=False).mean()
# Calculate RSI
delta = df['Close'].diff(1)
gain = (delta.where(delta > 0, 0)).rolling(window=lengthRSI).mean()
loss = (-delta.where(delta < 0, 0)).rolling(window=lengthRSI).mean()
rs = gain / loss
df['RSI'] = 100 - (100 / (1 + rs))
# Calculate Momentum
df['Momentum'] = df['Close'].diff(momentumLength)
# Composite SIGNAL Calculation
df['SignalComposite'] = (0.5 * df['SignalEMA']) + (0.3 * (df['RSI'] - 50) / 100) + (0.2 * (df['Momentum'] / df['Close'].rolling(window=lengthRSI).mean()))
# Smooth the Composite SIGNAL with EMA
df['SmoothedSignal'] = df['SignalComposite'].ewm(span=lengthEMA, adjust=False).mean()
# Trend Filter (SMA)
df['TrendSMA'] = df['Close'].rolling(window=trendLength).mean()
# Buy and Sell Signals
buyThreshold = 0.75
sellThreshold = -0.75
df['BuySignal'] = (df['SmoothedSignal'] > buyThreshold) & (df['Close'] > df['TrendSMA'])
df['SellSignal'] = (df['SmoothedSignal'] < sellThreshold) & (df['Close'] < df['TrendSMA'])
return df
# Step 3: Streamlit UI Setup for Stock Selection
st.title("Indian Share Market Analysis")
# Add a stock selector input box
st.sidebar.header("Select Stock Ticker")
ticker_symbol = st.sidebar.text_input("Enter Stock Ticker (e.g., RELIANCE.NS, ^NSEI)", "^NSEI")
# Step 4: Fetch Data and Calculate Indicators
nifty_data = fetch_data(ticker_symbol)
nifty_data = calculate_indicators(nifty_data)
# Step 5: Display Stock Data
st.subheader(f"Data Overview for {ticker_symbol}")
st.write(nifty_data.head())
# Step 6: Visualizations using Plotly for Interactivity
st.subheader(f"Buy and Sell Signals for {ticker_symbol}")
# Create a Plotly figure
fig = go.Figure()
# Add Close Price line
fig.add_trace(go.Scatter(
x=nifty_data.index,
y=nifty_data['Close'],
mode='lines',
name='Close Price',
line=dict(color='blue')
))
# Add Trend SMA line
fig.add_trace(go.Scatter(
x=nifty_data.index,
y=nifty_data['TrendSMA'],
mode='lines',
name='Trend SMA',
line=dict(color='gray')
))
# Plot Buy Signals
buy_signals = nifty_data[nifty_data['BuySignal']]
fig.add_trace(go.Scatter(
x=buy_signals.index,
y=buy_signals['Close'],
mode='markers',
name='Buy Signal',
marker=dict(symbol='triangle-up', color='green', size=10)
))
# Plot Sell Signals
sell_signals = nifty_data[nifty_data['SellSignal']]
fig.add_trace(go.Scatter(
x=sell_signals.index,
y=sell_signals['Close'],
mode='markers',
name='Sell Signal',
marker=dict(symbol='triangle-down', color='red', size=10)
))
# Update layout for better readability
fig.update_layout(
title=f"Buy and Sell Signals with Trend Filter for {ticker_symbol}",
xaxis_title="Date",
yaxis_title="Close Price",
legend_title="Legend",
template="plotly_dark"
)
# Show Plotly figure in Streamlit
st.plotly_chart(fig)
# Step 7: Interactive Timeframe Selection and Alerts
st.sidebar.subheader("Select Timeframe:")
timeframes = ['1d', '5d', '1mo', '3mo', '6mo', '1y', '2y', '5y', '10y', 'ytd', 'max']
selected_timeframe = st.sidebar.selectbox('Timeframe', timeframes)
st.sidebar.subheader("Set Alerts:")
alert_type = st.sidebar.selectbox('Alert Type', ['Price', 'RSI'])
alert_value = st.sidebar.number_input('Enter Alert Value')
# Step 8: Run the Streamlit App (Note: Do not use st.run())
# Save as `app.py` and run it using `streamlit run app.py`