File size: 3,767 Bytes
7215fad
 
 
6344d72
7215fad
 
 
 
 
6344d72
 
 
7215fad
 
 
6344d72
 
 
7215fad
d4f1e53
 
090096f
 
6fd0501
 
 
 
 
 
 
 
090096f
6fd0501
d4f1e53
 
7215fad
6344d72
 
 
 
 
 
 
 
7215fad
 
6fd0501
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7215fad
6344d72
 
 
d4f1e53
6344d72
 
090096f
6fd0501
7215fad
6344d72
7215fad
 
 
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
import streamlit as st
import yfinance as yf
import pandas as pd
import plotly.graph_objects as go

def fetch_data(ticker, start_date, end_date):
    data = yf.download(ticker, start=start_date, end=end_date)
    return data

def calculate_indicators(data, window_short, window_long):
    data['High Short'] = data['High'].rolling(window=window_short).max()
    data['Low Short'] = data['Low'].rolling(window=window_short).min()
    return data

def identify_signals(data):
    data['Buy Signal'] = (data['Close'] > data['High Short'].shift(1))
    data['Sell Signal'] = (data['Close'] < data['Low Short'].shift(1))
    return data

def collect_signals(data):
    signals = pd.DataFrame()
    signals['Date'] = data.index
    signals['Price'] = data['Close']
    signals['Signal'] = None  # Initialize all to None

    buy_indices = data[data['Buy Signal']].index
    sell_indices = data[data['Sell Signal']].index

    signals.loc[signals['Date'].isin(buy_indices), 'Signal'] = 'Buy'
    signals.loc[signals['Date'].isin(sell_indices), 'Signal'] = 'Sell'

    signals = signals.dropna(subset=['Signal'])

    return signals

def plot_data(data):
    fig = go.Figure()
    fig.add_trace(go.Scatter(x=data.index, y=data['Close'], name='Close Price', line=dict(color='blue')))
    buys = data[data['Buy Signal']]
    sells = data[data['Sell Signal']]
    fig.add_trace(go.Scatter(x=buys.index, y=buys['Close'], mode='markers', name='Buy Signal', marker_symbol='triangle-up', marker_color='green', marker_size=10))
    fig.add_trace(go.Scatter(x=sells.index, y=sells['Close'], mode='markers', name='Sell Signal', marker_symbol='triangle-down', marker_color='red', marker_size=10))
    fig.update_layout(title='Stock Price and Trading Signals', xaxis_title='Date', yaxis_title='Price', template='plotly_dark')
    return fig

def main():
    st.title("Turtle Trading Strategy Visualization")

    st.markdown("""
    ## Description
    This app visualizes the Turtle Trading Strategy, a well-known systematic trading method that follows trends to decide on buying and selling positions based on historical price breakouts. Users can test different short and long window sizes to see how the strategy performs with different settings.

    ## How to Use
    1. **Enter the Ticker Symbol:** Input the stock symbol you want to analyze (e.g., 'AAPL', 'GOOGL').
    2. **Select Date Range:** Choose the start and end dates for the data you wish to analyze.
    3. **Set Window Sizes:** Adjust the window sizes for the short and long term indicators.
    4. **Analyze:** Press the analyze button to see the trading signals and performance charts.
    5. **Review the Outputs:** The chart and the signals table provide visual and data-driven insights respectively.
    """)

    # Sidebar for user inputs
    with st.sidebar:
        ticker = st.text_input("Enter the ticker symbol, e.g., 'AAPL'")
        start_date = st.date_input("Select the start date")
        end_date = st.date_input("Select the end date")
        window_short = st.number_input("Short term window", min_value=5, max_value=60, value=20)
        window_long = st.number_input("Long term window", min_value=5, max_value=120, value=55)

    if st.button("Analyze"):
        data = fetch_data(ticker, start_date, end_date)
        if not data.empty:
            data = calculate_indicators(data, window_short, window_long)
            data = identify_signals(data)
            signals = collect_signals(data)
            fig = plot_data(data)
            st.plotly_chart(fig, use_container_width=True)
            st.write("Trading Signals:")
            st.dataframe(signals)
        else:
            st.error("No data found for the selected ticker and date range.")

if __name__ == "__main__":
    main()