|
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 |
|
|
|
|
|
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() |
|
|