{ "cells": [ { "cell_type": "code", "execution_count": 3, "id": "0e1ae632", "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "import numpy as np\n", "import seaborn as sns\n", "import matplotlib.pyplot as plt\n", "%matplotlib inline" ] }, { "cell_type": "code", "execution_count": 4, "id": "1772d427", "metadata": {}, "outputs": [], "source": [ "train = pd.read_csv('Competition_data.csv')" ] }, { "cell_type": "code", "execution_count": 5, "id": "4592aba8", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
DateClose
01/1/2023 23:58:00448.08
11/2/2023 23:58:00448.08
21/3/2023 23:58:00448.55
31/4/2023 23:58:00449.01
41/5/2023 23:58:00449.53
\n", "
" ], "text/plain": [ " Date Close\n", "0 1/1/2023 23:58:00 448.08\n", "1 1/2/2023 23:58:00 448.08\n", "2 1/3/2023 23:58:00 448.55\n", "3 1/4/2023 23:58:00 449.01\n", "4 1/5/2023 23:58:00 449.53" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "### \n", "train.head()" ] }, { "cell_type": "code", "execution_count": 6, "id": "86a362b9", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(486, 2)" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "### The shape of the data\n", "train.shape" ] }, { "cell_type": "code", "execution_count": 7, "id": "be94286a", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "RangeIndex: 486 entries, 0 to 485\n", "Data columns (total 2 columns):\n", " # Column Non-Null Count Dtype \n", "--- ------ -------------- ----- \n", " 0 Date 486 non-null object \n", " 1 Close 486 non-null float64\n", "dtypes: float64(1), object(1)\n", "memory usage: 7.7+ KB\n" ] } ], "source": [ "train.info()" ] }, { "cell_type": "code", "execution_count": 8, "id": "4f456133", "metadata": {}, "outputs": [], "source": [ "### Remove time\n", "train['Date'] = train['Date'].apply(lambda x:x.split(' ')[0])" ] }, { "cell_type": "code", "execution_count": 9, "id": "557d45a7", "metadata": {}, "outputs": [], "source": [ "### Convert \n", "train['Date'] = pd.to_datetime(train['Date'])" ] }, { "cell_type": "code", "execution_count": 10, "id": "82b85401", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
DateClose
02023-01-01448.08
12023-01-02448.08
22023-01-03448.55
32023-01-04449.01
42023-01-05449.53
.........
4812024-05-021372.95
4822024-05-031382.50
4832024-05-041382.50
4842024-05-051393.74
4852024-05-061384.00
\n", "

486 rows × 2 columns

\n", "
" ], "text/plain": [ " Date Close\n", "0 2023-01-01 448.08\n", "1 2023-01-02 448.08\n", "2 2023-01-03 448.55\n", "3 2023-01-04 449.01\n", "4 2023-01-05 449.53\n", ".. ... ...\n", "481 2024-05-02 1372.95\n", "482 2024-05-03 1382.50\n", "483 2024-05-04 1382.50\n", "484 2024-05-05 1393.74\n", "485 2024-05-06 1384.00\n", "\n", "[486 rows x 2 columns]" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "train" ] }, { "cell_type": "code", "execution_count": 11, "id": "ea712cc1", "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "train.set_index('Date').plot(title='Exchange Rate Trend');\n", "plt.ylabel('Price');" ] }, { "cell_type": "markdown", "id": "18877c0b", "metadata": {}, "source": [ "Recently, the distribution of exchange prices has not been stable." ] }, { "cell_type": "markdown", "id": "a405536c", "metadata": {}, "source": [ "### Create our test set" ] }, { "cell_type": "code", "execution_count": 12, "id": "a9154690", "metadata": {}, "outputs": [], "source": [ "### The test set ranges from May 22 to June 4th\n", "date_range = pd.date_range(start='2024-05-22', end='2024-06-04', freq='D')" ] }, { "cell_type": "code", "execution_count": 13, "id": "07ceba23", "metadata": {}, "outputs": [], "source": [ "test = pd.DataFrame(date_range, columns=['Date'])" ] }, { "cell_type": "code", "execution_count": 14, "id": "d7bdce30", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Date
02024-05-22
12024-05-23
22024-05-24
32024-05-25
42024-05-26
52024-05-27
62024-05-28
72024-05-29
82024-05-30
92024-05-31
102024-06-01
112024-06-02
122024-06-03
132024-06-04
\n", "
" ], "text/plain": [ " Date\n", "0 2024-05-22\n", "1 2024-05-23\n", "2 2024-05-24\n", "3 2024-05-25\n", "4 2024-05-26\n", "5 2024-05-27\n", "6 2024-05-28\n", "7 2024-05-29\n", "8 2024-05-30\n", "9 2024-05-31\n", "10 2024-06-01\n", "11 2024-06-02\n", "12 2024-06-03\n", "13 2024-06-04" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "test" ] }, { "cell_type": "markdown", "id": "cacf87da", "metadata": {}, "source": [ "The test set ranges from May 22 to June 4th 2024." ] }, { "cell_type": "markdown", "id": "cac4afdc", "metadata": {}, "source": [ "### Forecasting model\n", "\n", "ARIMA models are a popular tool for time series forecasting, and can be implemented in Python using the `statsmodels` library." ] }, { "cell_type": "code", "execution_count": 15, "id": "85015ce6", "metadata": {}, "outputs": [], "source": [ "from statsmodels.tsa.arima.model import ARIMA\n", "from sklearn.metrics import mean_squared_error" ] }, { "cell_type": "code", "execution_count": 16, "id": "17b14179", "metadata": {}, "outputs": [], "source": [ "### Cross validation\n", "train_data = train[:480] ## we use the date from January 1 2023 to April 30 2024 to train our model\n", "valid_data = train[480:] ## we use the date May 1 to May 6 to validate the performance of our model" ] }, { "cell_type": "code", "execution_count": 17, "id": "eb62632d", "metadata": {}, "outputs": [], "source": [ "train_close = train_data['Close'] ## Our target feature (Close)\n", "valid_close = valid_data['Close']" ] }, { "cell_type": "code", "execution_count": 18, "id": "0c7f92ae", "metadata": {}, "outputs": [], "source": [ "historical_close = [x for x in train_close]" ] }, { "cell_type": "code", "execution_count": 19, "id": "3cf70921", "metadata": {}, "outputs": [], "source": [ "model = ARIMA(historical_close, order=(1,1,1))" ] }, { "cell_type": "code", "execution_count": 20, "id": "a89b7d9c", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "c:\\Users\\LENOVO\\Music\\Ad-Engagement-Forecasting\\venv\\lib\\site-packages\\statsmodels\\tsa\\statespace\\sarimax.py:966: UserWarning: Non-stationary starting autoregressive parameters found. Using zeros as starting parameters.\n", " warn('Non-stationary starting autoregressive parameters'\n", "c:\\Users\\LENOVO\\Music\\Ad-Engagement-Forecasting\\venv\\lib\\site-packages\\statsmodels\\tsa\\statespace\\sarimax.py:978: UserWarning: Non-invertible starting MA parameters found. Using zeros as starting parameters.\n", " warn('Non-invertible starting MA parameters found.'\n" ] } ], "source": [ "model_fit = model.fit()" ] }, { "cell_type": "code", "execution_count": 21, "id": "6308d357", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " SARIMAX Results \n", "==============================================================================\n", "Dep. Variable: y No. Observations: 480\n", "Model: ARIMA(1, 1, 1) Log Likelihood -2266.694\n", "Date: Sat, 25 May 2024 AIC 4539.388\n", "Time: 11:46:44 BIC 4551.903\n", "Sample: 0 HQIC 4544.308\n", " - 480 \n", "Covariance Type: opg \n", "==============================================================================\n", " coef std err z P>|z| [0.025 0.975]\n", "------------------------------------------------------------------------------\n", "ar.L1 -0.9643 0.014 -66.538 0.000 -0.993 -0.936\n", "ma.L1 0.9997 0.114 8.790 0.000 0.777 1.223\n", "sigma2 751.2418 93.678 8.019 0.000 567.636 934.848\n", "===================================================================================\n", "Ljung-Box (L1) (Q): 0.01 Jarque-Bera (JB): 32721.07\n", "Prob(Q): 0.90 Prob(JB): 0.00\n", "Heteroskedasticity (H): 650.97 Skew: 4.28\n", "Prob(H) (two-sided): 0.00 Kurtosis: 42.57\n", "===================================================================================\n", "\n", "Warnings:\n", "[1] Covariance matrix calculated using the outer product of gradients (complex-step).\n" ] } ], "source": [ "print(model_fit.summary())" ] }, { "cell_type": "code", "execution_count": 22, "id": "b705f787", "metadata": {}, "outputs": [], "source": [ "y_pred = model_fit.predict(start=len(train_data), end=len(train)-1)" ] }, { "cell_type": "code", "execution_count": 23, "id": "c0bb3a09", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "8.882015537027629" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "mean_squared_error(valid_close, y_pred.round(2), squared=False)" ] }, { "cell_type": "markdown", "id": "e956e39c", "metadata": {}, "source": [ "Validation score is 8.88" ] }, { "cell_type": "markdown", "id": "86a84900", "metadata": {}, "source": [ "### Test prediction" ] }, { "cell_type": "code", "execution_count": 24, "id": "ef697aa7", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Timestamp('2024-05-22 00:00:00')" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "test['Date'].iloc[0]" ] }, { "cell_type": "code", "execution_count": 25, "id": "8d566c89", "metadata": {}, "outputs": [], "source": [ "start_date = test['Date'].iloc[0]\n", "end_date = test['Date'].iloc[-1]\n", "prediction_dates = pd.date_range(start=start_date, end=end_date, freq='D')" ] }, { "cell_type": "code", "execution_count": 26, "id": "f465d165", "metadata": {}, "outputs": [], "source": [ "periods = len(prediction_dates)\n", "\n", "# Forecast\n", "forecast = model_fit.get_forecast(steps=periods)" ] }, { "cell_type": "code", "execution_count": 27, "id": "e7c93324", "metadata": {}, "outputs": [], "source": [ "predicted_mean = forecast.predicted_mean" ] }, { "cell_type": "code", "execution_count": 28, "id": "719a4457", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([1389.26842887, 1389.97389697, 1389.29360052, 1389.94962346,\n", " 1389.31700793, 1389.92705124, 1389.33877475, 1389.90606108,\n", " 1389.35901597, 1389.88654208, 1389.37783852, 1389.86839114,\n", " 1389.39534182, 1389.85151237])" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "predicted_mean" ] }, { "cell_type": "markdown", "id": "ebf13c70", "metadata": {}, "source": [ "#### Make Submission (Make sure you round to 2 demical places)" ] }, { "cell_type": "code", "execution_count": 29, "id": "702f0fd5", "metadata": {}, "outputs": [], "source": [ "submission = test" ] }, { "cell_type": "code", "execution_count": 30, "id": "f243a5be", "metadata": {}, "outputs": [], "source": [ "submission['Close'] = predicted_mean.round(2)" ] }, { "cell_type": "code", "execution_count": 31, "id": "73a4dc46", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
DateClose
02024-05-221389.27
12024-05-231389.97
22024-05-241389.29
32024-05-251389.95
42024-05-261389.32
52024-05-271389.93
62024-05-281389.34
72024-05-291389.91
82024-05-301389.36
92024-05-311389.89
102024-06-011389.38
112024-06-021389.87
122024-06-031389.40
132024-06-041389.85
\n", "
" ], "text/plain": [ " Date Close\n", "0 2024-05-22 1389.27\n", "1 2024-05-23 1389.97\n", "2 2024-05-24 1389.29\n", "3 2024-05-25 1389.95\n", "4 2024-05-26 1389.32\n", "5 2024-05-27 1389.93\n", "6 2024-05-28 1389.34\n", "7 2024-05-29 1389.91\n", "8 2024-05-30 1389.36\n", "9 2024-05-31 1389.89\n", "10 2024-06-01 1389.38\n", "11 2024-06-02 1389.87\n", "12 2024-06-03 1389.40\n", "13 2024-06-04 1389.85" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "submission" ] }, { "cell_type": "code", "execution_count": 32, "id": "a7856de5", "metadata": {}, "outputs": [], "source": [ "## Submit to Zindi\n", "submission.to_csv('base1.csv',index=False)" ] }, { "cell_type": "markdown", "id": "b8967f34", "metadata": {}, "source": [ "### Recommendation\n", "\n", "* Data cleaning (if any).\n", "\n", "* Find the optimal parameters for the ARIMA model.\n", "\n", "* Try more sophisticated models like SARIMAX and FProphet.\n", "\n", "* Try the machine learning approach.\n", "\n", "* Ensemble Method." ] }, { "cell_type": "markdown", "id": "88e91900", "metadata": {}, "source": [ "### Best of Luck in your Forecast" ] }, { "cell_type": "code", "execution_count": null, "id": "1329ed54", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.10" } }, "nbformat": 4, "nbformat_minor": 5 }