import gradio as gr import yfinance as yf import pandas as pd from sklearn.linear_model import LinearRegression import plotly.graph_objects as go markdown_content = """ # Asset Price Prediction Tool ## Introduction This tool uses historical stock price data to predict future prices. It's designed to provide insights into potential price trends based on past performance. ## How to Use 1. **Enter the Ticker Symbol:** Input the stock ticker (e.g., 'AAPL' for Apple Inc.). 2. **Select Start and End Dates:** Choose the historical data range for analysis. Dates must be entered in the format YYYY-MM-DD (e.g., 2023-01-01). 3. **Set Prediction Days:** Decide how many days into the future you want to predict. 4. **Submit:** Click 'Run' to view the predictions. ## How It Works - **Data Fetching:** The tool fetches historical closing prices of the specified asset using `yfinance` for the date range you provide. - **Model Training:** It then trains a linear regression model on this data. The model learns the relationship between dates and closing prices during this period. - **Making Predictions:** Based on the learned relationship, the model attempts to predict future prices for the number of days you specified. ## Understanding Linear Regression - Linear regression is a statistical method that models the relationship between a dependent variable and one or more independent variables. - In this tool, the dependent variable is the asset's price, and the independent variable is time (dates). - The model assumes a linear relationship (a straight line trend) between dates and prices. - It's important to note that this method works best when the relationship between the data points is linear and may not capture complex market dynamics. ## Interpreting Data - **Historical Prices:** Displayed as a solid blue line, representing actual past closing prices. - **Predicted Prices:** Shown as a solid red line, indicating the model's predictions. - **Limitations:** The predictions are based on historical trends and do not account for unforeseen market events or changes in market conditions. They should be used as a guideline rather than definitive financial advice. Remember, investing in the stock market involves risks, and past performance is not indicative of future results. """ def train_predict_wrapper(ticker, start_date, end_date, prediction_days): # Download asset data data = yf.download(ticker, start=start_date, end=end_date) data = data["Close"] # Convert index to Unix timestamp (seconds) data.index = (data.index - pd.Timestamp("1970-01-01")) // pd.Timedelta('1s') # Train linear regression model X = data.index.values[:-prediction_days].reshape(-1, 1) y = data.values[:-prediction_days] model = LinearRegression() model.fit(X, y) # Prepare data for prediction last_timestamp = data.index[-1] future_timestamps = pd.date_range(start=pd.to_datetime(last_timestamp, unit='s'), periods=prediction_days, freq='D') future_timestamps = (future_timestamps - pd.Timestamp("1970-01-01")) // pd.Timedelta('1s') X_future = future_timestamps.values.reshape(-1, 1) # Predict future prices predicted_prices = model.predict(X_future) # Prepare data for plotting historical_prices = go.Scatter( x=pd.to_datetime(data.index, unit='s'), y=data.values, mode="lines", name="Historical Prices" ) predicted_prices_trace = go.Scatter( x=pd.to_datetime(future_timestamps, unit='s'), y=predicted_prices, mode="lines", name="Predicted Prices" ) # Plot data fig = go.Figure() fig.add_trace(historical_prices) fig.add_trace(predicted_prices_trace) fig.update_layout( title="Asset Price Prediction", xaxis_title="Date", yaxis_title="Price", legend_title_text="Data" ) return fig # Define Gradio interface interface = gr.Interface( fn=train_predict_wrapper, inputs=[ gr.Textbox(label="Ticker Symbol"), gr.Textbox(label="Start Date (YYYY-MM-DD)"), gr.Textbox(label="End Date (YYYY-MM-DD)"), gr.Slider(minimum=1, maximum=365, step=1, label="Prediction Days"), ], outputs="plot", description=markdown_content ) # Launch the app interface.launch()