Skip to content

Instantly share code, notes, and snippets.

@riqbal-k
Created April 19, 2023 12:43
Show Gist options
  • Save riqbal-k/66a62ece7aaec66b429bce35278c232e to your computer and use it in GitHub Desktop.
Save riqbal-k/66a62ece7aaec66b429bce35278c232e to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 24,
"id": "73863dae",
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"\n",
"from sklearn.metrics import r2_score\n",
"from sklearn.linear_model import Lasso\n",
"from sklearn.metrics import mean_squared_error"
]
},
{
"cell_type": "markdown",
"id": "6b141ed2",
"metadata": {},
"source": [
"# Regression analysis basic examples for sparse signals"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "958f7568",
"metadata": {},
"outputs": [],
"source": [
"np.random.seed(42)"
]
},
{
"cell_type": "code",
"execution_count": 33,
"id": "77a2f9df",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(50, 100)\n"
]
}
],
"source": [
"n_samples, n_features = 50, 100\n",
"X = np.random.randn(n_samples, n_features)\n",
"print(X.shape) #(50, 100)"
]
},
{
"cell_type": "code",
"execution_count": 34,
"id": "9faa0425",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[ 0.49671415, -0.1382643 , 0.64768854, ..., 0.26105527,\n",
" 0.00511346, -0.23458713],\n",
" [-1.41537074, -0.42064532, -0.34271452, ..., 0.15372511,\n",
" 0.05820872, -1.1429703 ],\n",
" [ 0.35778736, 0.56078453, 1.08305124, ..., 0.30729952,\n",
" 0.81286212, 0.62962884],\n",
" ...,\n",
" [-0.992866 , -1.44520526, 0.66626967, ..., -1.94937176,\n",
" -2.05035746, 0.73918049],\n",
" [ 0.50702027, -0.05739537, -1.3954485 , ..., -1.12004742,\n",
" 0.67091125, 0.60379052],\n",
" [-0.39187677, -1.01776431, -1.02740355, ..., 3.1129102 ,\n",
" 0.80803619, -0.8480656 ]])"
]
},
"execution_count": 34,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"X"
]
},
{
"cell_type": "code",
"execution_count": 35,
"id": "9bccbbd9",
"metadata": {},
"outputs": [],
"source": [
"# Decreasing coef w. alternated signs for visualization\n",
"idx = np.arange(n_features)\n",
"coef = (-1) ** idx * np.exp(-idx / 10)\n",
"coef[10:] = 0 # sparsify coef\n",
"y = np.dot(X, coef)"
]
},
{
"cell_type": "code",
"execution_count": 36,
"id": "87bce32e",
"metadata": {},
"outputs": [],
"source": [
"# Add noise\n",
"y += 0.01 * np.random.normal(size=n_samples)"
]
},
{
"cell_type": "code",
"execution_count": 37,
"id": "b64ca4df",
"metadata": {},
"outputs": [],
"source": [
"# Split data in train set and test set\n",
"n_samples = X.shape[0]\n",
"X_train, y_train = X[: n_samples // 2], y[: n_samples // 2]\n",
"X_test, y_test = X[n_samples // 2 :], y[n_samples // 2 :]"
]
},
{
"cell_type": "markdown",
"id": "f61fd821",
"metadata": {},
"source": [
"## Lasso"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "089d17fc",
"metadata": {},
"outputs": [],
"source": [
"from sklearn.linear_model import Lasso"
]
},
{
"cell_type": "code",
"execution_count": 38,
"id": "cf531b64",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Lasso(alpha=0.1)\n",
"r^2 on test data : 0.658064\n"
]
}
],
"source": [
"alpha = 0.1\n",
"lasso = Lasso(alpha=alpha)\n",
"\n",
"y_pred_lasso = lasso.fit(X_train, y_train).predict(X_test)\n",
"r2_score_lasso = r2_score(y_test, y_pred_lasso)\n",
"print(lasso)\n",
"print(\"r^2 on test data : %f\" % r2_score_lasso)"
]
},
{
"cell_type": "markdown",
"id": "f99767ab",
"metadata": {},
"source": [
"## ElasticNet"
]
},
{
"cell_type": "code",
"execution_count": 39,
"id": "8ddf8681",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"ElasticNet(alpha=0.1, l1_ratio=0.7)\n",
"r^2 on test data : 0.642515\n"
]
}
],
"source": [
"from sklearn.linear_model import ElasticNet\n",
"\n",
"enet = ElasticNet(alpha=alpha, l1_ratio=0.7)\n",
"\n",
"y_pred_enet = enet.fit(X_train, y_train).predict(X_test)\n",
"r2_score_enet = r2_score(y_test, y_pred_enet)\n",
"print(enet)\n",
"print(\"r^2 on test data : %f\" % r2_score_enet)"
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "9356f098",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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1Q1yRrBz507uuOMOCgsLOXXqVFlq5SuvvJIf/vCHpKenc+utt9KjR48qUyOvXLmS4cOHEx0dDUB6ejqrV6/mlltuKVuHr7TU7733Hg888ADgJKq74IIL2Lx5M2+99RYbN24sOxr/+uuv+fzzz8vqVpOVK1dy++23ExUVBVROE3306FHef/99xo4dW1Z28uTJsve33HILLVq0oG/fvlWmiAYn8dwvf/lLdu7cya233sqll15aq7oFS8g3DYHTHLR1dTf6pu3kuefsyWWmifP0CUT3gY4XfNNMVLEDOQAeeOABpk+fzn/+8x/mzp1LcXEx4DSFPP/885w4cYIhQ4awadOmstTI3bt35+677+ZPf/qTz1TP3tRH2mZf86oqv/nNb9iwYQMbNmygoKCA6667rtafydf6PM6cOUPHjh3Llr9hwwby8/PLxnunifZVx7vuuovly5fTunVrrr/++mrTcjcFIX9G4P0Yy669DzM1owfjxsHSpXZmYIKjpjTUHTp+zsni3pzc/hVwHFY+T6vI3rT69SMcPlT1kWd901B//fXXdO/eHaCs0xWcNvR+/frRr18/1q5dy6ZNm2jdunWl1MiPPPII3//+99m3bx+dOnXixRdfLDvK9/CVljolJYVFixYxYsQINm/ezJdffknv3r25/vrree655xgxYgQRERFs3ryZ7t2707Zt21p9pmuuuYYxY8bwgx/8gC5dulRKE92hQwd69erFsmXLGDt2LKrKxo0bSUhI8LnMimmit23bxkUXXcSDDz7Itm3b2LhxIyNGjKhV/YIh5APBunXOTn/O5sOAs/NfutQpt0BgmqKynf250WVlJ4ujOVkc7WOO2jl+/HjZE8EAfvjDH/LEE08wduxYunfvzpAhQygoKADg2WefJTs7m7CwMPr27cuoUaNYvHhxpdTIMTEx/OpXvyI1NRVVJS0tjdGjR5dbr6+01N/73veYOnUq/fr1Izw8nAULFtCqVSvuvfdetm/fzsCBA1FVoqOjefXVV2v9OePi4vjJT37CsGHDCAsLY8CAASxYsKDcNIsWLWLatGn84he/oKSkhPHjx1cbCPr37094eDgJCQllD+xZuHAhERERnHvuuTz22GO1rl8wBCQNtYjcAPwfzuMmn1fVmRXGzwDS3cFwIBaIVtUDIrIdOAKcBkq1ihSpFTVEGmpLUW2CydJQm0Cr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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"m, s, _ = plt.stem(\n",
" np.where(enet.coef_)[0],\n",
" enet.coef_[enet.coef_ != 0],\n",
" markerfmt=\"x\",\n",
" label=\"Elastic net coefficients\",\n",
")\n",
"plt.setp([m, s], color=\"#2ca02c\")\n",
"m, s, _ = plt.stem(\n",
" np.where(lasso.coef_)[0],\n",
" lasso.coef_[lasso.coef_ != 0],\n",
" markerfmt=\"x\",\n",
" label=\"Lasso coefficients\",\n",
")\n",
"plt.setp([m, s], color=\"#ff7f0e\")\n",
"plt.stem(\n",
" np.where(coef)[0],\n",
" coef[coef != 0],\n",
" label=\"true coefficients\",\n",
" markerfmt=\"bx\",\n",
")\n",
"\n",
"plt.legend(loc=\"best\")\n",
"plt.title(\n",
" \"Lasso $R^2$: %.3f, Elastic Net $R^2$: %.3f\" % (r2_score_lasso, r2_score_enet)\n",
")\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"id": "1d4e3c2e",
"metadata": {},
"source": [
"# Linear Regression"
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "3adb2b5f",
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"X = 2 * np.random.rand(100, 1)\n",
"y = 4 + 3 * X + np.random.randn(100, 1)"
]
},
{
"cell_type": "code",
"execution_count": 17,
"id": "fcba9756",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(array([3.69364331]), array([[3.297966]]))"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from sklearn.linear_model import LinearRegression\n",
"lin_reg = LinearRegression()\n",
"lin_reg.fit(X, y)\n",
"lin_reg.intercept_, lin_reg.coef_"
]
},
{
"cell_type": "markdown",
"id": "ee8b56bb",
"metadata": {},
"source": [
"# Ridge Regression"
]
},
{
"cell_type": "code",
"execution_count": 19,
"id": "8f611cdf",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[8.59593496]])"
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from sklearn.linear_model import Ridge\n",
"ridge_reg = Ridge(alpha=1, solver=\"cholesky\")\n",
"ridge_reg.fit(X, y)\n",
"ridge_reg.predict([[1.5]])"
]
},
{
"cell_type": "markdown",
"id": "2f290a3a",
"metadata": {},
"source": [
"# LASSO"
]
},
{
"cell_type": "code",
"execution_count": 20,
"id": "2702b95f",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([8.50136427])"
]
},
"execution_count": 20,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from sklearn.linear_model import Lasso\n",
"lasso_reg = Lasso(alpha=0.1)\n",
"lasso_reg.fit(X, y)\n",
"lasso_reg.predict([[1.5]])"
]
},
{
"cell_type": "code",
"execution_count": 21,
"id": "c3bace65",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([8.37837369])"
]
},
"execution_count": 21,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from sklearn.linear_model import ElasticNet\n",
"elastic_net = ElasticNet(alpha=0.1, l1_ratio=0.5)\n",
"elastic_net.fit(X, y)\n",
"elastic_net.predict([[1.5]])"
]
},
{
"cell_type": "markdown",
"id": "0a286404",
"metadata": {},
"source": [
"# Application of Lasso and other regressions to high frequency data"
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "60c65176",
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"import numpy as np\n",
"import os"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "b3c90b74",
"metadata": {},
"outputs": [],
"source": [
"# Importing the dataset\n",
"data = pd.read_csv('ftse100.csv')"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "3382fe87",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"There are 2 unique RIC codes in the dataset.\n"
]
}
],
"source": [
"# Count the number of unique RIC codes\n",
"num_ids = len(data['#RIC'].unique())\n",
"\n",
"# Print the result\n",
"print('There are', num_ids, 'unique RIC codes in the dataset.')"
]
},
{
"cell_type": "code",
"execution_count": 44,
"id": "6eb672dd",
"metadata": {},
"outputs": [],
"source": [
"# convert Date-Time to datetime and set as index\n",
"data['Date-Time'] = pd.to_datetime(data['Date-Time'], format='%Y-%m-%d %H:%M:%S')\n",
"data.set_index('Date-Time', inplace=True)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "ed1dc5b8",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>#RIC</th>\n",
" <th>Domain</th>\n",
" <th>Date-Time</th>\n",
" <th>Type</th>\n",
" <th>Last</th>\n",
" <th>Volume</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>AAF.L</td>\n",
" <td>Market Price</td>\n",
" <td>1996-03-14T15:37:00.000000000Z</td>\n",
" <td>Intraday 1Min</td>\n",
" <td>299.5</td>\n",
" <td>25000.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>AAF.L</td>\n",
" <td>Market Price</td>\n",
" <td>1996-03-20T14:51:00.000000000Z</td>\n",
" <td>Intraday 1Min</td>\n",
" <td>20.0</td>\n",
" <td>100000.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>AAF.L</td>\n",
" <td>Market Price</td>\n",
" <td>1996-05-14T13:49:00.000000000+01</td>\n",
" <td>Intraday 1Min</td>\n",
" <td>30.0</td>\n",
" <td>6000.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>AAF.L</td>\n",
" <td>Market Price</td>\n",
" <td>1996-10-16T16:04:00.000000000+01</td>\n",
" <td>Intraday 1Min</td>\n",
" <td>25.0</td>\n",
" <td>50000.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>AAF.L</td>\n",
" <td>Market Price</td>\n",
" <td>1996-10-23T14:59:00.000000000+01</td>\n",
" <td>Intraday 1Min</td>\n",
" <td>30.0</td>\n",
" <td>23000.0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" #RIC Domain Date-Time Type \\\n",
"0 AAF.L Market Price 1996-03-14T15:37:00.000000000Z Intraday 1Min \n",
"1 AAF.L Market Price 1996-03-20T14:51:00.000000000Z Intraday 1Min \n",
"2 AAF.L Market Price 1996-05-14T13:49:00.000000000+01 Intraday 1Min \n",
"3 AAF.L Market Price 1996-10-16T16:04:00.000000000+01 Intraday 1Min \n",
"4 AAF.L Market Price 1996-10-23T14:59:00.000000000+01 Intraday 1Min \n",
"\n",
" Last Volume \n",
"0 299.5 25000.0 \n",
"1 20.0 100000.0 \n",
"2 30.0 6000.0 \n",
"3 25.0 50000.0 \n",
"4 30.0 23000.0 "
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data.head()"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "73a07ccd",
"metadata": {},
"outputs": [],
"source": [
"# Calculate the daily returns\n",
"data['cobit_returns'] = data['Last'].pct_change()"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "bcd2738e",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>#RIC</th>\n",
" <th>Domain</th>\n",
" <th>Date-Time</th>\n",
" <th>Type</th>\n",
" <th>Last</th>\n",
" <th>Volume</th>\n",
" <th>cobit_returns</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>AAF.L</td>\n",
" <td>Market Price</td>\n",
" <td>1996-03-14T15:37:00.000000000Z</td>\n",
" <td>Intraday 1Min</td>\n",
" <td>299.5</td>\n",
" <td>25000.0</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>AAF.L</td>\n",
" <td>Market Price</td>\n",
" <td>1996-03-20T14:51:00.000000000Z</td>\n",
" <td>Intraday 1Min</td>\n",
" <td>20.0</td>\n",
" <td>100000.0</td>\n",
" <td>-0.933222</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>AAF.L</td>\n",
" <td>Market Price</td>\n",
" <td>1996-05-14T13:49:00.000000000+01</td>\n",
" <td>Intraday 1Min</td>\n",
" <td>30.0</td>\n",
" <td>6000.0</td>\n",
" <td>0.500000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>AAF.L</td>\n",
" <td>Market Price</td>\n",
" <td>1996-10-16T16:04:00.000000000+01</td>\n",
" <td>Intraday 1Min</td>\n",
" <td>25.0</td>\n",
" <td>50000.0</td>\n",
" <td>-0.166667</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>AAF.L</td>\n",
" <td>Market Price</td>\n",
" <td>1996-10-23T14:59:00.000000000+01</td>\n",
" <td>Intraday 1Min</td>\n",
" <td>30.0</td>\n",
" <td>23000.0</td>\n",
" <td>0.200000</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" #RIC Domain Date-Time Type \\\n",
"0 AAF.L Market Price 1996-03-14T15:37:00.000000000Z Intraday 1Min \n",
"1 AAF.L Market Price 1996-03-20T14:51:00.000000000Z Intraday 1Min \n",
"2 AAF.L Market Price 1996-05-14T13:49:00.000000000+01 Intraday 1Min \n",
"3 AAF.L Market Price 1996-10-16T16:04:00.000000000+01 Intraday 1Min \n",
"4 AAF.L Market Price 1996-10-23T14:59:00.000000000+01 Intraday 1Min \n",
"\n",
" Last Volume cobit_returns \n",
"0 299.5 25000.0 NaN \n",
"1 20.0 100000.0 -0.933222 \n",
"2 30.0 6000.0 0.500000 \n",
"3 25.0 50000.0 -0.166667 \n",
"4 30.0 23000.0 0.200000 "
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data.head()"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "aecc9b3c",
"metadata": {},
"outputs": [],
"source": [
"data['cobit_lag1'] = data['cobit_returns'].shift(1)\n",
"data['cobit_lag2'] = data['cobit_returns'].shift(2)\n",
"data['cobit_lag3'] = data['cobit_returns'].shift(3)"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "053f4fb2",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>#RIC</th>\n",
" <th>Domain</th>\n",
" <th>Date-Time</th>\n",
" <th>Type</th>\n",
" <th>Last</th>\n",
" <th>Volume</th>\n",
" <th>cobit_returns</th>\n",
" <th>cobit_lag1</th>\n",
" <th>cobit_lag2</th>\n",
" <th>cobit_lag3</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>AAF.L</td>\n",
" <td>Market Price</td>\n",
" <td>1996-03-14T15:37:00.000000000Z</td>\n",
" <td>Intraday 1Min</td>\n",
" <td>299.5</td>\n",
" <td>25000.0</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>AAF.L</td>\n",
" <td>Market Price</td>\n",
" <td>1996-03-20T14:51:00.000000000Z</td>\n",
" <td>Intraday 1Min</td>\n",
" <td>20.0</td>\n",
" <td>100000.0</td>\n",
" <td>-0.933222</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>AAF.L</td>\n",
" <td>Market Price</td>\n",
" <td>1996-05-14T13:49:00.000000000+01</td>\n",
" <td>Intraday 1Min</td>\n",
" <td>30.0</td>\n",
" <td>6000.0</td>\n",
" <td>0.500000</td>\n",
" <td>-0.933222</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>AAF.L</td>\n",
" <td>Market Price</td>\n",
" <td>1996-10-16T16:04:00.000000000+01</td>\n",
" <td>Intraday 1Min</td>\n",
" <td>25.0</td>\n",
" <td>50000.0</td>\n",
" <td>-0.166667</td>\n",
" <td>0.500000</td>\n",
" <td>-0.933222</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>AAF.L</td>\n",
" <td>Market Price</td>\n",
" <td>1996-10-23T14:59:00.000000000+01</td>\n",
" <td>Intraday 1Min</td>\n",
" <td>30.0</td>\n",
" <td>23000.0</td>\n",
" <td>0.200000</td>\n",
" <td>-0.166667</td>\n",
" <td>0.500000</td>\n",
" <td>-0.933222</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" #RIC Domain Date-Time Type \\\n",
"0 AAF.L Market Price 1996-03-14T15:37:00.000000000Z Intraday 1Min \n",
"1 AAF.L Market Price 1996-03-20T14:51:00.000000000Z Intraday 1Min \n",
"2 AAF.L Market Price 1996-05-14T13:49:00.000000000+01 Intraday 1Min \n",
"3 AAF.L Market Price 1996-10-16T16:04:00.000000000+01 Intraday 1Min \n",
"4 AAF.L Market Price 1996-10-23T14:59:00.000000000+01 Intraday 1Min \n",
"\n",
" Last Volume cobit_returns cobit_lag1 cobit_lag2 cobit_lag3 \n",
"0 299.5 25000.0 NaN NaN NaN NaN \n",
"1 20.0 100000.0 -0.933222 NaN NaN NaN \n",
"2 30.0 6000.0 0.500000 -0.933222 NaN NaN \n",
"3 25.0 50000.0 -0.166667 0.500000 -0.933222 NaN \n",
"4 30.0 23000.0 0.200000 -0.166667 0.500000 -0.933222 "
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data.head()"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "454ae785",
"metadata": {},
"outputs": [],
"source": [
"data = data[[\"cobit_returns\",\"cobit_lag1\",\"cobit_lag2\",\"cobit_lag3\"]]"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "ab478ec2",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>cobit_returns</th>\n",
" <th>cobit_lag1</th>\n",
" <th>cobit_lag2</th>\n",
" <th>cobit_lag3</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>-0.933222</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>0.500000</td>\n",
" <td>-0.933222</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>-0.166667</td>\n",
" <td>0.500000</td>\n",
" <td>-0.933222</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>0.200000</td>\n",
" <td>-0.166667</td>\n",
" <td>0.500000</td>\n",
" <td>-0.933222</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1048570</th>\n",
" <td>-0.001499</td>\n",
" <td>-0.004478</td>\n",
" <td>-0.002976</td>\n",
" <td>0.005988</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1048571</th>\n",
" <td>-0.001502</td>\n",
" <td>-0.001499</td>\n",
" <td>-0.004478</td>\n",
" <td>-0.002976</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1048572</th>\n",
" <td>0.001504</td>\n",
" <td>-0.001502</td>\n",
" <td>-0.001499</td>\n",
" <td>-0.004478</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1048573</th>\n",
" <td>-0.000751</td>\n",
" <td>0.001504</td>\n",
" <td>-0.001502</td>\n",
" <td>-0.001499</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1048574</th>\n",
" <td>0.001503</td>\n",
" <td>-0.000751</td>\n",
" <td>0.001504</td>\n",
" <td>-0.001502</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>1048575 rows × 4 columns</p>\n",
"</div>"
],
"text/plain": [
" cobit_returns cobit_lag1 cobit_lag2 cobit_lag3\n",
"0 NaN NaN NaN NaN\n",
"1 -0.933222 NaN NaN NaN\n",
"2 0.500000 -0.933222 NaN NaN\n",
"3 -0.166667 0.500000 -0.933222 NaN\n",
"4 0.200000 -0.166667 0.500000 -0.933222\n",
"... ... ... ... ...\n",
"1048570 -0.001499 -0.004478 -0.002976 0.005988\n",
"1048571 -0.001502 -0.001499 -0.004478 -0.002976\n",
"1048572 0.001504 -0.001502 -0.001499 -0.004478\n",
"1048573 -0.000751 0.001504 -0.001502 -0.001499\n",
"1048574 0.001503 -0.000751 0.001504 -0.001502\n",
"\n",
"[1048575 rows x 4 columns]"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data"
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "36a83ae2",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"cobit_returns 1\n",
"cobit_lag1 2\n",
"cobit_lag2 3\n",
"cobit_lag3 4\n",
"dtype: int64"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Check for invalid values\n",
"data.isnull().sum()"
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "c1330da2",
"metadata": {},
"outputs": [],
"source": [
"data = data.fillna(method='ffill').fillna(method='bfill')"
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "f467e2fd",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"cobit_returns 0\n",
"cobit_lag1 0\n",
"cobit_lag2 0\n",
"cobit_lag3 0\n",
"dtype: int64\n"
]
}
],
"source": [
"# Check for invalid values\n",
"print(np.isnan(data).sum())"
]
},
{
"cell_type": "code",
"execution_count": 15,
"id": "22cb1b8f",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"786431"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"##Split data into train and test\n",
"# Total dataset length\n",
"dataset_length = data.shape[0]\n",
"# Training dataset length\n",
"split = int(dataset_length * 0.75)\n",
"split"
]
},
{
"cell_type": "code",
"execution_count": 16,
"id": "c2241665",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(786431, 4)\n",
"(262144, 4)\n"
]
}
],
"source": [
"# Splitiing the X and y into train and test datasets\n",
"train = data[:split]\n",
"test = data[split:]\n",
"# Print the size of the train and test dataset\n",
"print(train.shape)\n",
"print(test.shape)"
]
},
{
"cell_type": "code",
"execution_count": 17,
"id": "d5e0fa54",
"metadata": {},
"outputs": [],
"source": [
"#create x and y variables for both test and train data\n",
"x_train = train.drop('cobit_returns', axis=1)\n",
"y_train = train['cobit_returns']\n",
"x_test = test.drop('cobit_returns', axis=1)\n",
"y_test = test['cobit_returns']"
]
},
{
"cell_type": "code",
"execution_count": 20,
"id": "cc7e1c08",
"metadata": {},
"outputs": [],
"source": [
"alpha = 0.1\n",
"lasso = Lasso(alpha=alpha)\n"
]
},
{
"cell_type": "code",
"execution_count": 71,
"id": "876542e7",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Lasso(alpha=0.1)\n",
"r^2 on test data : -86.780135\n"
]
}
],
"source": [
"y_pred_lasso = lasso.fit(x_train, y_train).predict(x_test)\n",
"r2_score_lasso = r2_score(y_test, y_pred_lasso)\n",
"print(lasso)\n",
"print(\"r^2 on test data : %f\" % r2_score_lasso)"
]
},
{
"cell_type": "code",
"execution_count": 25,
"id": "4e023cf5",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"3149.3449335225737\n",
"5.7133409114840106e-11\n"
]
}
],
"source": [
"#check r2 on train data\n",
"model_lasso = Lasso(alpha=0.01)\n",
"\n",
"model_lasso.fit(x_train, y_train) \n",
"\n",
"pred_train_lasso= model_lasso.predict(x_train)\n",
"\n",
"print(np.sqrt(mean_squared_error(y_train,pred_train_lasso)))\n",
"\n",
"print(r2_score(y_train, pred_train_lasso))\n"
]
},
{
"cell_type": "code",
"execution_count": 73,
"id": "994a8152",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"ElasticNet(alpha=0.1, l1_ratio=0.7)\n",
"r^2 on test data : -86.780137\n"
]
}
],
"source": [
"from sklearn.linear_model import ElasticNet\n",
"\n",
"enet = ElasticNet(alpha=alpha, l1_ratio=0.7)\n",
"\n",
"y_pred_enet = enet.fit(x_train, y_train).predict(x_test)\n",
"r2_score_enet = r2_score(y_test, y_pred_enet)\n",
"print(enet)\n",
"print(\"r^2 on test data : %f\" % r2_score_enet)"
]
},
{
"cell_type": "code",
"execution_count": 74,
"id": "40a39647",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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c13zT6ZGdiefuqp/skMSSciyZcs4/vjjUx2GHERirVNm9p6751UeVmWoRURCTolARCTklAhEREJOiUBEJOSUCEREQk6JQEQk5JQIROqbt+6B1XMrtq2eG2lPQE2u409348aNIysri3HjxlFSUsKJJ55Ir169mDdvHsOGDePrr7+OO+6UKVP2+3r8NWvW8Je//GU/o0493VAWQnfeGXk6W3StpYICWLjwu7pMksba94anR8EF06HzwEgSKOsOualTp1JSUkKjRo2YMWMG3bp145FHHgHg5JNPrnLcMWPG7Pd8yxLBJZdcst/TSCXtEYSQHt1Zz3UeGPnRf3oUzPl9xaSQZH/729/Kt6qHDBlSXgDtzTffLH+ATa9evdiyZUvc0shPPvkkPXr0IDs7m1/+8pcx5xOrLPWOHTu4/PLL6dGjB7169aIgWGH37NnDuHHjystET506FYBzzjmHb7/9lhNPPJE77riDm266idmzZ5eXpe7UqRNffvklAI8++ig9e/YkJyeHSy+9FIiUgJ44cSIAK1eu5Mwzz+SEE07g5JNP5qOPIiU/Ro0axXXXXcdJJ51Ely5dyu+YHj9+PPPmzSM3N5e7776bDz/8kL59+5Kbm0vPnj355JNPkv7dJFWskqTp/tqfB9O4VyxDHXZz5ri3auV+882uB/Wkgf0pQ+1/zHK/pbn767clJYZYD6b56quvystLP/jgg37DDTe4u/vZZ5/tb731lru7b9myxXfv3h2zNPK6deu8Y8eOvmHDBt+9e7fn5+f7888/X2Ee8cpST5w40UeNGuXu7suWLfOOHTv69u3bferUqf673/3O3d137NjhJ5xwQnnJ5+jPEF322f27EtJLlizx4447rrycdFmZ6FtuucXvuusud3c/5ZRTfPny5e7u/s4773h+fr67R0ppn3/++b5nzx7/8MMP/ZhjjnH3fUtSjx071h9//PHyz7dt27YafQfJVOdlqKX++e7RnR24+WaV5K53Vs+FLcXwvY5Q+CfofPIB2SMoKiriJz/5CcXFxezatau8tPKAAQO44YYbGDlyJOeddx4dOnSIWRp5zpw5DB48mNatWwMwcuRI5s6dy4gRI8rnEa8s9VtvvcW1114LRArVHX300SxfvpxXXnmFxYsXl2+Nf/PNN3zyySflsVVnzpw5nH/++bRq1QrYt0z01q1befvtt7ngggvK23bu3Fn+fsSIERxyyCF07949ZoloiBSe+/3vf09RURHnnXcexx57bI1iSxUdGgqpggJYObct3YcV8cADelpbvVJ2TqB1Nzj86O8OE1U+gZwE1157LWPHjuVf//oXU6dOZceOHUDkUMhDDz3E9u3b6devHx999FF5aeT27dtz6aWX8uijj8Yt9RzN45Rtjjeuu3PvvfeyaNEiFi1axOrVqzn99NNr/Jniza/M3r17Ofzww8unv2jRIpYtW1beP7pMdLwYL7nkEmbNmkWTJk0444wzqizLnQ60RxBC0Y/ubNN1M2Nu7MCFF8LMmdozSAfVlaFufvgn7NzRlZ1rPge2wZyHaNS4K43++Es2fx17y3N/y1B/8803tG/fHqD8pCtEjqH36NGDHj16MH/+fD766COaNGmyT2nkX/7yl1x//fV8+eWXtGjRgieffLJ8K79MvLLUAwcO5IknnuCUU05h+fLlfPbZZ3Tt2pUzzjiDBx54gFNOOYXMzEyWL19O+/btadq0aY0+06mnnsq5557LL37xC1q2bLlPmejmzZvTuXNnnn76aS644ALcncWLF5OTkxN3mpXLRK9atYouXbpw3XXXsWrVKhYvXswpp5xSo/hSQYkghBYujPzoT1m+GYj8+M+cGWlXIkh/5T/2R7Yub9u5ozU7d7SOM0bNbNu2rfyJYAA33HADt956KxdccAHt27enX79+rF69GoB77rmHgoICMjIy6N69O0OHDmXGjBn7lEZu164df/jDH8jPz8fdGTZsGMOHD68w33hlqf/jP/6DMWPG0KNHDxo0aMD06dNp1KgRV1xxBWvWrKF37964O61bt+aFF16o8efMysriN7/5DYMGDSIjI4NevXoxffr0CsM88cQTXH311dx2223s3r2biy66qMpE0LNnTxo0aEBOTk75A3sef/xxMjMzOfLII5kwYUKN40uFpJShNrMzgf9H5HGTD7n77ZX6jwNGBp0NgOOB1u7+lZmtAbYAe4BSj1EitTKVoU4OLY/0oTLUkmy1KUOd8B6BmWUA9wGnAUXAQjOb5e7lD+R097uAu4LhfwT8wt2/ippMvrt/mWgsIiJSe8k4WdwXWOHuq9x9FzADGF7F8BcDTyZhviIikgTJSATtgbVR3UVB2z7M7FDgTODZqGYHXjGz98xsdLyZmNloMys0s8KSkpIkhC0iIpCc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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"m, s, _ = plt.stem(\n",
" np.where(enet.coef_)[0],\n",
" enet.coef_[enet.coef_ != 0],\n",
" markerfmt=\"x\",\n",
" label=\"Elastic net coefficients\",\n",
")\n",
"plt.setp([m, s], color=\"#2ca02c\")\n",
"m, s, _ = plt.stem(\n",
" np.where(lasso.coef_)[0],\n",
" lasso.coef_[lasso.coef_ != 0],\n",
" markerfmt=\"x\",\n",
" label=\"Lasso coefficients\",\n",
")\n",
"plt.setp([m, s], color=\"#ff7f0e\")\n",
"plt.stem(\n",
" np.where(coef)[0],\n",
" coef[coef != 0],\n",
" label=\"true coefficients\",\n",
" markerfmt=\"bx\",\n",
")\n",
"\n",
"plt.legend(loc=\"best\")\n",
"plt.title(\n",
" \"Lasso $R^2$: %.3f, Elastic Net $R^2$: %.3f\" % (r2_score_lasso, r2_score_enet)\n",
")\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 81,
"id": "9255f850",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"-86.78014060525989\n"
]
}
],
"source": [
"#Create a Ridge regression model and fit it to the training data\n",
"model = Ridge(alpha=1.0)\n",
"model.fit(x_train, y_train)\n",
"\n",
"# Make predictions on the test set and calculate the R-squared value\n",
"y_pred = model.predict(x_test)\n",
"r2 = r2_score(y_test, y_pred)\n",
"print(r2)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "299c3ea3",
"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.9.7"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment