In this project, I took a deep dive into the stock performance of JP Morgan, one of the world’s leading financial institutions. Using historical stock data from Yahoo Finance (spanning from 2023 to the present), I conducted a comprehensive technical analysis to uncover price patterns and identify trading opportunities. 💹
Technical Indicators:
Moving Averages (MA), MACD, RSI, Bollinger Bands, and the Stochastic Oscillator were used to uncover the underlying market trends and potential buy and sell signals.
Predictive Modeling: To take it a step further, I employed the ARIMA model to forecast future stock prices, helping to provide an extra layer of insight into JP Morgan's potential market trajectory 📉📈.
To make the analysis actionable and easily digestible, I visualized all findings through an interactive Tableau dashboard. This allowed users to effortlessly explore the data and trends, enabling more informed and confident investment decisions. 📊💡
Through this hands-on project, I gained valuable experience in applying technical analysis and predictive modeling in the financial sector, preparing me to tackle similar challenges in a real-world setting.
In this project, the primary goal was to analyze the historical stock price data of JP Morgan and use technical indicators to identify key patterns and trends that inform trading decisions. Below are the key objectives driving this analysis:
Identify Long-Term & Short-Term Trends 📈:
Analyze JP Morgan's stock performance over time to spot both long-term growth trends and short-term fluctuations, providing a deeper understanding of the stock’s behavior.
Evaluate Market Volatility & Risk 📉:
Utilize Bollinger Bands and other volatility indicators to measure market fluctuations, helping investors assess the risk associated with investing in JP Morgan stock.
Determine Overbought/Oversold Conditions ⚖️:
Apply the Relative Strength Index (RSI) and Stochastic Oscillator to identify when the stock is overbought or oversold, signaling potential reversal points for trading opportunities.
Generate Buy & Sell Signals 💡:
Use Moving Average Convergence Divergence (MACD) and various Moving Averages (MA) to identify optimal buy and sell signals, helping investors make informed decisions on entry and exit points.
Support and Resistance Identification 🔍:
Investigate the impact of different Moving Averages (e.g., 50-day vs. 200-day) on identifying support and resistance levels, enhancing traders’ ability to navigate price movements.
Understand the Impact of Market Events 📣:
Analyze how significant market events (like earnings reports and economic announcements) correlate with fluctuations in JP Morgan’s stock price, providing insights into how external factors influence market behavior.
Forecast Future Price Movements with ARIMA 🔮:
Apply the ARIMA model to forecast future price movements based on historical data, offering a data-driven approach to evaluating the model's prediction power for future stock trends.
I imported JP Morgan's historical stock data from Yahoo Finance (2023–present) using its API in a Google Colab notebook. This setup enabled real-time data access and smooth integration with Python libraries for effective technical analysis and predictive modeling.
The stock analysis was carried out using Python and various data science and machine learning techniques. The structured approach included:
Data Import: Historical stock data was fetched from Yahoo Finance API.
Data Preprocessing: Data was cleaned and prepared for analysis (handling missing values, calculating indicators).
Technical Indicators: Key metrics like Moving Averages, RSI, MACD, Bollinger Bands, and Stochastic Oscillator were calculated.
ARIMA Model: Used for predictive modeling to forecast future stock prices.
Visualization: Insights were presented through interactive Tableau dashboards for easy interpretation.
The analysis begins by importing essential Python libraries like numpy, pandas, and yfinance, along with matplotlib and seaborn for visualization. Using the Yahoo Finance API, historical stock data for JP Morgan (JPM) was fetched from January 1, 2023, to the present, providing over two decades of price data.
Output -
Open High Low Close
count 532.000000 532.000000 532.000000 532.000000
mean 175.513058 177.056154 174.104650 175.695681
std 41.071206 41.471983 40.737886 41.112358
min 119.411766 119.459294 117.016500 118.727409
25% 138.088199 138.469660 136.814478 138.011513
50% 168.424808 169.334031 167.280958 168.424805
75% 205.406421 207.643572 203.928161 205.552277
max 277.369995 279.230011 276.450012 276.899994
📅 Total Trading Days: 532
This represents the count of available trading days in the dataset.
💰 Average Close Price: $175.70
The mean closing price of JPM stock over the selected period.
📉 Lowest Price: $118.73
The minimum recorded stock price, indicating the lowest point in the dataset.
📈 Highest Price: $276.90
The maximum stock price, showing the peak value within the time frame.
📊 Price Volatility (Standard Deviation): ~$41
The std (standard deviation) measures price fluctuation—higher values indicate more volatility.
🔍 Key Percentiles (Price Distribution):
25% (Q1): $138 → 25% of stock prices were below this value, indicating the lower range.
50% (Median): $168 → Half of the stock prices were above and below this value.
75% (Q3): $205 → 75% of stock prices were below this value, showing the upper range.
🔹 Data Transformation & Feature Engineering
📆 Extracting Year & Month → Created Year, Month, and Month_name columns for easier time-based analysis.
📈 Daily Returns Calculation → Added a Returns column using percentage change in closing price to analyze stock volatility.
📊 Moving Averages Computed:
MA30 (Short-term)
MA90, MA100 (Medium-term)
MA200 (Long-term) → Helps identify trends & potential trading signals.
⚡ Volatility Analysis → Rolling 30-day standard deviation (Volatility) calculated to track price fluctuations.
🚀 Overall Uptrend → All moving averages trend upward from late 2023 to early 2025, confirming a bullish market.
🔄 MA Order Confirms Uptrend → Shorter moving averages (MA30) staying above longer ones (MA200) reinforces the bullish trend.
📊 MA Smoothness & Reactivity:
MA30 (Dashed Blue) → Fastest to react, capturing short-term fluctuations.
MA90 & MA100 (Orange & Green) → Smoother, reflecting intermediate trends.
MA200 (Red) → Slowest, showing the long-term price direction.
🏆 Bullish Market Sentiment → Consistent higher price movement across all MAs.
📉 Potential Support Levels → MAs can act as dynamic support zones during pullbacks.
⚠ Crossover Signals:
Bullish: When shorter MA crosses above a longer MA (e.g., MA30 > MA90).
Bearish: When shorter MA crosses below a longer MA (use with confirmation).
🔥 Long-Term Strength → A rising MA200 reinforces the presence of a sustained long-term uptrend.
🔹 RSI (Relative Strength Index) Calculation
📉 Price Change → Computes daily stock price change.
📊 Gains & Losses → Separates positive and negative price movements.
📅 14-Day Lookback Period → Calculates average gains & losses for RSI formula.
🔄 RSI Formula → RSI = 100 - (100 / (1 + RS)) where RS = Avg Gain / Avg Loss.
⚠ Thresholds Used:
Above 70 → Overbought (Potential pullback or consolidation).
Below 30 → Oversold (Potential buying opportunity).
🚀 Strong Uptrend in Price → Stock steadily rises from mid-2023 to early 2025.
✅ Bullish Momentum Confirmed → RSI mostly above 50, signaling continued upward momentum.
⚠ Overbought RSI Signals → RSI frequently touches 70+, suggesting short-term pullbacks but no trend reversal.
🔄 Early 2023 Volatility → Before mid-2023, price action was more sideways and volatile.
📊 Overall Bullish Outlook → Consistent uptrend with strong momentum supports positive price action.
What is the Rice Rule?
A rule of thumb for determining the optimal number of bins in a histogram for better frequency distribution analysis.
Why Use the Rice Rule?
Helps avoid over-smoothing (too few bins) or over-segmentation (too many bins).
Provides a clearer view of data distribution without excessive noise.
🔹 Efficient Bin Size Calculation (Rice Rule)
📏 Formula Used → Bins = ⌈2 * n^(1/3)⌉
🔢 Total Data Points (n) → 532
📊 Optimal Bins Calculated → 17 (Ensures a well-distributed histogram).
📈 Right-Skewed Distribution → Majority of trading volumes are low, with a long tail on the right.
🔄 Typical Volume Range → Most frequent trading volume falls between 5M – 10M shares.
⚡ Lower Volume Dominance → Low trading volume days occur significantly more often than high-volume days.
🚀 Infrequent High Volume Days → Some spikes in trading volume, but rare occurrences.
📊 Concentrated Trading Activity → Most trading volume remains in the lower range, suggesting stable trading with occasional surges.
🔹 Understanding the Correlation Matrix
The heatmap visually represents relationships between different stock indicators.
Dark Red (Strong Positive Correlation) → Values move together.
Dark Blue (Strong Negative Correlation) → Values move opposite.
Lighter Colors (Weak/No Correlation) → No significant relationship.
✅ Strong Positive Correlations (Darker Red Shades)
🔹 Close, High, Low, Open → Near-perfect correlation (~1) as they are all based on daily stock price movements.
🔹 Moving Averages (MA30, MA90, MA100, MA200) → Strongly correlated with each other & price variables, since they smooth out price trends.
📊 Moderate Positive Correlations
🔸 Volatility & Moving Averages → Higher volatility aligns with stronger price trends, leading to larger MA fluctuations.
🔸 RSI & MACD → These momentum indicators tend to move together, confirming trend strength.
🔄 Weak or Near-Zero Correlations
🔹 Returns & Most Other Variables → Daily returns are highly random, leading to low correlation with other metrics.
🔹 Volume & Price Variables → Slight negative correlation, meaning high trading volume doesn’t always coincide with price increases.
📉 Negative Correlations (Darker Blue Shades)
🔹 Volume & Moving Averages → Suggests that during strong uptrends, trading volume sometimes decreases.
🔹 MACD & Volume → Weak negative correlation, indicating MACD trends don’t strongly align with volume spikes.
Analysis :
The heatmap reveals strong correlations between closing prices (Adj Close, Close) and other price-related features (Open, High, Low). This is intuitive as these features represent different aspects of a stock's price movement within a day.
The strong positive correlations between moving averages (MA30, MA90, MA100, MA200) suggest they capture similar long-term trends in the data. We might consider using only one or two of these moving averages to avoid redundancy in analysis.
The weak positive correlation between returns and other features is inconclusive. It might warrant further investigation to understand if there's a statistically significant relationship.
The weak negative correlation between volume and price needs cautious interpretation. It's a weak association, and other factors might play a more significant role in price movements.
*** Important Note ***
This analysis is done only get basic overview of features correlation. Just because two features move together doesn't mean one causes the other as stock prices can be unpredictable sometimes. The heatmap only shows linear correlations. There might be non-linear relationships that this heatmap doesn't capture. The strength of the correlations can vary depending on the specific stock and time period analyzed.
📌 What Are Bollinger Bands?
Bollinger Bands are volatility indicators that help identify overbought & oversold conditions:
Middle Line (Green) → Simple Moving Average (SMA) (60-day) smooths price trends.
Upper Band (Red) → SMA + (2.5 × Standard Deviation) → Suggests overbought conditions.
Lower Band (Orange) → SMA - (2.5 × Standard Deviation) → Suggests oversold conditions.
✅ Uptrend Confirmation → The Close Price (Blue Line) is generally trending upwards, indicating bullish momentum.
✅ Volatility Expansion & Contraction →
Late 2024: Bands widen, signaling increased volatility & larger price swings.
Calm Periods: Bands narrow, suggesting low volatility & consolidation.
✅ Potential Trading Signals →
Price Near Upper Band → May indicate an overbought market (possible pullback).
Price Near Lower Band → May indicate an oversold market (possible reversal).
Analysis :
The Bollinger Bands widen significantly in early 2020, which coincides with the major market downturn due to the COVID-19 pandemic. This indicates a period of heightened volatility.
In late 2020, the price breaks above the Upper Bollinger Band. This could be interpreted as a potential upside breakout, suggesting a period of sustained price increase. However, confirmation from other technical indicators is recommended.
The Bollinger Bands generally narrow throughout 2021, indicating a period of lower volatility compared to 2020.
In mid-2022, the Bollinger Bands narrow considerably, forming a potential squeeze. This pattern can sometimes precede a breakout in either direction, so close attention to future price movements is warranted.
The bands widen again in late 2022 and continue to be relatively wide in 2023, suggesting increased volatility.
📌 What is the Stochastic Oscillator?
A momentum indicator that measures the closing price relative to the high-low range over a set period:
%K (Blue Line) → Measures the current momentum of the stock price.
%D (Red Line) → A 3-day moving average of %K, smoothing out short-term noise.
Overbought/Oversold Levels →
Above 80 (Green Line) → Potential overbought conditions.
Below 20 (Red Line) → Potential oversold conditions.
✅ Momentum Fluctuations → The oscillator moves frequently between overbought & oversold zones, signaling volatile price action.
✅ Crossovers as Trading Signals →
%K (Blue) crossing above %D (Red) below 20 → Potential buy signal 📈.
%K (Blue) crossing below %D (Red) above 80 → Potential sell signal 📉.
✅ Price Reversals →
When %K & %D remain high (above 80) → Possible trend continuation or pullback.
When %K & %D stay low (below 20) → Possible trend reversal upwards.
Analysis :
There are also instances where the Stochastic Oscillator dips below the oversold level (20), such as late 2020 and late 2022. These phases were sometimes followed by price increases, aligning with the oversold signal.
The prolonged period below the overbought level might indicate sustained downward pressure on the stock price during that timeframe.
The absence of frequent overbought signals suggests that the stock experienced limited strong upward momentum.
The pandemic induced extreme market volatility, which is reflected in wider Bollinger Bands and more pronounced swings in the Stochastic Oscillator.
The sharp market declines during the initial phases of the COVID-19 pandemic pushed the Stochastic Oscillator into oversold territory multiple times, creating potential buying opportunities.
The absence of frequent overbought signals suggests that the stock experienced limited strong upward momentum.
The overall economic recovery from the pandemic was gradual, which might explain the prolonged period of the Stochastic Oscillator below the overbought level.
**For a detailed view, you can explore the Tableau Public Dashboard here. These will offer data visualization to support the analysis.**
About ARIMA Model :
The ARIMA (AutoRegressive Integrated Moving Average) model is a powerful tool for time series forecasting. It combines three key components:
AutoRegressive (AR): This component uses the relationship between an observation and a certain number of lagged observations (previous values).
Integrated (I): This component involves differencing the raw observations to make the time series stationary, eliminating trends and seasonality.
Moving Average (MA): This component uses the dependency between an observation and a residual error from a moving average model applied to lagged observations.
ARIMA is widely used for forecasting future values in a time series based on its own past values, making it particularly effective for predicting stock prices.
Data Omission and Preparation :
To forecast stock prices for the year 2024 using an ARIMA model, the data from 2024 is omitted. This approach ensures that the model is trained only on historical data up to 2023, allowing for an unbiased prediction of future prices.
df1 = df.dropna()
df1 = df1[df1['Year'] < 2024]
df_AR = df1
df_AR.dropna(inplace=True)
Stationarity Test (ADF Test) :
Before applying the ARIMA model, it's crucial to check if the time series data is stationary. A time series is considered stationary if its statistical properties like mean, variance, and autocorrelation remain constant over time. The Augmented Dickey-Fuller (ADF) test is used for this purpose:
The ADF test is applied to the 'Adj Close' prices. A p-value greater than 0.05 indicates non-stationarity, meaning the series requires differencing. The more negative the ADF statistic, the stronger the evidence against the null hypothesis (non-stationarity) and in favor of the alternative hypothesis (stationarity) but here value return positive
result = ts.adfuller(df_AR['Adj Close'].dropna())
print('ADF Statistic:', result[0])
print('p-value:', result[1])
Output:
ADF Statistic: 0.8237393757666592
p-value: 0.9920098611114088
Since the series was non-stationary, differencing was applied to transform the data. The ADF test was then rrun on the differenced data ('Close_diff'), confirming stationarity with a significantly lower p-value.
df_AR['Close_diff'] = df_AR['Adj Close'].diff().dropna()
result = ts.adfuller(df_AR['Close_diff'].dropna())
print('ADF Statistic:', result[0])
print('p-value:', result[1])
Output:
ADF Statistic: -12.968433937493867
p-value: 3.117741156742175e-24
With the ADF Statistic of -12.968 and a p-value well below 0.05, the data is confirmed to be stationary, making it ready for ARIMA modeling.
The ARIMA model requires the specification of three parameters:
p (AutoRegressive Order): The number of lag observations included in the model.
d (Differencing Order): The number of times the data has been differenced to make it stationary.
q (Moving Average Order): The size of the moving average window.
To determine the appropriate values for p and q, AutoCorrelation Function (ACF) and Partial AutoCorrelation Function (PACF) plots are used:
ACF Plot: Helps identify the value of q by showing the correlation between an observation and lagged values.
PACF Plot: Helps identify the value of p by showing the correlation of the residuals with lagged observations after removing effects already explained by earlier lags.
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
fig, ax = plt.subplots(1, 2, figsize=(16, 4))
plot_acf(df_AR['Close_diff'].dropna(), lags=40, ax=ax[0])
plot_pacf(df_AR['Close_diff'].dropna(), lags=40, ax=ax[1])
plt.show()
Analysis :
The ACF plot shows the correlation between a time series with its lagged values.
In this plot, there's a significant spike at lag 1, indicating a strong correlation between the current value and the previous value.
The subsequent lags show no significant correlation.
The PACF plot shows the correlation between a time series with its lagged values, controlling for the effects of the intervening values.
In this plot, there's a significant spike at lag 1, indicating a direct relationship between the current value and the previous value.
Similar to the ACF, subsequent lags show no significant correlation.
Based on the ACF and PACF plots, we can assume :
p = 1: One autoregressive term due to the significant spike at lag 1 in the PACF.
d = 1 : Differencing is done for the 1st time to make data stationary.
q = 0: No moving average term as there are no significant spikes in the ACF after lag 1.
Data Split :
Training Set : Comprising 80% of the data, it is used to train the ARIMA model.
Testing Set : Comprising the remaining 20% of the data, it is used to evaluate the model's forecasting performance.
train_size = int(len(df_AR) * 0.8)
train, test = df_AR['Adj Close'][:train_size], df_AR['Adj Close'][train_size:]
train_size : This variable determines the number of data points (80%) to include in the training set.
train : This series contains the adjusted closing prices used for training the ARIMA model.
test : This series contains the remaining data, which will be used to validate the model's predictions.
Using Auto-ARIMA for Best Model Configuration :
After initial testing with manually set ARIMA parameters, the model's predictions were significantly deviated from the actual stock prices for the first 30 days of 2024. To refine the model and achieve more accurate forecasting, we used the auto_arima function. This approach helps in identifying the best possible ARIMA model configuration by automatically searching through a range of parameters.
stepwise_model = pm.auto_arima(df_AR['Adj Close'], start_p=0, start_q=0,
max_p=5, max_q=5, m=12,
start_P=0, seasonal=True,
d=1, D=1, trace=True,
error_action='ignore',
suppress_warnings=True,
stepwise=True)
'start_p', 'start_q', 'max_p', 'max_q' : These parameters define the range of values for the AR and MA terms, which are part of the model's configuration.
'm=12' : Specifies a seasonal cycle of 12 periods, typically representing monthly data.
'd=1', 'D=1' : Indicates the order of differencing required to make the time series stationary.
'seasonal=True' : Enables the search for seasonal parameters, making the model a SARIMA (Seasonal ARIMA).
After running the auto_arima function, the best model identified was ARIMA(5,1,0)(2,1,0)[12], which had the lowest AIC score, indicating a better fit for the data.
Fitting the Selected ARIMA Model: :
non_seasonal_order = (5, 1, 0) # (p, d, q)
seasonal_order = (2, 1, 0, 12) # (P, D, Q, M)
model = ARIMA(df_AR['Adj Close'], order=non_seasonal_order, seasonal_order=seasonal_order)
model_fit = model.fit()
non_seasonal_order : Specifies the ARIMA model's parameters for non-seasonal data.
seasonal_order : Defines the seasonal component of the model.
Model Summary :
After fitting the ARIMA model to the dataset, the model_fit.summary() command provides a comprehensive summary of the model's performance and parameters.
AR Coefficients (L1 to L5) : These represent the autoregressive part, indicating how past values influence the current value. Significant coefficients suggest strong relationships with past data points.
Seasonal AR Terms (S.L12, S.L24) : These capture seasonality at 12 and 24-period lags, showing the impact of seasonal trends.
Sigma2 : The variance of the residuals, indicating the model's overall fit.
Ljung-Box Test : Assesses whether residuals are independent; a high p-value suggests the residuals are uncorrelated.
Jarque-Bera Test : Tests the normality of residuals; a low p-value indicates non-normality.
Predicting :
After fitting the model, predictions for the test set are generated using the code below :
start = len(train)
end = len(train) + len(test) - 1
predictions = model_fit.predict(start=start, end=end, typ='levels')
'start and end' : These indices define the range of data points for which predictions are made.
'typ='levels' : Ensures that predictions are made on the original scale of the data, rather than differenced values.
Plotting :
plt.figure(figsize=(14, 7))
plt.plot(df_AR.index[-len(test):], test, label='Actual')
plt.plot(df_AR.index[-len(test):], predictions, label='Predicted')
plt.title('ARIMA Model for Adjusted closing price : Actual vs Predicted Prices')
plt.xlabel('Date')
plt.ylabel('Price')
plt.legend()
plt.show()
Plotting :
The model seems to capture the general trend of the stock price reasonably well. The predicted values follow the overall trajectory of the actual prices.
The model struggles to capture the sharp fluctuations in the price, especially during periods of high volatility. The predicted values tend to be smoother than the actual prices.
The predicted values appear to lag behind the actual prices, particularly during periods of rapid price changes. This is a common characteristic of ARIMA models, as they are based on historical data.
There are some instances where the actual price deviates significantly from the predicted price. These could be due to unexpected events or outliers in the data.
Model Evaluation with RMSE and R-Squared :
To evaluate the accuracy of the ARIMA model, I calculated two key performance metrics: Root Mean Square Error (RMSE) and R-Squared.
mse = mean_squared_error(test, predictions)
rmse = np.sqrt(mse)
print(f"RMSE: {rmse}")
r2 = r2_score(test, predictions)
print(f"R-Squared: {r2}")
RMSE (Root Mean Square Error) : The RMSE value of 2.43 indicates that, on average, the predicted stock prices differ from the actual prices by about 2.43 units. This is a relatively low error, suggesting that the model predictions are closely aligned with the actual values.
R-Squared : The R-squared value of 0.99 indicates that the model explains approximately 98.85% of the variance in the actual stock prices. This high value reflects a strong correlation between the predicted and actual stock prices, demonstrating the model's accuracy and reliability.
These metrics show that the ARIMA model is well-tuned and performs accurately in predicting the stock prices for the specified period. The low RMSE and high R-Squared values confirm the model's effectiveness, making it a valuable tool for forecasting future stock prices.
ARIMA Model Forecast Visualization :
I forecasted the stock prices for the next 30 days using the ARIMA model and visualized the results to analyze the predicted trends.
# Forecast the next 30 days
forecast = model_fit.forecast(steps=30)
forecast_dates = pd.date_range(start=df_AR.index[-1], periods=30, freq='B')
plt.figure(figsize=(12, 6))
plt.plot(arima_predictions.index, arima_predictions['ARIMA'], label='ARIMA')
plt.title('ARIMA Predictions')
plt.xlabel('Date')
plt.ylabel('Close Price')
plt.legend()
plt.grid(True)
plt.show()
The forecast function of the ARIMA model was used to predict the stock prices for the next 30 business days. This step is crucial for extending the model's insights into future price movements, allowing for better strategic decisions based on anticipated market trends.
The plot illustrates the predicted stock prices over the forecasted period. The x-axis represents the dates, while the y-axis shows the predicted close prices. The trend indicates how the ARIMA model expects the stock price to evolve, providing a visual reference for the model's accuracy and the market's potential future direction.
Plotting :
plt.figure(figsize=(14, 7))
plt.plot(df_AR.index[-len(test):], test, label='Actual')
plt.plot(df_AR.index[-len(test):], predictions, label='Predicted')
plt.title('ARIMA Model for Adjusted closing price : Actual vs Predicted Prices')
plt.xlabel('Date')
plt.ylabel('Price')
plt.legend()
plt.show()
Observations :
The overall upward trend predicted by the ARIMA model coincides with the actual movement of prices during the same time period.
The ARIMA model predicts slightly higher prices than the actual ones, even when the overall trend is in line. This tendency is particularly noticeable as the forecast extends further into the future.
In overall plot, ARIMA model seems to successfully captures the general trend of the stock prices, which is a good sign. Th
As is common with time series forecasting models, there is some variance between the expected and actual prices, particularly as the forecast horizon grows.
All things considered, the ARIMA model's predictions are reasonable, particularly when it comes to capturing the general trend. However, to make an accurate decision, one must take into account these deviations and perhaps further refine the model or combine it with other methods for increased accuracy. Another complex model, such as the Prophet or LSTM, may be more effective in dealing with the complexities of stock prices.
In this project, I investigated the application of several data analysis and machine learning techniques, with an emphasis on the ARIMA model, for stock price prediction. The objective was not only to showcase technical proficiency in these methods but also to highlight their practical relevance for financial analysis.
The ARIMA model has demonstrated its ability to forecast future stock prices based on historical data, making it a popular tool for time series forecasting. While the model shows promise in terms of accuracy, reflected in the RMSE and R-squared values, the real value lies in its ability to provide financial analysts with actionable insights to guide investment decisions. However, it is important to note that the predicted prices generated by the model were slightly higher than the actual prices. This deviation is expected, as the project was not intended to provide perfect predictions, given the myriad of financial and economic factors that influence stock prices.
Instead, the primary goal of this project was to explore the use of machine learning models, such as ARIMA, in financial analysis, particularly stock price prediction. As financial markets become increasingly complex, the integration of these data-driven methods enhances the precision and depth of financial analysis. Learning and applying these tools is a continuous journey, and each project lays the foundation for deeper, more refined research in the future.