stockdemo / app.py
shyam1990's picture
Update app.py
d264b32 verified
raw
history blame contribute delete
No virus
3.02 kB
import yfinance as yf
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
import gradio as gr
def fetch_stock_data(tickers, start_date, end_date):
data = {}
for ticker in tickers.split(','):
stock_data = yf.download(ticker.strip(), start=start_date, end=end_date)
data[ticker.strip()] = stock_data
return data
def preprocess_data(data, window_size=5):
processed_data = {}
feature_names = [f'Lag_{i}' for i in range(1, window_size + 1)]
for ticker, df in data.items():
df['Return'] = df['Adj Close'].pct_change()
df['Future Return'] = df['Return'].shift(-1)
df['Target'] = df['Future Return'].apply(lambda x: 1 if x > 0 else 0)
for i in range(1, window_size + 1):
df[f'Lag_{i}'] = df['Return'].shift(i)
df = df.dropna()
processed_data[ticker] = (df[feature_names], df['Target'])
return processed_data, feature_names
def train_model(processed_data):
models = {}
for ticker, (X, y) in processed_data.items():
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
model = LogisticRegression()
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
models[ticker] = model
print(f'Model for {ticker} trained with accuracy: {accuracy:.2f}')
return models
def predict(models, data, feature_names, window_size=5):
predictions = {}
for ticker, model in models.items():
df = data[ticker]
latest_data = df['Adj Close'].pct_change().dropna().iloc[-window_size:].values.reshape(1, -1)
if latest_data.shape[1] == window_size:
latest_data_df = pd.DataFrame(latest_data, columns=feature_names)
prediction = model.predict(latest_data_df)
predictions[ticker] = 'Buy' if prediction[0] == 1 else 'Sell'
else:
predictions[ticker] = 'Insufficient data'
return predictions
def stock_prediction_app(tickers, start_date, end_date):
stock_data = fetch_stock_data(tickers, start_date, end_date)
processed_data, feature_names = preprocess_data(stock_data)
models = train_model(processed_data)
predictions = predict(models, stock_data, feature_names)
return predictions
# Gradio Interface
inputs = [
gr.Textbox(lines=2, placeholder="Enter tickers separated by commas (e.g., AAPL, MSFT, GOOGL)", label="Stock Tickers"),
gr.Textbox(placeholder="Enter start date (YYYY-MM-DD)", label="Start Date"),
gr.Textbox(placeholder="Enter end date (YYYY-MM-DD)", label="End Date")
]
outputs = gr.JSON()
interface = gr.Interface(
fn=stock_prediction_app,
inputs=inputs,
outputs=outputs,
title="Stock Prediction App",
description="Enter stock tickers, start date, and end date to get buy/sell predictions."
)
interface.launch()