Spaces:
Runtime error
Runtime error
import streamlit as st | |
import yfinance as yf | |
import pandas as pd | |
import matplotlib.pyplot as plt | |
def fetch_data(ticker, start_date, end_date): | |
data = yf.download(ticker, start=start_date, end=end_date) | |
return data | |
def calculate_indicators(data): | |
# High and low for the breakout signals | |
data['20 Day High'] = data['High'].rolling(window=20).max() | |
data['20 Day Low'] = data['Low'].rolling(window=20).min() | |
data['55 Day High'] = data['High'].rolling(window=55).max() | |
data['55 Day Low'] = data['Low'].rolling(window=55).min() | |
return data | |
def identify_signals(data): | |
# Buy signals are generated when the price exceeds the 20-day high | |
data['Buy Signal'] = (data['Close'] > data['20 Day High'].shift(1)) | |
# Sell signals are generated when the price drops below the 20-day low | |
data['Sell Signal'] = (data['Close'] < data['20 Day Low'].shift(1)) | |
signals = [] | |
for index, row in data.iterrows(): | |
if row['Buy Signal']: | |
signals.append({'Date': index, 'Signal Type': 'Buy', 'Price': row['Close']}) | |
if row['Sell Signal']: | |
signals.append({'Date': index, 'Signal Type': 'Sell', 'Price': row['Close']}) | |
return data, pd.DataFrame(signals) | |
def plot_data(data): | |
plt.figure(figsize=(12, 6)) | |
plt.plot(data['Close'], label='Close Price') | |
buy_signals = data[data['Buy Signal']] | |
sell_signals = data[data['Sell Signal']] | |
plt.scatter(buy_signals.index, buy_signals['Close'], marker='^', color='green', s=100, label='Buy Signal') | |
plt.scatter(sell_signals.index, sell_signals['Close'], marker='v', color='red', s=100, label='Sell Signal') | |
plt.title('Stock Price and Turtle Trading Signals') | |
plt.xlabel('Date') | |
plt.ylabel('Price') | |
plt.legend() | |
plt.grid(True) | |
plt.show() | |
def main(): | |
st.title("Turtle Trading Strategy Visualization") | |
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") | |
if st.button("Analyze"): | |
data = fetch_data(ticker, start_date, end_date) | |
data = calculate_indicators(data) | |
data, signals = identify_signals(data) | |
plot_data(data) | |
st.pyplot(plt) | |
if not signals.empty: | |
st.write("Trading Signals:") | |
st.dataframe(signals) | |
else: | |
st.write("No trading signals found for the selected period.") | |
if __name__ == "__main__": | |
main() | |