vsa / app.py
netflypsb's picture
Update app.py
11363e8 verified
import streamlit as st
import yfinance as yf
import pandas as pd
import plotly.graph_objects as go
from datetime import datetime
def vsa_advanced_analysis(data):
signals = []
for i in range(3, len(data)):
if data['Close'][i] > data['Close'][i-1] and data['Volume'][i] > data['Volume'][i-1] and data['Close'][i-1] > data['Close'][i-2]:
signals.append((data.index[i], 'Buy', data['Close'][i]))
elif data['Close'][i] < data['Close'][i-1] and data['Volume'][i] > data['Volume'][i-1] and data['Close'][i-1] < data['Close'][i-2]:
signals.append((data.index[i], 'Sell', data['Close'][i]))
# Example of adding more advanced patterns
if data['Volume'][i] > data['Volume'][i-1] * 1.5 and data['Close'][i] < data['Open'][i]:
signals.append((data.index[i], 'Selling Climax', data['Close'][i]))
return signals
def plot_signals_advanced(data, signals):
fig = go.Figure()
fig.add_trace(go.Candlestick(x=data.index,
open=data['Open'],
high=data['High'],
low=data['Low'],
close=data['Close'],
name='Candlestick'))
for signal in signals:
if signal[1] == 'Buy':
fig.add_trace(go.Scatter(x=[signal[0]], y=[signal[2]], mode='markers', marker=dict(color='green', size=10), name='Buy Signal'))
elif signal[1] == 'Sell':
fig.add_trace(go.Scatter(x=[signal[0]], y=[signal[2]], mode='markers', marker=dict(color='red', size=10), name='Sell Signal'))
elif signal[1] == 'Selling Climax':
fig.add_trace(go.Scatter(x=[signal[0]], y=[signal[2]], mode='markers', marker=dict(color='orange', size=10), name='Selling Climax'))
fig.update_layout(title='Stock Price with Buy and Sell Signals', xaxis_title='Date', yaxis_title='Price')
st.plotly_chart(fig)
def main():
st.title('Advanced VSA Stock Analyzer')
st.write('Input a stock ticker symbol to analyze and generate buy and sell signals using advanced Volume Spread Analysis (VSA).')
ticker = st.text_input('Stock Ticker Symbol', 'AAPL')
start_date = st.date_input('Start Date', datetime(2020, 1, 1))
end_date = st.date_input('End Date', datetime.now())
if st.button('Analyze'):
data = yf.download(ticker, start=start_date, end=end_date)
if data.empty:
st.write('No data found for the selected stock ticker and date range.')
else:
signals = vsa_advanced_analysis(data)
st.write(f'Found {len(signals)} signals.')
if signals:
plot_signals_advanced(data, signals)
signals_df = pd.DataFrame(signals, columns=['Date', 'Signal', 'Price'])
st.write('Buy and Sell Signals:')
st.dataframe(signals_df)
else:
st.write('No buy or sell signals found for the selected stock ticker and date range.')
if __name__ == '__main__':
main()