File size: 3,023 Bytes
28b8c73
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
d264b32
 
 
 
 
 
 
28b8c73
 
d264b32
 
28b8c73
 
 
 
 
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
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()