File size: 3,618 Bytes
a575745
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import numpy as np
import pandas as pd
import streamlit as st
import plotly.express as px
from sklearn.model_selection import train_test_split
from sklearn import preprocessing
import yfinance as yf
from sklearn.linear_model import LinearRegression

# Streamlit app
st.title('CUSTOM Stock Price Prediction 💰')
st.write('This model predicts upon trends. It will not perform well in volatile history. setting the time frame "max" is recommended. Your predicted days value can not exceed the time frame days. Have fun!')
# Input widgets
stock = st.text_input('Stock tag', value='NVDA')
daysago = st.text_input('Time frame in days (write "max" for max time)', value='365')
forecast_out = st.number_input('Predicted days', value=180,min_value=1)
forecast_col = 'Close'

def prepare_data(df,forecast_col,forecast_out):
    label = df[forecast_col].shift(-forecast_out) #creating new column called label with the last 5 rows are nan
    X = np.array(df[[forecast_col]]) #creating the feature array
    X = preprocessing.scale(X) #processing the feature array
    X_lately = X[-forecast_out:] #creating the column i want to use later in the predicting method
    X = X[:-forecast_out] # X that will contain the training and testing
    label.dropna(inplace=True) #dropping na values
    y = np.array(label)  # assigning Y
    X_train, X_test, Y_train, Y_test = train_test_split(X, y, test_size=0.2, random_state=42) #cross validation

    response = [X_train,X_test , Y_train, Y_test , X_lately]
    return response

# Button to trigger model generation and prediction
if st.button('Generate'):
    # Fetch stock data
    if daysago != 'max':
        daysago = str(daysago) + 'd'

    ticker = yf.Ticker(stock)
    data = ticker.history(period=daysago)

    X_train, X_test, Y_train, Y_test , X_lately =prepare_data(data,forecast_col,forecast_out); #calling the method were the cross validation and data preperation is in

    # Model Generation
    learner = LinearRegression()
    learner.fit(X_train, Y_train)
    score = learner.score(X_test, Y_test)
    forecast = learner.predict(X_lately)
    #st.write('Used Model:', selected_algorithm)
    st.write('Accuracy Score:', score)

    #GRAPH
    # Create a DataFrame with future dates and predicted values
    future_dates = pd.date_range(start=data.index[-1] + pd.Timedelta(days=1), periods=forecast_out, freq='D')
    predicted_data = pd.DataFrame({'Date': future_dates, 'Predicted Close': forecast})

    # Concatenate original data and predicted data
    combined_data = pd.concat([data.rename(columns={'Close': 'Actual Close'}), predicted_data.set_index('Date')], axis=1)

    # Plot original and predicted stock prices
    fig = px.line(combined_data, x=combined_data.index, y=['Actual Close', 'Predicted Close'], title=f'Predicted {stock} Stock Prices')
    fig.update_layout(xaxis_title='Date',yaxis_title='Price',legend_title_text='')

    # Set line colors
    fig.data[1].line.color = 'orange'

    st.plotly_chart(fig)

    st.write('Findings: I tried using pycaret.regression to model, interestingly the r2 score of KNeighborsRegressor() was always the highest, with 96%, but it clearly gave a wrong output. Methods other than Ridge, Lasso and Linear Regression seem to always fail so I decied to stick with Linear Regression despite its 88% acc. score. It is not always correct, if the stock price has lots of ups and downs, it wont be able to give a good estimate as the accuracy score often goes below 50%. The discrepancy can be understood by the disconnection between the lines actual close and predicted close. It needs deep learning to go ruther.')