File size: 3,068 Bytes
03e5d92
 
 
 
 
 
 
 
 
 
 
 
 
11363e8
03e5d92
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
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()