riteshcp's picture
Rename app.py to appok.py
453efb9 verified
Raw
History Blame Contribute Delete
1.92 kB
import streamlit as st
import yfinance as yf
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# Streamlit Title
st.title("Turtle Strategy Implementation for NIFTY 500 Stocks")
# Stock Symbol Input
st.sidebar.header("Stock Selection & Parameters")
symbol = st.sidebar.text_input("Enter Stock Ticker (e.g., RELIANCE.NS):", value='RELIANCE.NS')
# Parameters for the Turtle Strategy
entry_days = st.sidebar.slider("Entry Lookback Period (days)", min_value=10, max_value=60, value=20, step=1)
exit_days = st.sidebar.slider("Exit Lookback Period (days)", min_value=5, max_value=30, value=10, step=1)
# Fetch Stock Data
data = yf.download(symbol, start='2022-01-01', end='2023-01-01')
st.write(f"### Historical Data for {symbol}")
st.dataframe(data.tail(10))
# Turtle Strategy Calculations
data['20D_High'] = data['High'].rolling(window=entry_days).max()
data['10D_Low'] = data['Low'].rolling(window=exit_days).min()
# Entry and Exit Signals
data['Long'] = np.where(data['Close'] > data['20D_High'].shift(1), 1, 0)
data['Exit'] = np.where(data['Close'] < data['10D_Low'].shift(1), -1, 0)
# Position Management
data['Position'] = 0
data.loc[data['Long'] == 1, 'Position'] = 1
data.loc[data['Exit'] == -1, 'Position'] = 0
data['Position'] = data['Position'].ffill().shift(1).fillna(0)
# Strategy Returns Calculation
data['Strategy Returns'] = data['Position'] * data['Close'].pct_change()
data['Cumulative Returns'] = (1 + data['Strategy Returns']).cumprod()
# Plotting Strategy Performance
st.subheader("Turtle Strategy vs Buy and Hold Returns")
plt.figure(figsize=(14, 7))
plt.plot(data['Cumulative Returns'], label='Turtle Strategy Returns')
plt.plot((1 + data['Close'].pct_change()).cumprod(), label='Buy and Hold Returns')
plt.title(f'Turtle Strategy vs Buy and Hold for {symbol}')
plt.legend()
st.pyplot(plt)
# Show Raw Data
st.subheader("Strategy Data Preview")
st.write(data.tail(20))