├── stock_price_prediction └── README.md ├── LICENSE ├── Small_training_large_test.ipynb ├── Best_number_of_neurons.ipynb ├── Your_own_AutoML.ipynb ├── Grid_search_and_random_search.ipynb ├── Feature_selection_via_grid_search_in_supervised_models.ipynb ├── Candlesticks.ipynb ├── Calculation_of_daily_pivot_levels.ipynb ├── Heikin_Ashi.ipynb └── Threshold.ipynb /stock_price_prediction/README.md: -------------------------------------------------------------------------------- 1 | # Readme 2 | 3 | These notebooks has been used for the article **Machine learning for stock prediction. A quantitative approach** (https://towardsdatascience.com/machine-learning-for-stock-prediction-a-quantitative-approach-4ca98c0bfb8c) 4 | 5 | ## File list 6 | 7 | * **MSFT.csv** contains the original data of Microsoft stock price as downloaded from Yahoo Finance. 8 | * **stock prediction random split.ipynb** has been used to make the predictions with a random training/test split. 9 | * **stock prediction sequential split.ipynb** has been used for the second part of the article, where a sequential split is discussed. 10 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Gianluca Malato 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Small_training_large_test.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "nbformat": 4, 3 | "nbformat_minor": 0, 4 | "metadata": { 5 | "colab": { 6 | "name": "Small training large test.ipynb", 7 | "provenance": [], 8 | "authorship_tag": "ABX9TyNo9EJ1aG207dryxeiQbV6R" 9 | }, 10 | "kernelspec": { 11 | "name": "python3", 12 | "display_name": "Python 3" 13 | } 14 | }, 15 | "cells": [ 16 | { 17 | "cell_type": "code", 18 | "metadata": { 19 | "id": "hD750Qyr8Zoh", 20 | "colab_type": "code", 21 | "colab": {} 22 | }, 23 | "source": [ 24 | "import numpy as np\n", 25 | "from sklearn.model_selection import train_test_split\n", 26 | "from sklearn.linear_model import LinearRegression\n", 27 | "from sklearn.metrics import mean_squared_error" 28 | ], 29 | "execution_count": 0, 30 | "outputs": [] 31 | }, 32 | { 33 | "cell_type": "markdown", 34 | "metadata": { 35 | "id": "jpuXIj1UB8qO", 36 | "colab_type": "text" 37 | }, 38 | "source": [ 39 | "# Simulate a dataset for a linear regression\n", 40 | "\n", 41 | "$$ y = x_1 + x_2 + x_3 + x_4 + \\epsilon $$\n", 42 | "\n", 43 | "The experimental error $\\epsilon$ is normally distributed." 44 | ] 45 | }, 46 | { 47 | "cell_type": "code", 48 | "metadata": { 49 | "id": "9uqAnLwNCPRj", 50 | "colab_type": "code", 51 | "colab": {} 52 | }, 53 | "source": [ 54 | "np.random.seed(0)" 55 | ], 56 | "execution_count": 0, 57 | "outputs": [] 58 | }, 59 | { 60 | "cell_type": "code", 61 | "metadata": { 62 | "id": "xR-EfcTOAllW", 63 | "colab_type": "code", 64 | "colab": {} 65 | }, 66 | "source": [ 67 | "X = np.random.normal(size=4000000).reshape(1000000,4)" 68 | ], 69 | "execution_count": 0, 70 | "outputs": [] 71 | }, 72 | { 73 | "cell_type": "code", 74 | "metadata": { 75 | "id": "boTPEKeqA0ZI", 76 | "colab_type": "code", 77 | "colab": {} 78 | }, 79 | "source": [ 80 | "y = []\n", 81 | "\n", 82 | "for record in X:\n", 83 | " y.append(np.sum(record) + np.random.normal())\n", 84 | "\n", 85 | "y = np.array(y)" 86 | ], 87 | "execution_count": 0, 88 | "outputs": [] 89 | }, 90 | { 91 | "cell_type": "markdown", 92 | "metadata": { 93 | "id": "5z2B8V1fCYLw", 94 | "colab_type": "text" 95 | }, 96 | "source": [ 97 | "## Small test set, large training set" 98 | ] 99 | }, 100 | { 101 | "cell_type": "code", 102 | "metadata": { 103 | "id": "HfmW4GJv8ms6", 104 | "colab_type": "code", 105 | "colab": {} 106 | }, 107 | "source": [ 108 | "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)" 109 | ], 110 | "execution_count": 0, 111 | "outputs": [] 112 | }, 113 | { 114 | "cell_type": "code", 115 | "metadata": { 116 | "id": "EnpH8TJw87cs", 117 | "colab_type": "code", 118 | "outputId": "0cf02b57-16a9-4351-bb31-b01dbdb915c3", 119 | "colab": { 120 | "base_uri": "https://localhost:8080/", 121 | "height": 34 122 | } 123 | }, 124 | "source": [ 125 | "model = LinearRegression()\n", 126 | "model.fit(X_train,y_train)" 127 | ], 128 | "execution_count": 0, 129 | "outputs": [ 130 | { 131 | "output_type": "execute_result", 132 | "data": { 133 | "text/plain": [ 134 | "LinearRegression(copy_X=True, fit_intercept=True, n_jobs=None, normalize=False)" 135 | ] 136 | }, 137 | "metadata": { 138 | "tags": [] 139 | }, 140 | "execution_count": 181 141 | } 142 | ] 143 | }, 144 | { 145 | "cell_type": "code", 146 | "metadata": { 147 | "id": "CsJIQ6tg9L3f", 148 | "colab_type": "code", 149 | "colab": {} 150 | }, 151 | "source": [ 152 | "def estimate_error(X_test,y_test):\n", 153 | " n_iter = 100\n", 154 | " np.random.seed(0)\n", 155 | " errors = []\n", 156 | "\n", 157 | " indices = list(range(X_test.shape[0]))\n", 158 | " for i in range(n_iter):\n", 159 | " new_indices = np.random.choice(indices,len(indices),replace=True)\n", 160 | "\n", 161 | " new_X_test = X_test[new_indices]\n", 162 | " new_y_test = y_test[new_indices]\n", 163 | "\n", 164 | " new_y_pred = model.predict(new_X_test)\n", 165 | "\n", 166 | " new_error = np.sqrt(mean_squared_error(new_y_test,new_y_pred))\n", 167 | "\n", 168 | " errors.append(new_error)\n", 169 | "\n", 170 | " return np.mean(errors),np.std(errors)" 171 | ], 172 | "execution_count": 0, 173 | "outputs": [] 174 | }, 175 | { 176 | "cell_type": "code", 177 | "metadata": { 178 | "id": "ok9eanO4-XmV", 179 | "colab_type": "code", 180 | "outputId": "c01b1886-9077-433b-bcf4-143b28e93252", 181 | "colab": { 182 | "base_uri": "https://localhost:8080/", 183 | "height": 34 184 | } 185 | }, 186 | "source": [ 187 | "estimate_error(X_test,y_test)" 188 | ], 189 | "execution_count": 0, 190 | "outputs": [ 191 | { 192 | "output_type": "execute_result", 193 | "data": { 194 | "text/plain": [ 195 | "(1.0028372852013618, 0.0015058423972133183)" 196 | ] 197 | }, 198 | "metadata": { 199 | "tags": [] 200 | }, 201 | "execution_count": 184 202 | } 203 | ] 204 | }, 205 | { 206 | "cell_type": "markdown", 207 | "metadata": { 208 | "id": "Rp8tEtTrCcYW", 209 | "colab_type": "text" 210 | }, 211 | "source": [ 212 | "## Large test set, small training set" 213 | ] 214 | }, 215 | { 216 | "cell_type": "code", 217 | "metadata": { 218 | "id": "XU_e4_HE-dr1", 219 | "colab_type": "code", 220 | "colab": {} 221 | }, 222 | "source": [ 223 | "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.8, random_state=42)" 224 | ], 225 | "execution_count": 0, 226 | "outputs": [] 227 | }, 228 | { 229 | "cell_type": "code", 230 | "metadata": { 231 | "id": "FQmjqsyE-fZ9", 232 | "colab_type": "code", 233 | "outputId": "9f89ed55-c383-423b-d863-7ec3123fcbb4", 234 | "colab": { 235 | "base_uri": "https://localhost:8080/", 236 | "height": 34 237 | } 238 | }, 239 | "source": [ 240 | "model = LinearRegression()\n", 241 | "model.fit(X_train,y_train)" 242 | ], 243 | "execution_count": 0, 244 | "outputs": [ 245 | { 246 | "output_type": "execute_result", 247 | "data": { 248 | "text/plain": [ 249 | "LinearRegression(copy_X=True, fit_intercept=True, n_jobs=None, normalize=False)" 250 | ] 251 | }, 252 | "metadata": { 253 | "tags": [] 254 | }, 255 | "execution_count": 186 256 | } 257 | ] 258 | }, 259 | { 260 | "cell_type": "code", 261 | "metadata": { 262 | "id": "6OcToXeO-gzU", 263 | "colab_type": "code", 264 | "outputId": "fce2074b-f39f-4816-ac3b-8be8048e2c66", 265 | "colab": { 266 | "base_uri": "https://localhost:8080/", 267 | "height": 34 268 | } 269 | }, 270 | "source": [ 271 | "estimate_error(X_test,y_test)" 272 | ], 273 | "execution_count": 0, 274 | "outputs": [ 275 | { 276 | "output_type": "execute_result", 277 | "data": { 278 | "text/plain": [ 279 | "(1.0007244861649207, 0.000753571738923046)" 280 | ] 281 | }, 282 | "metadata": { 283 | "tags": [] 284 | }, 285 | "execution_count": 187 286 | } 287 | ] 288 | }, 289 | { 290 | "cell_type": "code", 291 | "metadata": { 292 | "id": "6OirFqEJDUfD", 293 | "colab_type": "code", 294 | "colab": {} 295 | }, 296 | "source": [ 297 | "" 298 | ], 299 | "execution_count": 0, 300 | "outputs": [] 301 | } 302 | ] 303 | } -------------------------------------------------------------------------------- /Best_number_of_neurons.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "nbformat": 4, 3 | "nbformat_minor": 0, 4 | "metadata": { 5 | "colab": { 6 | "name": "Best number of neurons.ipynb", 7 | "provenance": [], 8 | "authorship_tag": "ABX9TyNOql4Q2htcn/g+xk29cGc0" 9 | }, 10 | "kernelspec": { 11 | "name": "python3", 12 | "display_name": "Python 3" 13 | }, 14 | "language_info": { 15 | "name": "python" 16 | } 17 | }, 18 | "cells": [ 19 | { 20 | "cell_type": "code", 21 | "metadata": { 22 | "id": "HBvcmeB5exNU" 23 | }, 24 | "source": [ 25 | "import numpy as np" 26 | ], 27 | "execution_count": 1, 28 | "outputs": [] 29 | }, 30 | { 31 | "cell_type": "code", 32 | "metadata": { 33 | "id": "8VrpdnQBe1ml" 34 | }, 35 | "source": [ 36 | "from sklearn.preprocessing import StandardScaler\n", 37 | "from sklearn.neural_network import MLPClassifier\n", 38 | "from sklearn.datasets import load_breast_cancer\n", 39 | "from sklearn.model_selection import train_test_split, GridSearchCV\n", 40 | "from sklearn.pipeline import Pipeline\n", 41 | "from sklearn.metrics import roc_auc_score" 42 | ], 43 | "execution_count": 10, 44 | "outputs": [] 45 | }, 46 | { 47 | "cell_type": "code", 48 | "metadata": { 49 | "id": "VOamkPGjfDSr" 50 | }, 51 | "source": [ 52 | "X,y = load_breast_cancer(return_X_y=True)" 53 | ], 54 | "execution_count": 3, 55 | "outputs": [] 56 | }, 57 | { 58 | "cell_type": "code", 59 | "metadata": { 60 | "id": "bsyA-VL8fE-z" 61 | }, 62 | "source": [ 63 | "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42)" 64 | ], 65 | "execution_count": 5, 66 | "outputs": [] 67 | }, 68 | { 69 | "cell_type": "code", 70 | "metadata": { 71 | "id": "uUJ_Z62-fLJw" 72 | }, 73 | "source": [ 74 | "model = Pipeline([\n", 75 | " ('scaler',StandardScaler()),\n", 76 | " ('model',MLPClassifier(random_state=0))\n", 77 | "])" 78 | ], 79 | "execution_count": 22, 80 | "outputs": [] 81 | }, 82 | { 83 | "cell_type": "code", 84 | "metadata": { 85 | "id": "7kRl97p-fOj_" 86 | }, 87 | "source": [ 88 | "search = GridSearchCV(model,\n", 89 | " {'model__hidden_layer_sizes':[(x,) for x in np.arange(5,100,2)]},\n", 90 | " cv = 5, scoring = \"roc_auc\", verbose=3, n_jobs = -1\n", 91 | " \n", 92 | " )" 93 | ], 94 | "execution_count": 23, 95 | "outputs": [] 96 | }, 97 | { 98 | "cell_type": "code", 99 | "metadata": { 100 | "colab": { 101 | "base_uri": "https://localhost:8080/" 102 | }, 103 | "id": "tu1qJj6zfcTn", 104 | "outputId": "b1c5f43c-bc95-4fef-ae7a-c8973ae6cc64" 105 | }, 106 | "source": [ 107 | "search.fit(X_train, y_train)" 108 | ], 109 | "execution_count": 24, 110 | "outputs": [ 111 | { 112 | "output_type": "stream", 113 | "text": [ 114 | "Fitting 5 folds for each of 48 candidates, totalling 240 fits\n" 115 | ], 116 | "name": "stdout" 117 | }, 118 | { 119 | "output_type": "stream", 120 | "text": [ 121 | "[Parallel(n_jobs=-1)]: Using backend LokyBackend with 2 concurrent workers.\n", 122 | "[Parallel(n_jobs=-1)]: Done 28 tasks | elapsed: 5.2s\n", 123 | "[Parallel(n_jobs=-1)]: Done 124 tasks | elapsed: 23.3s\n", 124 | "[Parallel(n_jobs=-1)]: Done 240 out of 240 | elapsed: 51.4s finished\n", 125 | "/usr/local/lib/python3.7/dist-packages/sklearn/neural_network/_multilayer_perceptron.py:571: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (200) reached and the optimization hasn't converged yet.\n", 126 | " % self.max_iter, ConvergenceWarning)\n" 127 | ], 128 | "name": "stderr" 129 | }, 130 | { 131 | "output_type": "execute_result", 132 | "data": { 133 | "text/plain": [ 134 | "GridSearchCV(cv=5, error_score=nan,\n", 135 | " estimator=Pipeline(memory=None,\n", 136 | " steps=[('scaler',\n", 137 | " StandardScaler(copy=True,\n", 138 | " with_mean=True,\n", 139 | " with_std=True)),\n", 140 | " ('model',\n", 141 | " MLPClassifier(activation='relu',\n", 142 | " alpha=0.0001,\n", 143 | " batch_size='auto',\n", 144 | " beta_1=0.9, beta_2=0.999,\n", 145 | " early_stopping=False,\n", 146 | " epsilon=1e-08,\n", 147 | " hidden_layer_sizes=(100,),\n", 148 | " learning_rate='constant',\n", 149 | " learning_rate_init=0.001,\n", 150 | " max_f...\n", 151 | " verbose=False),\n", 152 | " iid='deprecated', n_jobs=-1,\n", 153 | " param_grid={'model__hidden_layer_sizes': [(5,), (7,), (9,), (11,),\n", 154 | " (13,), (15,), (17,),\n", 155 | " (19,), (21,), (23,),\n", 156 | " (25,), (27,), (29,),\n", 157 | " (31,), (33,), (35,),\n", 158 | " (37,), (39,), (41,),\n", 159 | " (43,), (45,), (47,),\n", 160 | " (49,), (51,), (53,),\n", 161 | " (55,), (57,), (59,),\n", 162 | " (61,), (63,), ...]},\n", 163 | " pre_dispatch='2*n_jobs', refit=True, return_train_score=False,\n", 164 | " scoring='roc_auc', verbose=3)" 165 | ] 166 | }, 167 | "metadata": { 168 | "tags": [] 169 | }, 170 | "execution_count": 24 171 | } 172 | ] 173 | }, 174 | { 175 | "cell_type": "code", 176 | "metadata": { 177 | "colab": { 178 | "base_uri": "https://localhost:8080/" 179 | }, 180 | "id": "-2f7omgmfdzk", 181 | "outputId": "e83191c7-03bb-4582-f8c3-54b02872071f" 182 | }, 183 | "source": [ 184 | "search.best_score_" 185 | ], 186 | "execution_count": 25, 187 | "outputs": [ 188 | { 189 | "output_type": "execute_result", 190 | "data": { 191 | "text/plain": [ 192 | "0.9947175348495965" 193 | ] 194 | }, 195 | "metadata": { 196 | "tags": [] 197 | }, 198 | "execution_count": 25 199 | } 200 | ] 201 | }, 202 | { 203 | "cell_type": "code", 204 | "metadata": { 205 | "colab": { 206 | "base_uri": "https://localhost:8080/" 207 | }, 208 | "id": "3MHVzATmfgpG", 209 | "outputId": "db2a38d8-5919-4fd9-bb89-f5389d61df92" 210 | }, 211 | "source": [ 212 | "search.best_params_" 213 | ], 214 | "execution_count": 26, 215 | "outputs": [ 216 | { 217 | "output_type": "execute_result", 218 | "data": { 219 | "text/plain": [ 220 | "{'model__hidden_layer_sizes': (75,)}" 221 | ] 222 | }, 223 | "metadata": { 224 | "tags": [] 225 | }, 226 | "execution_count": 26 227 | } 228 | ] 229 | }, 230 | { 231 | "cell_type": "code", 232 | "metadata": { 233 | "colab": { 234 | "base_uri": "https://localhost:8080/" 235 | }, 236 | "id": "jkl5w4osfumy", 237 | "outputId": "cfc7a270-3614-4ed9-a5c3-09ac67362dab" 238 | }, 239 | "source": [ 240 | "roc_auc_score(y_test,search.predict_proba(X_test)[:,1])" 241 | ], 242 | "execution_count": 27, 243 | "outputs": [ 244 | { 245 | "output_type": "execute_result", 246 | "data": { 247 | "text/plain": [ 248 | "0.9982730973233008" 249 | ] 250 | }, 251 | "metadata": { 252 | "tags": [] 253 | }, 254 | "execution_count": 27 255 | } 256 | ] 257 | }, 258 | { 259 | "cell_type": "code", 260 | "metadata": { 261 | "id": "wyS06oJff5cV" 262 | }, 263 | "source": [ 264 | "" 265 | ], 266 | "execution_count": null, 267 | "outputs": [] 268 | } 269 | ] 270 | } -------------------------------------------------------------------------------- /Your_own_AutoML.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "nbformat": 4, 3 | "nbformat_minor": 0, 4 | "metadata": { 5 | "colab": { 6 | "name": "Your own AutoML.ipynb", 7 | "provenance": [], 8 | "authorship_tag": "ABX9TyPPrHBEcAK/MW/yuy8vwq/s" 9 | }, 10 | "kernelspec": { 11 | "name": "python3", 12 | "display_name": "Python 3" 13 | } 14 | }, 15 | "cells": [ 16 | { 17 | "cell_type": "code", 18 | "metadata": { 19 | "id": "6g-tZZaY0mmq" 20 | }, 21 | "source": [ 22 | "import numpy as np\n", 23 | "import pandas as pd\n", 24 | "from sklearn.model_selection import train_test_split\n", 25 | "from sklearn.impute import SimpleImputer\n", 26 | "from sklearn.compose import ColumnTransformer, make_column_selector\n", 27 | "\n", 28 | "from sklearn.preprocessing import StandardScaler, MinMaxScaler, RobustScaler, OneHotEncoder\n", 29 | "from sklearn.feature_selection import SelectKBest, f_classif\n", 30 | "from sklearn.model_selection import RandomizedSearchCV\n", 31 | "from sklearn.pipeline import Pipeline\n", 32 | "from sklearn.linear_model import LogisticRegression\n", 33 | "from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier\n", 34 | "from sklearn.neighbors import KNeighborsClassifier\n", 35 | "from sklearn.tree import DecisionTreeClassifier\n", 36 | "from sklearn.svm import LinearSVC,SVC\n", 37 | "from sklearn.datasets import load_breast_cancer\n", 38 | "from sklearn.metrics import balanced_accuracy_score" 39 | ], 40 | "execution_count": 31, 41 | "outputs": [] 42 | }, 43 | { 44 | "cell_type": "code", 45 | "metadata": { 46 | "id": "-qcc4K-M8nTI" 47 | }, 48 | "source": [ 49 | "class MyAutoMLClassifier:\n", 50 | " def __init__(self, scoring_function = 'balanced_accuracy', n_iter = 50):\n", 51 | " self.scoring_function = scoring_function\n", 52 | " self.n_iter = n_iter\n", 53 | " \n", 54 | " def fit(self,X,y):\n", 55 | " X_train = X\n", 56 | " y_train = y\n", 57 | "\n", 58 | " categorical_values = []\n", 59 | "\n", 60 | " cat_subset = X_train.select_dtypes(include = ['object','category','bool'])\n", 61 | "\n", 62 | " for i in range(cat_subset.shape[1]):\n", 63 | " categorical_values.append(list(cat_subset.iloc[:,i].dropna().unique()))\n", 64 | "\n", 65 | " num_pipeline = Pipeline([\n", 66 | " ('cleaner',SimpleImputer()),\n", 67 | " ('scaler',StandardScaler())\n", 68 | " ])\n", 69 | "\n", 70 | " cat_pipeline = Pipeline([\n", 71 | " ('cleaner',SimpleImputer(strategy = 'most_frequent')),\n", 72 | " ('encoder',OneHotEncoder(sparse = False, categories=categorical_values))\n", 73 | " ])\n", 74 | "\n", 75 | "\n", 76 | " preprocessor = ColumnTransformer([\n", 77 | " ('numerical', num_pipeline, make_column_selector(dtype_exclude=['object','category','bool'])),\n", 78 | " ('categorical', cat_pipeline, make_column_selector(dtype_include=['object','category','bool']))\n", 79 | " ])\n", 80 | "\n", 81 | " model_pipeline_steps = []\n", 82 | " model_pipeline_steps.append(('preprocessor',preprocessor))\n", 83 | " model_pipeline_steps.append(('feature_selector',SelectKBest(f_classif,k='all')))\n", 84 | " model_pipeline_steps.append(('estimator',LogisticRegression()))\n", 85 | " model_pipeline = Pipeline(model_pipeline_steps)\n", 86 | "\n", 87 | " total_features = preprocessor.fit_transform(X_train).shape[1]\n", 88 | "\n", 89 | " optimization_grid = []\n", 90 | "\n", 91 | " # Logistic regression\n", 92 | " optimization_grid.append({\n", 93 | " 'preprocessor__numerical__scaler':[RobustScaler(),StandardScaler(),MinMaxScaler()],\n", 94 | " 'preprocessor__numerical__cleaner__strategy':['mean','median'],\n", 95 | " 'feature_selector__k': list(np.arange(1,total_features,5)) + ['all'],\n", 96 | " 'estimator':[LogisticRegression()]\n", 97 | " })\n", 98 | "\n", 99 | " # K-nearest neighbors\n", 100 | " optimization_grid.append({\n", 101 | " 'preprocessor__numerical__scaler':[RobustScaler(),StandardScaler(),MinMaxScaler()],\n", 102 | " 'preprocessor__numerical__cleaner__strategy':['mean','median'],\n", 103 | " 'feature_selector__k': list(np.arange(1,total_features,5)) + ['all'],\n", 104 | " 'estimator':[KNeighborsClassifier()],\n", 105 | " 'estimator__weights':['uniform','distance'],\n", 106 | " 'estimator__n_neighbors':np.arange(1,20,1)\n", 107 | " })\n", 108 | "\n", 109 | " # Random Forest\n", 110 | " optimization_grid.append({\n", 111 | " 'preprocessor__numerical__scaler':[None],\n", 112 | " 'preprocessor__numerical__cleaner__strategy':['mean','median'],\n", 113 | " 'feature_selector__k': list(np.arange(1,total_features,5)) + ['all'],\n", 114 | " 'estimator':[RandomForestClassifier(random_state=0)],\n", 115 | " 'estimator__n_estimators':np.arange(5,500,10),\n", 116 | " 'estimator__criterion':['gini','entropy']\n", 117 | " })\n", 118 | "\n", 119 | "\n", 120 | " # Gradient boosting\n", 121 | " optimization_grid.append({\n", 122 | " 'preprocessor__numerical__scaler':[None],\n", 123 | " 'preprocessor__numerical__cleaner__strategy':['mean','median'],\n", 124 | " 'feature_selector__k': list(np.arange(1,total_features,5)) + ['all'],\n", 125 | " 'estimator':[GradientBoostingClassifier(random_state=0)],\n", 126 | " 'estimator__n_estimators':np.arange(5,500,10),\n", 127 | " 'estimator__learning_rate':np.linspace(0.1,0.9,20),\n", 128 | " })\n", 129 | "\n", 130 | "\n", 131 | "\n", 132 | " # Decision tree\n", 133 | " optimization_grid.append({\n", 134 | " 'preprocessor__numerical__scaler':[None],\n", 135 | " 'preprocessor__numerical__cleaner__strategy':['mean','median'],\n", 136 | " 'feature_selector__k': list(np.arange(1,total_features,5)) + ['all'],\n", 137 | " 'estimator':[DecisionTreeClassifier(random_state=0)],\n", 138 | " 'estimator__criterion':['gini','entropy']\n", 139 | " })\n", 140 | "\n", 141 | " # Linear SVM\n", 142 | " optimization_grid.append({\n", 143 | " 'preprocessor__numerical__scaler':[RobustScaler(),StandardScaler(),MinMaxScaler()],\n", 144 | " 'preprocessor__numerical__cleaner__strategy':['mean','median'],\n", 145 | " 'feature_selector__k': list(np.arange(1,total_features,5)) + ['all'],\n", 146 | " 'estimator':[LinearSVC(random_state = 0)],\n", 147 | " 'estimator__C': np.arange(0.1,1,0.1),\n", 148 | " \n", 149 | " })\n", 150 | "\n", 151 | " search = RandomizedSearchCV(\n", 152 | " model_pipeline,\n", 153 | " optimization_grid,\n", 154 | " n_iter=self.n_iter,\n", 155 | " scoring = self.scoring_function, \n", 156 | " n_jobs = -1, \n", 157 | " random_state = 0, \n", 158 | " verbose = 3,\n", 159 | " cv = 5\n", 160 | " )\n", 161 | "\n", 162 | " search.fit(X_train, y_train)\n", 163 | " self.best_estimator_ = search.best_estimator_\n", 164 | " self.best_pipeline = search.best_params_\n", 165 | " \n", 166 | "\n", 167 | " \n", 168 | " def predict(self,X,y = None):\n", 169 | " return self.best_estimator_.predict(X)\n", 170 | "\n", 171 | " def predict_proba(self,X,y = None):\n", 172 | " return self.best_estimator_.predict_proba(X)" 173 | ], 174 | "execution_count": 32, 175 | "outputs": [] 176 | }, 177 | { 178 | "cell_type": "code", 179 | "metadata": { 180 | "id": "yIJERMw9FPtf" 181 | }, 182 | "source": [ 183 | "d = load_breast_cancer()\n", 184 | "y = d['target']\n", 185 | "X = pd.DataFrame(d['data'],columns = d['feature_names'])\n", 186 | "\n", 187 | "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42)\n", 188 | "\n", 189 | "model = MyAutoMLClassifier()\n", 190 | "model.fit(X_train,y_train)" 191 | ], 192 | "execution_count": 33, 193 | "outputs": [] 194 | }, 195 | { 196 | "cell_type": "code", 197 | "metadata": { 198 | "id": "_fR1Xa8H-TzW", 199 | "colab": { 200 | "base_uri": "https://localhost:8080/" 201 | }, 202 | "outputId": "0379f05e-5607-4061-f30b-a939254a845f" 203 | }, 204 | "source": [ 205 | "balanced_accuracy_score(y_test, model.predict(X_test))" 206 | ], 207 | "execution_count": 37, 208 | "outputs": [ 209 | { 210 | "output_type": "execute_result", 211 | "data": { 212 | "text/plain": [ 213 | "0.9428271863821389" 214 | ] 215 | }, 216 | "metadata": { 217 | "tags": [] 218 | }, 219 | "execution_count": 37 220 | } 221 | ] 222 | }, 223 | { 224 | "cell_type": "code", 225 | "metadata": { 226 | "id": "UQjT-9OE_c-L", 227 | "colab": { 228 | "base_uri": "https://localhost:8080/" 229 | }, 230 | "outputId": "ca94334f-d9eb-4447-9dd5-653bfa0adff3" 231 | }, 232 | "source": [ 233 | "model.best_pipeline" 234 | ], 235 | "execution_count": 38, 236 | "outputs": [ 237 | { 238 | "output_type": "execute_result", 239 | "data": { 240 | "text/plain": [ 241 | "{'estimator': GradientBoostingClassifier(ccp_alpha=0.0, criterion='friedman_mse', init=None,\n", 242 | " learning_rate=0.1, loss='deviance', max_depth=3,\n", 243 | " max_features=None, max_leaf_nodes=None,\n", 244 | " min_impurity_decrease=0.0, min_impurity_split=None,\n", 245 | " min_samples_leaf=1, min_samples_split=2,\n", 246 | " min_weight_fraction_leaf=0.0, n_estimators=125,\n", 247 | " n_iter_no_change=None, presort='deprecated',\n", 248 | " random_state=0, subsample=1.0, tol=0.0001,\n", 249 | " validation_fraction=0.1, verbose=0,\n", 250 | " warm_start=False),\n", 251 | " 'estimator__learning_rate': 0.1,\n", 252 | " 'estimator__n_estimators': 125,\n", 253 | " 'feature_selector__k': 'all',\n", 254 | " 'preprocessor__numerical__cleaner__strategy': 'median',\n", 255 | " 'preprocessor__numerical__scaler': None}" 256 | ] 257 | }, 258 | "metadata": { 259 | "tags": [] 260 | }, 261 | "execution_count": 38 262 | } 263 | ] 264 | }, 265 | { 266 | "cell_type": "code", 267 | "metadata": { 268 | "id": "9iFNVZjeACCv" 269 | }, 270 | "source": [ 271 | "" 272 | ], 273 | "execution_count": null, 274 | "outputs": [] 275 | } 276 | ] 277 | } -------------------------------------------------------------------------------- /Grid_search_and_random_search.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "nbformat": 4, 3 | "nbformat_minor": 0, 4 | "metadata": { 5 | "colab": { 6 | "name": "Grid search and random search.ipynb", 7 | "provenance": [], 8 | "authorship_tag": "ABX9TyOQO6uVD2Sp+a9ND0Th2m6s", 9 | "include_colab_link": true 10 | }, 11 | "kernelspec": { 12 | "name": "python3", 13 | "display_name": "Python 3" 14 | }, 15 | "language_info": { 16 | "name": "python" 17 | } 18 | }, 19 | "cells": [ 20 | { 21 | "cell_type": "markdown", 22 | "metadata": { 23 | "id": "view-in-github", 24 | "colab_type": "text" 25 | }, 26 | "source": [ 27 | "\"Open" 28 | ] 29 | }, 30 | { 31 | "cell_type": "code", 32 | "metadata": { 33 | "id": "STKneFuLKwr9" 34 | }, 35 | "source": [ 36 | "from sklearn.datasets import load_diabetes\n", 37 | "from sklearn.model_selection import GridSearchCV, RandomizedSearchCV, train_test_split\n", 38 | "from sklearn.ensemble import RandomForestRegressor\n", 39 | "import numpy as np" 40 | ], 41 | "execution_count": 4, 42 | "outputs": [] 43 | }, 44 | { 45 | "cell_type": "code", 46 | "metadata": { 47 | "id": "IZtjhe61K_su" 48 | }, 49 | "source": [ 50 | "X,y = load_diabetes(return_X_y=True)" 51 | ], 52 | "execution_count": 2, 53 | "outputs": [] 54 | }, 55 | { 56 | "cell_type": "code", 57 | "metadata": { 58 | "id": "21FNqq7oLBf2" 59 | }, 60 | "source": [ 61 | "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42)" 62 | ], 63 | "execution_count": 3, 64 | "outputs": [] 65 | }, 66 | { 67 | "cell_type": "code", 68 | "metadata": { 69 | "colab": { 70 | "base_uri": "https://localhost:8080/" 71 | }, 72 | "id": "TQHJqViqLEn3", 73 | "outputId": "83e6de7c-84b1-4683-aafd-b8e49610c889" 74 | }, 75 | "source": [ 76 | "grid_search = GridSearchCV(RandomForestRegressor(random_state=0),\n", 77 | " {\n", 78 | " 'n_estimators':np.arange(5,100,5),\n", 79 | " 'max_features':np.arange(0.1,1.0,0.05),\n", 80 | " \n", 81 | " },cv=5, scoring=\"r2\",verbose=1,n_jobs=-1\n", 82 | " )\n", 83 | "grid_search.fit(X_train,y_train)" 84 | ], 85 | "execution_count": 6, 86 | "outputs": [ 87 | { 88 | "output_type": "stream", 89 | "text": [ 90 | "Fitting 5 folds for each of 342 candidates, totalling 1710 fits\n" 91 | ], 92 | "name": "stdout" 93 | }, 94 | { 95 | "output_type": "stream", 96 | "text": [ 97 | "[Parallel(n_jobs=-1)]: Using backend LokyBackend with 2 concurrent workers.\n", 98 | "[Parallel(n_jobs=-1)]: Done 128 tasks | elapsed: 7.6s\n", 99 | "[Parallel(n_jobs=-1)]: Done 728 tasks | elapsed: 46.5s\n", 100 | "[Parallel(n_jobs=-1)]: Done 1710 out of 1710 | elapsed: 2.0min finished\n" 101 | ], 102 | "name": "stderr" 103 | }, 104 | { 105 | "output_type": "execute_result", 106 | "data": { 107 | "text/plain": [ 108 | "GridSearchCV(cv=5, error_score=nan,\n", 109 | " estimator=RandomForestRegressor(bootstrap=True, ccp_alpha=0.0,\n", 110 | " criterion='mse', max_depth=None,\n", 111 | " max_features='auto',\n", 112 | " max_leaf_nodes=None,\n", 113 | " max_samples=None,\n", 114 | " min_impurity_decrease=0.0,\n", 115 | " min_impurity_split=None,\n", 116 | " min_samples_leaf=1,\n", 117 | " min_samples_split=2,\n", 118 | " min_weight_fraction_leaf=0.0,\n", 119 | " n_estimators=100, n_jobs=None,\n", 120 | " oob_score=False, random_state=0,\n", 121 | " verbose=0, warm_start=False),\n", 122 | " iid='deprecated', n_jobs=-1,\n", 123 | " param_grid={'max_features': array([0.1 , 0.15, 0.2 , 0.25, 0.3 , 0.35, 0.4 , 0.45, 0.5 , 0.55, 0.6 ,\n", 124 | " 0.65, 0.7 , 0.75, 0.8 , 0.85, 0.9 , 0.95]),\n", 125 | " 'n_estimators': array([ 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85,\n", 126 | " 90, 95])},\n", 127 | " pre_dispatch='2*n_jobs', refit=True, return_train_score=False,\n", 128 | " scoring='r2', verbose=1)" 129 | ] 130 | }, 131 | "metadata": { 132 | "tags": [] 133 | }, 134 | "execution_count": 6 135 | } 136 | ] 137 | }, 138 | { 139 | "cell_type": "code", 140 | "metadata": { 141 | "colab": { 142 | "base_uri": "https://localhost:8080/" 143 | }, 144 | "id": "_Mf5r9tRL6DT", 145 | "outputId": "e6f81ce7-cb95-4489-99e8-160643eb5d61" 146 | }, 147 | "source": [ 148 | "grid_search.best_params_" 149 | ], 150 | "execution_count": 7, 151 | "outputs": [ 152 | { 153 | "output_type": "execute_result", 154 | "data": { 155 | "text/plain": [ 156 | "{'max_features': 0.5000000000000001, 'n_estimators': 90}" 157 | ] 158 | }, 159 | "metadata": { 160 | "tags": [] 161 | }, 162 | "execution_count": 7 163 | } 164 | ] 165 | }, 166 | { 167 | "cell_type": "code", 168 | "metadata": { 169 | "colab": { 170 | "base_uri": "https://localhost:8080/" 171 | }, 172 | "id": "fTVYMK4PL8RS", 173 | "outputId": "ec4da40f-a6e6-4733-f5fb-4a794a3c9340" 174 | }, 175 | "source": [ 176 | "grid_search.best_score_" 177 | ], 178 | "execution_count": 8, 179 | "outputs": [ 180 | { 181 | "output_type": "execute_result", 182 | "data": { 183 | "text/plain": [ 184 | "0.4153440140065655" 185 | ] 186 | }, 187 | "metadata": { 188 | "tags": [] 189 | }, 190 | "execution_count": 8 191 | } 192 | ] 193 | }, 194 | { 195 | "cell_type": "code", 196 | "metadata": { 197 | "colab": { 198 | "base_uri": "https://localhost:8080/" 199 | }, 200 | "id": "hegQ2NlZLlp8", 201 | "outputId": "b60f0b43-8440-46f1-d0c7-0216105b9566" 202 | }, 203 | "source": [ 204 | "random_search = RandomizedSearchCV(RandomForestRegressor(random_state=0),\n", 205 | " {\n", 206 | " 'n_estimators':np.arange(5,100,5),\n", 207 | " 'max_features':np.arange(0.1,1.0,0.05),\n", 208 | " },cv=5, scoring=\"r2\",verbose=1,n_jobs=-1, n_iter=50, random_state = 0\n", 209 | " )\n", 210 | "random_search.fit(X_train,y_train)" 211 | ], 212 | "execution_count": 9, 213 | "outputs": [ 214 | { 215 | "output_type": "stream", 216 | "text": [ 217 | "Fitting 5 folds for each of 50 candidates, totalling 250 fits\n" 218 | ], 219 | "name": "stdout" 220 | }, 221 | { 222 | "output_type": "stream", 223 | "text": [ 224 | "[Parallel(n_jobs=-1)]: Using backend LokyBackend with 2 concurrent workers.\n", 225 | "[Parallel(n_jobs=-1)]: Done 54 tasks | elapsed: 4.8s\n", 226 | "[Parallel(n_jobs=-1)]: Done 250 out of 250 | elapsed: 20.3s finished\n" 227 | ], 228 | "name": "stderr" 229 | }, 230 | { 231 | "output_type": "execute_result", 232 | "data": { 233 | "text/plain": [ 234 | "RandomizedSearchCV(cv=5, error_score=nan,\n", 235 | " estimator=RandomForestRegressor(bootstrap=True,\n", 236 | " ccp_alpha=0.0,\n", 237 | " criterion='mse',\n", 238 | " max_depth=None,\n", 239 | " max_features='auto',\n", 240 | " max_leaf_nodes=None,\n", 241 | " max_samples=None,\n", 242 | " min_impurity_decrease=0.0,\n", 243 | " min_impurity_split=None,\n", 244 | " min_samples_leaf=1,\n", 245 | " min_samples_split=2,\n", 246 | " min_weight_fraction_leaf=0.0,\n", 247 | " n_estimators=100,\n", 248 | " n_jobs=None, oob_score=Fals...\n", 249 | " warm_start=False),\n", 250 | " iid='deprecated', n_iter=50, n_jobs=-1,\n", 251 | " param_distributions={'max_features': array([0.1 , 0.15, 0.2 , 0.25, 0.3 , 0.35, 0.4 , 0.45, 0.5 , 0.55, 0.6 ,\n", 252 | " 0.65, 0.7 , 0.75, 0.8 , 0.85, 0.9 , 0.95]),\n", 253 | " 'n_estimators': array([ 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85,\n", 254 | " 90, 95])},\n", 255 | " pre_dispatch='2*n_jobs', random_state=0, refit=True,\n", 256 | " return_train_score=False, scoring='r2', verbose=1)" 257 | ] 258 | }, 259 | "metadata": { 260 | "tags": [] 261 | }, 262 | "execution_count": 9 263 | } 264 | ] 265 | }, 266 | { 267 | "cell_type": "code", 268 | "metadata": { 269 | "colab": { 270 | "base_uri": "https://localhost:8080/" 271 | }, 272 | "id": "UYP8IsUbL_se", 273 | "outputId": "7cb253d5-cf6e-4319-e62b-48eaa74851f8" 274 | }, 275 | "source": [ 276 | "random_search.best_params_" 277 | ], 278 | "execution_count": 10, 279 | "outputs": [ 280 | { 281 | "output_type": "execute_result", 282 | "data": { 283 | "text/plain": [ 284 | "{'max_features': 0.5500000000000002, 'n_estimators': 95}" 285 | ] 286 | }, 287 | "metadata": { 288 | "tags": [] 289 | }, 290 | "execution_count": 10 291 | } 292 | ] 293 | }, 294 | { 295 | "cell_type": "code", 296 | "metadata": { 297 | "colab": { 298 | "base_uri": "https://localhost:8080/" 299 | }, 300 | "id": "anPLW1r6MCaG", 301 | "outputId": "d0920356-253c-49d2-b350-84ebc4134d03" 302 | }, 303 | "source": [ 304 | "random_search.best_score_" 305 | ], 306 | "execution_count": 11, 307 | "outputs": [ 308 | { 309 | "output_type": "execute_result", 310 | "data": { 311 | "text/plain": [ 312 | "0.41479921526675173" 313 | ] 314 | }, 315 | "metadata": { 316 | "tags": [] 317 | }, 318 | "execution_count": 11 319 | } 320 | ] 321 | }, 322 | { 323 | "cell_type": "code", 324 | "metadata": { 325 | "id": "M0CNcevAMDxm" 326 | }, 327 | "source": [ 328 | "" 329 | ], 330 | "execution_count": null, 331 | "outputs": [] 332 | } 333 | ] 334 | } -------------------------------------------------------------------------------- /Feature_selection_via_grid_search_in_supervised_models.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "nbformat": 4, 3 | "nbformat_minor": 0, 4 | "metadata": { 5 | "colab": { 6 | "name": "Feature selection via grid search in supervised models", 7 | "provenance": [], 8 | "authorship_tag": "ABX9TyOTWlfg2XQqvTfhXoKmUvmU" 9 | }, 10 | "kernelspec": { 11 | "name": "python3", 12 | "display_name": "Python 3" 13 | } 14 | }, 15 | "cells": [ 16 | { 17 | "cell_type": "code", 18 | "metadata": { 19 | "id": "fpMJg9DIqyOX", 20 | "colab_type": "code", 21 | "colab": {} 22 | }, 23 | "source": [ 24 | "import numpy as np\n", 25 | "from sklearn.datasets import load_boston\n", 26 | "from sklearn.feature_selection import SelectKBest,f_regression\n", 27 | "from sklearn.pipeline import Pipeline\n", 28 | "from sklearn.linear_model import LinearRegression\n", 29 | "from sklearn.neighbors import KNeighborsRegressor\n", 30 | "from sklearn.preprocessing import StandardScaler\n", 31 | "from sklearn.ensemble import RandomForestRegressor\n", 32 | "from sklearn.model_selection import GridSearchCV\n", 33 | "from sklearn.metrics import mean_squared_error" 34 | ], 35 | "execution_count": 0, 36 | "outputs": [] 37 | }, 38 | { 39 | "cell_type": "markdown", 40 | "metadata": { 41 | "id": "LGkBrLPGsbUX", 42 | "colab_type": "text" 43 | }, 44 | "source": [ 45 | "# Data loading" 46 | ] 47 | }, 48 | { 49 | "cell_type": "code", 50 | "metadata": { 51 | "id": "LP6xdkXWsGw6", 52 | "colab_type": "code", 53 | "colab": {} 54 | }, 55 | "source": [ 56 | "data,target = load_boston(return_X_y=True)" 57 | ], 58 | "execution_count": 0, 59 | "outputs": [] 60 | }, 61 | { 62 | "cell_type": "markdown", 63 | "metadata": { 64 | "id": "bvYfKpbduElz", 65 | "colab_type": "text" 66 | }, 67 | "source": [ 68 | "# Pipeline definition" 69 | ] 70 | }, 71 | { 72 | "cell_type": "code", 73 | "metadata": { 74 | "id": "WuLRz6g6sfCa", 75 | "colab_type": "code", 76 | "colab": {} 77 | }, 78 | "source": [ 79 | "pipeline = Pipeline(\n", 80 | " [\n", 81 | " ('selector',SelectKBest(f_regression)),\n", 82 | " ('model',LinearRegression())\n", 83 | " ]\n", 84 | ")" 85 | ], 86 | "execution_count": 0, 87 | "outputs": [] 88 | }, 89 | { 90 | "cell_type": "markdown", 91 | "metadata": { 92 | "id": "aPxDM9Rcub7W", 93 | "colab_type": "text" 94 | }, 95 | "source": [ 96 | "# Grid Search with cross-validation for linear regression" 97 | ] 98 | }, 99 | { 100 | "cell_type": "markdown", 101 | "metadata": { 102 | "id": "QRnjUdsWwgYJ", 103 | "colab_type": "text" 104 | }, 105 | "source": [ 106 | "Defining grid search parameters." 107 | ] 108 | }, 109 | { 110 | "cell_type": "code", 111 | "metadata": { 112 | "id": "h7nyD1Biua-8", 113 | "colab_type": "code", 114 | "colab": {} 115 | }, 116 | "source": [ 117 | "search = GridSearchCV(\n", 118 | " estimator = pipeline,\n", 119 | " param_grid = {'selector__k':[3,4,5,6,7,8,9,10]},\n", 120 | " n_jobs=-1,\n", 121 | " scoring=\"neg_mean_squared_error\",\n", 122 | " cv=5,\n", 123 | " verbose=3\n", 124 | "\n", 125 | " )" 126 | ], 127 | "execution_count": 0, 128 | "outputs": [] 129 | }, 130 | { 131 | "cell_type": "markdown", 132 | "metadata": { 133 | "id": "ZcOxTYwfwk6W", 134 | "colab_type": "text" 135 | }, 136 | "source": [ 137 | "Performing grid search over the specified parameters." 138 | ] 139 | }, 140 | { 141 | "cell_type": "code", 142 | "metadata": { 143 | "id": "NTGJf0suv6Km", 144 | "colab_type": "code", 145 | "outputId": "48bdc9a2-a2f5-498a-8fd1-090319bc83c8", 146 | "colab": { 147 | "base_uri": "https://localhost:8080/", 148 | "height": 323 149 | } 150 | }, 151 | "source": [ 152 | "search.fit(data,target)" 153 | ], 154 | "execution_count": 0, 155 | "outputs": [ 156 | { 157 | "output_type": "stream", 158 | "text": [ 159 | "Fitting 5 folds for each of 8 candidates, totalling 40 fits\n" 160 | ], 161 | "name": "stdout" 162 | }, 163 | { 164 | "output_type": "stream", 165 | "text": [ 166 | "[Parallel(n_jobs=-1)]: Using backend LokyBackend with 2 concurrent workers.\n", 167 | "[Parallel(n_jobs=-1)]: Done 40 out of 40 | elapsed: 1.2s finished\n" 168 | ], 169 | "name": "stderr" 170 | }, 171 | { 172 | "output_type": "execute_result", 173 | "data": { 174 | "text/plain": [ 175 | "GridSearchCV(cv=5, error_score=nan,\n", 176 | " estimator=Pipeline(memory=None,\n", 177 | " steps=[('selector',\n", 178 | " SelectKBest(k=10,\n", 179 | " score_func=)),\n", 180 | " ('model',\n", 181 | " LinearRegression(copy_X=True,\n", 182 | " fit_intercept=True,\n", 183 | " n_jobs=None,\n", 184 | " normalize=False))],\n", 185 | " verbose=False),\n", 186 | " iid='deprecated', n_jobs=-1,\n", 187 | " param_grid={'selector__k': [3, 4, 5, 6, 7, 8, 9, 10]},\n", 188 | " pre_dispatch='2*n_jobs', refit=True, return_train_score=False,\n", 189 | " scoring='neg_mean_squared_error', verbose=3)" 190 | ] 191 | }, 192 | "metadata": { 193 | "tags": [] 194 | }, 195 | "execution_count": 5 196 | } 197 | ] 198 | }, 199 | { 200 | "cell_type": "markdown", 201 | "metadata": { 202 | "id": "0iZWFL7SxCzm", 203 | "colab_type": "text" 204 | }, 205 | "source": [ 206 | "The best value for *k* is:" 207 | ] 208 | }, 209 | { 210 | "cell_type": "code", 211 | "metadata": { 212 | "id": "MGRB8u85wDXK", 213 | "colab_type": "code", 214 | "outputId": "41811e04-026d-4229-bed6-85c523d29b72", 215 | "colab": { 216 | "base_uri": "https://localhost:8080/", 217 | "height": 34 218 | } 219 | }, 220 | "source": [ 221 | "search.best_params_" 222 | ], 223 | "execution_count": 0, 224 | "outputs": [ 225 | { 226 | "output_type": "execute_result", 227 | "data": { 228 | "text/plain": [ 229 | "{'selector__k': 3}" 230 | ] 231 | }, 232 | "metadata": { 233 | "tags": [] 234 | }, 235 | "execution_count": 6 236 | } 237 | ] 238 | }, 239 | { 240 | "cell_type": "markdown", 241 | "metadata": { 242 | "id": "S8NxRkDnxGHv", 243 | "colab_type": "text" 244 | }, 245 | "source": [ 246 | "The best score achieved is:" 247 | ] 248 | }, 249 | { 250 | "cell_type": "code", 251 | "metadata": { 252 | "id": "_EtvKFTQwHf_", 253 | "colab_type": "code", 254 | "outputId": "01fd177c-e115-4306-9c63-07c90641737d", 255 | "colab": { 256 | "base_uri": "https://localhost:8080/", 257 | "height": 34 258 | } 259 | }, 260 | "source": [ 261 | "search.best_score_" 262 | ], 263 | "execution_count": 0, 264 | "outputs": [ 265 | { 266 | "output_type": "execute_result", 267 | "data": { 268 | "text/plain": [ 269 | "-36.4236890153343" 270 | ] 271 | }, 272 | "metadata": { 273 | "tags": [] 274 | }, 275 | "execution_count": 7 276 | } 277 | ] 278 | }, 279 | { 280 | "cell_type": "markdown", 281 | "metadata": { 282 | "id": "vvQlLGXV0i8F", 283 | "colab_type": "text" 284 | }, 285 | "source": [ 286 | "# Grid search with cross-validation for Random Forest Regressor" 287 | ] 288 | }, 289 | { 290 | "cell_type": "code", 291 | "metadata": { 292 | "id": "q_okg7w_0xdv", 293 | "colab_type": "code", 294 | "colab": {} 295 | }, 296 | "source": [ 297 | "pipeline = Pipeline(\n", 298 | " [\n", 299 | " ('selector',SelectKBest(f_regression)),\n", 300 | " ('model',RandomForestRegressor(random_state = 0))\n", 301 | " ]\n", 302 | ")" 303 | ], 304 | "execution_count": 0, 305 | "outputs": [] 306 | }, 307 | { 308 | "cell_type": "code", 309 | "metadata": { 310 | "id": "jXxlQDwUweD0", 311 | "colab_type": "code", 312 | "colab": {} 313 | }, 314 | "source": [ 315 | "search = GridSearchCV(\n", 316 | " estimator = pipeline,\n", 317 | " param_grid = {'selector__k':[3,4,5,6,7,8,9,10] , 'model__n_estimators':np.arange(10,200,10) },\n", 318 | " n_jobs=-1,\n", 319 | " scoring=\"neg_mean_squared_error\",\n", 320 | " cv=5,\n", 321 | " verbose=3\n", 322 | "\n", 323 | " )" 324 | ], 325 | "execution_count": 0, 326 | "outputs": [] 327 | }, 328 | { 329 | "cell_type": "code", 330 | "metadata": { 331 | "id": "XSD6zprr0vFu", 332 | "colab_type": "code", 333 | "outputId": "9bc8c84a-72cb-41c2-82d1-75257f8ecc75", 334 | "colab": { 335 | "base_uri": "https://localhost:8080/", 336 | "height": 578 337 | } 338 | }, 339 | "source": [ 340 | "search.fit(data,target)" 341 | ], 342 | "execution_count": 0, 343 | "outputs": [ 344 | { 345 | "output_type": "stream", 346 | "text": [ 347 | "[Parallel(n_jobs=-1)]: Using backend LokyBackend with 2 concurrent workers.\n" 348 | ], 349 | "name": "stderr" 350 | }, 351 | { 352 | "output_type": "stream", 353 | "text": [ 354 | "Fitting 5 folds for each of 152 candidates, totalling 760 fits\n" 355 | ], 356 | "name": "stdout" 357 | }, 358 | { 359 | "output_type": "stream", 360 | "text": [ 361 | "[Parallel(n_jobs=-1)]: Done 92 tasks | elapsed: 3.2s\n", 362 | "[Parallel(n_jobs=-1)]: Done 338 tasks | elapsed: 30.2s\n", 363 | "[Parallel(n_jobs=-1)]: Done 498 tasks | elapsed: 1.0min\n", 364 | "[Parallel(n_jobs=-1)]: Done 722 tasks | elapsed: 2.1min\n", 365 | "[Parallel(n_jobs=-1)]: Done 760 out of 760 | elapsed: 2.4min finished\n" 366 | ], 367 | "name": "stderr" 368 | }, 369 | { 370 | "output_type": "execute_result", 371 | "data": { 372 | "text/plain": [ 373 | "GridSearchCV(cv=5, error_score=nan,\n", 374 | " estimator=Pipeline(memory=None,\n", 375 | " steps=[('selector',\n", 376 | " SelectKBest(k=10,\n", 377 | " score_func=)),\n", 378 | " ('model',\n", 379 | " RandomForestRegressor(bootstrap=True,\n", 380 | " ccp_alpha=0.0,\n", 381 | " criterion='mse',\n", 382 | " max_depth=None,\n", 383 | " max_features='auto',\n", 384 | " max_leaf_nodes=None,\n", 385 | " max_samples=None,\n", 386 | " min_impurity_decrease=0.0,\n", 387 | " min_impurity_split=None...\n", 388 | " oob_score=False,\n", 389 | " random_state=0,\n", 390 | " verbose=0,\n", 391 | " warm_start=False))],\n", 392 | " verbose=False),\n", 393 | " iid='deprecated', n_jobs=-1,\n", 394 | " param_grid={'model__n_estimators': array([ 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130,\n", 395 | " 140, 150, 160, 170, 180, 190]),\n", 396 | " 'selector__k': [3, 4, 5, 6, 7, 8, 9, 10]},\n", 397 | " pre_dispatch='2*n_jobs', refit=True, return_train_score=False,\n", 398 | " scoring='neg_mean_squared_error', verbose=3)" 399 | ] 400 | }, 401 | "metadata": { 402 | "tags": [] 403 | }, 404 | "execution_count": 10 405 | } 406 | ] 407 | }, 408 | { 409 | "cell_type": "code", 410 | "metadata": { 411 | "id": "jMZCRTjR0-fi", 412 | "colab_type": "code", 413 | "outputId": "b319785d-77cd-425e-9d57-086f2bc10cd9", 414 | "colab": { 415 | "base_uri": "https://localhost:8080/", 416 | "height": 34 417 | } 418 | }, 419 | "source": [ 420 | "search.best_params_" 421 | ], 422 | "execution_count": 0, 423 | "outputs": [ 424 | { 425 | "output_type": "execute_result", 426 | "data": { 427 | "text/plain": [ 428 | "{'model__n_estimators': 110, 'selector__k': 6}" 429 | ] 430 | }, 431 | "metadata": { 432 | "tags": [] 433 | }, 434 | "execution_count": 11 435 | } 436 | ] 437 | }, 438 | { 439 | "cell_type": "code", 440 | "metadata": { 441 | "id": "LsGilVty1EuG", 442 | "colab_type": "code", 443 | "outputId": "f1158541-c3c6-4bef-9be0-4410357cbf72", 444 | "colab": { 445 | "base_uri": "https://localhost:8080/", 446 | "height": 34 447 | } 448 | }, 449 | "source": [ 450 | "search.best_score_" 451 | ], 452 | "execution_count": 0, 453 | "outputs": [ 454 | { 455 | "output_type": "execute_result", 456 | "data": { 457 | "text/plain": [ 458 | "-22.170138432624004" 459 | ] 460 | }, 461 | "metadata": { 462 | "tags": [] 463 | }, 464 | "execution_count": 12 465 | } 466 | ] 467 | } 468 | ] 469 | } -------------------------------------------------------------------------------- /Candlesticks.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "nbformat": 4, 3 | "nbformat_minor": 0, 4 | "metadata": { 5 | "colab": { 6 | "name": "Candlesticks.ipynb", 7 | "provenance": [], 8 | "authorship_tag": "ABX9TyOLZTfFRZzu++sSs7IF1QaW" 9 | }, 10 | "kernelspec": { 11 | "name": "python3", 12 | "display_name": "Python 3" 13 | } 14 | }, 15 | "cells": [ 16 | { 17 | "cell_type": "code", 18 | "metadata": { 19 | "id": "fqWPj5KM95ZH", 20 | "outputId": "d64775b0-87c6-4ce9-de90-8f894b1477cc", 21 | "colab": { 22 | "base_uri": "https://localhost:8080/" 23 | } 24 | }, 25 | "source": [ 26 | "!pip install yfinance" 27 | ], 28 | "execution_count": 49, 29 | "outputs": [ 30 | { 31 | "output_type": "stream", 32 | "text": [ 33 | "Requirement already satisfied: yfinance in /usr/local/lib/python3.6/dist-packages (0.1.55)\n", 34 | "Requirement already satisfied: lxml>=4.5.1 in /usr/local/lib/python3.6/dist-packages (from yfinance) (4.6.1)\n", 35 | "Requirement already satisfied: requests>=2.20 in /usr/local/lib/python3.6/dist-packages (from yfinance) (2.23.0)\n", 36 | "Requirement already satisfied: numpy>=1.15 in /usr/local/lib/python3.6/dist-packages (from yfinance) (1.18.5)\n", 37 | "Requirement already satisfied: multitasking>=0.0.7 in /usr/local/lib/python3.6/dist-packages (from yfinance) (0.0.9)\n", 38 | "Requirement already satisfied: pandas>=0.24 in /usr/local/lib/python3.6/dist-packages (from yfinance) (1.1.3)\n", 39 | "Requirement already satisfied: chardet<4,>=3.0.2 in /usr/local/lib/python3.6/dist-packages (from requests>=2.20->yfinance) (3.0.4)\n", 40 | "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.6/dist-packages (from requests>=2.20->yfinance) (2020.6.20)\n", 41 | "Requirement already satisfied: idna<3,>=2.5 in /usr/local/lib/python3.6/dist-packages (from requests>=2.20->yfinance) (2.10)\n", 42 | "Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /usr/local/lib/python3.6/dist-packages (from requests>=2.20->yfinance) (1.24.3)\n", 43 | "Requirement already satisfied: python-dateutil>=2.7.3 in /usr/local/lib/python3.6/dist-packages (from pandas>=0.24->yfinance) (2.8.1)\n", 44 | "Requirement already satisfied: pytz>=2017.2 in /usr/local/lib/python3.6/dist-packages (from pandas>=0.24->yfinance) (2018.9)\n", 45 | "Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.6/dist-packages (from python-dateutil>=2.7.3->pandas>=0.24->yfinance) (1.15.0)\n" 46 | ], 47 | "name": "stdout" 48 | } 49 | ] 50 | }, 51 | { 52 | "cell_type": "code", 53 | "metadata": { 54 | "id": "YypFoEHY98BW" 55 | }, 56 | "source": [ 57 | "import pandas as pd\n", 58 | "import yfinance" 59 | ], 60 | "execution_count": 50, 61 | "outputs": [] 62 | }, 63 | { 64 | "cell_type": "code", 65 | "metadata": { 66 | "id": "UWKF9JsQ995x" 67 | }, 68 | "source": [ 69 | "ticker = yfinance.Ticker(\"SPY\")\n", 70 | "df = ticker.history(period = '5mo')" 71 | ], 72 | "execution_count": 51, 73 | "outputs": [] 74 | }, 75 | { 76 | "cell_type": "code", 77 | "metadata": { 78 | "id": "ylebwMCT-KBG" 79 | }, 80 | "source": [ 81 | "for i in range(2,df.shape[0]):\n", 82 | " current = df.iloc[i,:]\n", 83 | " prev = df.iloc[i-1,:]\n", 84 | " prev_2 = df.iloc[i-2,:]\n", 85 | "\n", 86 | " realbody = abs(current['Open'] - current['Close'])\n", 87 | " candle_range = current['High'] - current['Low']\n", 88 | "\n", 89 | " idx = df.index[i]\n", 90 | " \n", 91 | " # Bullish swing\n", 92 | " df.loc[idx,'Bullish swing'] = current['Low'] > prev['Low'] and prev['Low'] < prev_2['Low']\n", 93 | "\n", 94 | " # Bearish swing\n", 95 | " df.loc[idx,'Bearish swing'] = current['High'] < prev['High'] and prev['High'] > prev_2['High']\n", 96 | "\n", 97 | " # Bullish pinbar\n", 98 | " df.loc[idx,'Bullish pinbar'] = realbody <= candle_range/3 and min(current['Open'], current['Close']) > (current['High'] + current['Low'])/2 and current['Low'] < prev['Low']\n", 99 | "\n", 100 | " # Bearish pinbar\n", 101 | " df.loc[idx,'Bearish pinbar'] = realbody <= candle_range/3 and max(current['Open'] , current['Close']) < (current['High'] + current['Low'])/2 and current['High'] > prev['High']\n", 102 | " \n", 103 | " # Inside bar\n", 104 | " df.loc[idx,'Inside bar'] = current['High'] < prev['High'] and current['Low'] > prev['Low']\n", 105 | " \n", 106 | " # Outside bar\n", 107 | " df.loc[idx,'Outside bar'] = current['High'] > prev['High'] and current['Low'] < prev['Low']\n", 108 | " \n", 109 | " # Bullish engulfing\n", 110 | " df.loc[idx,'Bullish engulfing'] = current['High'] > prev['High'] and current['Low'] < prev['Low'] and realbody >= 0.8 * candle_range and current['Close'] > current['Open']\n", 111 | "\n", 112 | " # Bearish engulfing\n", 113 | " df.loc[idx,'Bearish engulfing'] = current['High'] > prev['High'] and current['Low'] < prev['Low'] and realbody >= 0.8 * candle_range and current['Close'] < current['Open']\n", 114 | "\n", 115 | "\n", 116 | "\n", 117 | "\n", 118 | "df.fillna(False, inplace=True)" 119 | ], 120 | "execution_count": 52, 121 | "outputs": [] 122 | }, 123 | { 124 | "cell_type": "code", 125 | "metadata": { 126 | "id": "B7Pv42Dl-b0n", 127 | "outputId": "2ff55586-aefd-468e-9866-da87ea9d289c", 128 | "colab": { 129 | "base_uri": "https://localhost:8080/", 130 | "height": 637 131 | } 132 | }, 133 | "source": [ 134 | "df" 135 | ], 136 | "execution_count": 53, 137 | "outputs": [ 138 | { 139 | "output_type": "execute_result", 140 | "data": { 141 | "text/html": [ 142 | "
\n", 143 | "\n", 156 | "\n", 157 | " \n", 158 | " \n", 159 | " \n", 160 | " \n", 161 | " \n", 162 | " \n", 163 | " \n", 164 | " \n", 165 | " \n", 166 | " \n", 167 | " \n", 168 | " \n", 169 | " \n", 170 | " \n", 171 | " \n", 172 | " \n", 173 | " \n", 174 | " \n", 175 | " \n", 176 | " \n", 177 | " \n", 178 | " \n", 179 | " \n", 180 | " \n", 181 | " \n", 182 | " \n", 183 | " \n", 184 | " \n", 185 | " \n", 186 | " \n", 187 | " \n", 188 | " \n", 189 | " \n", 190 | " \n", 191 | " \n", 192 | " \n", 193 | " \n", 194 | " \n", 195 | " \n", 196 | " \n", 197 | " \n", 198 | " \n", 199 | " \n", 200 | " \n", 201 | " \n", 202 | " \n", 203 | " \n", 204 | " \n", 205 | " \n", 206 | " \n", 207 | " \n", 208 | " \n", 209 | " \n", 210 | " \n", 211 | " \n", 212 | " \n", 213 | " \n", 214 | " \n", 215 | " \n", 216 | " \n", 217 | " \n", 218 | " \n", 219 | " \n", 220 | " \n", 221 | " \n", 222 | " \n", 223 | " \n", 224 | " \n", 225 | " \n", 226 | " \n", 227 | " \n", 228 | " \n", 229 | " \n", 230 | " \n", 231 | " \n", 232 | " \n", 233 | " \n", 234 | " \n", 235 | " \n", 236 | " \n", 237 | " \n", 238 | " \n", 239 | " \n", 240 | " \n", 241 | " \n", 242 | " \n", 243 | " \n", 244 | " \n", 245 | " \n", 246 | " \n", 247 | " \n", 248 | " \n", 249 | " \n", 250 | " \n", 251 | " \n", 252 | " \n", 253 | " \n", 254 | " \n", 255 | " \n", 256 | " \n", 257 | " \n", 258 | " \n", 259 | " \n", 260 | " \n", 261 | " \n", 262 | " \n", 263 | " \n", 264 | " \n", 265 | " \n", 266 | " \n", 267 | " \n", 268 | " \n", 269 | " \n", 270 | " \n", 271 | " \n", 272 | " \n", 273 | " \n", 274 | " \n", 275 | " \n", 276 | " \n", 277 | " \n", 278 | " \n", 279 | " \n", 280 | " \n", 281 | " \n", 282 | " \n", 283 | " \n", 284 | " \n", 285 | " \n", 286 | " \n", 287 | " \n", 288 | " \n", 289 | " \n", 290 | " \n", 291 | " \n", 292 | " \n", 293 | " \n", 294 | " \n", 295 | " \n", 296 | " \n", 297 | " \n", 298 | " \n", 299 | " \n", 300 | " \n", 301 | " \n", 302 | " \n", 303 | " \n", 304 | " \n", 305 | " \n", 306 | " \n", 307 | " \n", 308 | " \n", 309 | " \n", 310 | " \n", 311 | " \n", 312 | " \n", 313 | " \n", 314 | " \n", 315 | " \n", 316 | " \n", 317 | " \n", 318 | " \n", 319 | " \n", 320 | " \n", 321 | " \n", 322 | " \n", 323 | " \n", 324 | " \n", 325 | " \n", 326 | " \n", 327 | " \n", 328 | " \n", 329 | " \n", 330 | " \n", 331 | " \n", 332 | " \n", 333 | " \n", 334 | " \n", 335 | " \n", 336 | " \n", 337 | " \n", 338 | " \n", 339 | " \n", 340 | " \n", 341 | " \n", 342 | " \n", 343 | " \n", 344 | " \n", 345 | " \n", 346 | " \n", 347 | " \n", 348 | " \n", 349 | " \n", 350 | " \n", 351 | " \n", 352 | " \n", 353 | " \n", 354 | " \n", 355 | " \n", 356 | " \n", 357 | " \n", 358 | " \n", 359 | " \n", 360 | " \n", 361 | " \n", 362 | " \n", 363 | " \n", 364 | " \n", 365 | " \n", 366 | " \n", 367 | " \n", 368 | " \n", 369 | " \n", 370 | " \n", 371 | " \n", 372 | " \n", 373 | " \n", 374 | " \n", 375 | " \n", 376 | " \n", 377 | " \n", 378 | " \n", 379 | " \n", 380 | " \n", 381 | " \n", 382 | " \n", 383 | " \n", 384 | " \n", 385 | " \n", 386 | " \n", 387 | " \n", 388 | " \n", 389 | " \n", 390 | " \n", 391 | " \n", 392 | " \n", 393 | " \n", 394 | " \n", 395 | "
OpenHighLowCloseVolumeDividendsStock SplitsBullish swingBearish swingBullish pinbarBearish pinbarInside barOutside barBullish engulfingBearish engulfing
Date
2020-06-03307.649227310.604352307.351744309.573029925676000.00FalseFalseFalseFalseFalseFalseFalseFalse
2020-06-04308.511945310.386176306.498898308.759857757944000.00FalseFalseFalseFalseFalseFalseFalseFalse
2020-06-05314.580853318.587093314.511430316.6732181505247000.00TrueFalseFalseFalseFalseFalseFalseFalse
2020-06-08317.545882320.709245316.960812320.501007736412000.00FalseFalseFalseFalseFalseFalseFalseFalse
2020-06-09317.625216320.580342316.693064318.111145774792000.00FalseTrueFalseFalseFalseFalseFalseFalse
................................................
2020-10-27339.760010340.119995337.989990338.220001659941000.00TrueFalseFalseFalseTrueFalseFalseFalse
2020-10-28332.100006338.250000326.130005326.6600041270943000.00FalseFalseFalseFalseFalseFalseFalseFalse
2020-10-29326.910004333.399994325.089996329.980011905977000.00FalseFalseFalseFalseFalseFalseFalseFalse
2020-10-30328.279999329.690002322.600006326.5400091202873000.00FalseFalseTrueFalseFalseFalseFalseFalse
2020-11-02330.200012332.359985327.239990330.200012857028000.00TrueFalseFalseFalseFalseFalseFalseFalse
\n", 396 | "

107 rows × 15 columns

\n", 397 | "
" 398 | ], 399 | "text/plain": [ 400 | " Open High ... Bullish engulfing Bearish engulfing\n", 401 | "Date ... \n", 402 | "2020-06-03 307.649227 310.604352 ... False False\n", 403 | "2020-06-04 308.511945 310.386176 ... False False\n", 404 | "2020-06-05 314.580853 318.587093 ... False False\n", 405 | "2020-06-08 317.545882 320.709245 ... False False\n", 406 | "2020-06-09 317.625216 320.580342 ... False False\n", 407 | "... ... ... ... ... ...\n", 408 | "2020-10-27 339.760010 340.119995 ... False False\n", 409 | "2020-10-28 332.100006 338.250000 ... False False\n", 410 | "2020-10-29 326.910004 333.399994 ... False False\n", 411 | "2020-10-30 328.279999 329.690002 ... False False\n", 412 | "2020-11-02 330.200012 332.359985 ... False False\n", 413 | "\n", 414 | "[107 rows x 15 columns]" 415 | ] 416 | }, 417 | "metadata": { 418 | "tags": [] 419 | }, 420 | "execution_count": 53 421 | } 422 | ] 423 | }, 424 | { 425 | "cell_type": "code", 426 | "metadata": { 427 | "id": "aQp9ZDMKDPvI" 428 | }, 429 | "source": [ 430 | "" 431 | ], 432 | "execution_count": 53, 433 | "outputs": [] 434 | } 435 | ] 436 | } -------------------------------------------------------------------------------- /Calculation_of_daily_pivot_levels.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "nbformat": 4, 3 | "nbformat_minor": 0, 4 | "metadata": { 5 | "colab": { 6 | "name": "Calculation of daily pivot levels.ipynb", 7 | "provenance": [], 8 | "authorship_tag": "ABX9TyPFmH9nyVVd7WK+RoGMlwC7" 9 | }, 10 | "kernelspec": { 11 | "name": "python3", 12 | "display_name": "Python 3" 13 | } 14 | }, 15 | "cells": [ 16 | { 17 | "cell_type": "code", 18 | "metadata": { 19 | "id": "7g3Xf0cMv-H7", 20 | "outputId": "1bda63ec-3870-4e7b-99b1-31022ac7e13a", 21 | "colab": { 22 | "base_uri": "https://localhost:8080/", 23 | "height": 230 24 | } 25 | }, 26 | "source": [ 27 | "!pip install yfinance" 28 | ], 29 | "execution_count": 14, 30 | "outputs": [ 31 | { 32 | "output_type": "stream", 33 | "text": [ 34 | "Requirement already satisfied: yfinance in /usr/local/lib/python3.6/dist-packages (0.1.54)\n", 35 | "Requirement already satisfied: pandas>=0.24 in /usr/local/lib/python3.6/dist-packages (from yfinance) (1.0.5)\n", 36 | "Requirement already satisfied: numpy>=1.15 in /usr/local/lib/python3.6/dist-packages (from yfinance) (1.18.5)\n", 37 | "Requirement already satisfied: multitasking>=0.0.7 in /usr/local/lib/python3.6/dist-packages (from yfinance) (0.0.9)\n", 38 | "Requirement already satisfied: requests>=2.20 in /usr/local/lib/python3.6/dist-packages (from yfinance) (2.23.0)\n", 39 | "Requirement already satisfied: pytz>=2017.2 in /usr/local/lib/python3.6/dist-packages (from pandas>=0.24->yfinance) (2018.9)\n", 40 | "Requirement already satisfied: python-dateutil>=2.6.1 in /usr/local/lib/python3.6/dist-packages (from pandas>=0.24->yfinance) (2.8.1)\n", 41 | "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.6/dist-packages (from requests>=2.20->yfinance) (2020.6.20)\n", 42 | "Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /usr/local/lib/python3.6/dist-packages (from requests>=2.20->yfinance) (1.24.3)\n", 43 | "Requirement already satisfied: idna<3,>=2.5 in /usr/local/lib/python3.6/dist-packages (from requests>=2.20->yfinance) (2.10)\n", 44 | "Requirement already satisfied: chardet<4,>=3.0.2 in /usr/local/lib/python3.6/dist-packages (from requests>=2.20->yfinance) (3.0.4)\n", 45 | "Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.6/dist-packages (from python-dateutil>=2.6.1->pandas>=0.24->yfinance) (1.15.0)\n" 46 | ], 47 | "name": "stdout" 48 | } 49 | ] 50 | }, 51 | { 52 | "cell_type": "code", 53 | "metadata": { 54 | "id": "cONv05MkwBVB" 55 | }, 56 | "source": [ 57 | "import numpy as np\n", 58 | "import pandas as pd\n", 59 | "import yfinance\n" 60 | ], 61 | "execution_count": 15, 62 | "outputs": [] 63 | }, 64 | { 65 | "cell_type": "code", 66 | "metadata": { 67 | "id": "qL393Ux9wE3x" 68 | }, 69 | "source": [ 70 | "ticker = yfinance.Ticker(\"FB\")\n", 71 | "df = ticker.history(interval=\"1d\")\n" 72 | ], 73 | "execution_count": 16, 74 | "outputs": [] 75 | }, 76 | { 77 | "cell_type": "code", 78 | "metadata": { 79 | "id": "-VXqcqOBxEDc", 80 | "outputId": "9e7f1a6a-3a96-4073-af03-a4ef655b5094", 81 | "colab": { 82 | "base_uri": "https://localhost:8080/", 83 | "height": 686 84 | } 85 | }, 86 | "source": [ 87 | "df" 88 | ], 89 | "execution_count": 20, 90 | "outputs": [ 91 | { 92 | "output_type": "execute_result", 93 | "data": { 94 | "text/html": [ 95 | "
\n", 96 | "\n", 109 | "\n", 110 | " \n", 111 | " \n", 112 | " \n", 113 | " \n", 114 | " \n", 115 | " \n", 116 | " \n", 117 | " \n", 118 | " \n", 119 | " \n", 120 | " \n", 121 | " \n", 122 | " \n", 123 | " \n", 124 | " \n", 125 | " \n", 126 | " \n", 127 | " \n", 128 | " \n", 129 | " \n", 130 | " \n", 131 | " \n", 132 | " \n", 133 | " \n", 134 | " \n", 135 | " \n", 136 | " \n", 137 | " \n", 138 | " \n", 139 | " \n", 140 | " \n", 141 | " \n", 142 | " \n", 143 | " \n", 144 | " \n", 145 | " \n", 146 | " \n", 147 | " \n", 148 | " \n", 149 | " \n", 150 | " \n", 151 | " \n", 152 | " \n", 153 | " \n", 154 | " \n", 155 | " \n", 156 | " \n", 157 | " \n", 158 | " \n", 159 | " \n", 160 | " \n", 161 | " \n", 162 | " \n", 163 | " \n", 164 | " \n", 165 | " \n", 166 | " \n", 167 | " \n", 168 | " \n", 169 | " \n", 170 | " \n", 171 | " \n", 172 | " \n", 173 | " \n", 174 | " \n", 175 | " \n", 176 | " \n", 177 | " \n", 178 | " \n", 179 | " \n", 180 | " \n", 181 | " \n", 182 | " \n", 183 | " \n", 184 | " \n", 185 | " \n", 186 | " \n", 187 | " \n", 188 | " \n", 189 | " \n", 190 | " \n", 191 | " \n", 192 | " \n", 193 | " \n", 194 | " \n", 195 | " \n", 196 | " \n", 197 | " \n", 198 | " \n", 199 | " \n", 200 | " \n", 201 | " \n", 202 | " \n", 203 | " \n", 204 | " \n", 205 | " \n", 206 | " \n", 207 | " \n", 208 | " \n", 209 | " \n", 210 | " \n", 211 | " \n", 212 | " \n", 213 | " \n", 214 | " \n", 215 | " \n", 216 | " \n", 217 | " \n", 218 | " \n", 219 | " \n", 220 | " \n", 221 | " \n", 222 | " \n", 223 | " \n", 224 | " \n", 225 | " \n", 226 | " \n", 227 | " \n", 228 | " \n", 229 | " \n", 230 | " \n", 231 | " \n", 232 | " \n", 233 | " \n", 234 | " \n", 235 | " \n", 236 | " \n", 237 | " \n", 238 | " \n", 239 | " \n", 240 | " \n", 241 | " \n", 242 | " \n", 243 | " \n", 244 | " \n", 245 | " \n", 246 | " \n", 247 | " \n", 248 | " \n", 249 | " \n", 250 | " \n", 251 | " \n", 252 | " \n", 253 | " \n", 254 | " \n", 255 | " \n", 256 | " \n", 257 | " \n", 258 | " \n", 259 | " \n", 260 | " \n", 261 | " \n", 262 | " \n", 263 | " \n", 264 | " \n", 265 | " \n", 266 | " \n", 267 | " \n", 268 | " \n", 269 | " \n", 270 | " \n", 271 | " \n", 272 | " \n", 273 | " \n", 274 | " \n", 275 | " \n", 276 | " \n", 277 | " \n", 278 | " \n", 279 | " \n", 280 | " \n", 281 | " \n", 282 | " \n", 283 | " \n", 284 | " \n", 285 | " \n", 286 | " \n", 287 | " \n", 288 | " \n", 289 | " \n", 290 | " \n", 291 | " \n", 292 | " \n", 293 | " \n", 294 | " \n", 295 | " \n", 296 | " \n", 297 | " \n", 298 | " \n", 299 | " \n", 300 | " \n", 301 | " \n", 302 | " \n", 303 | " \n", 304 | " \n", 305 | " \n", 306 | " \n", 307 | " \n", 308 | " \n", 309 | " \n", 310 | " \n", 311 | " \n", 312 | " \n", 313 | " \n", 314 | " \n", 315 | " \n", 316 | " \n", 317 | " \n", 318 | " \n", 319 | " \n", 320 | " \n", 321 | " \n", 322 | " \n", 323 | " \n", 324 | " \n", 325 | " \n", 326 | " \n", 327 | " \n", 328 | " \n", 329 | " \n", 330 | " \n", 331 | " \n", 332 | " \n", 333 | " \n", 334 | "
OpenHighLowCloseVolumeDividendsStock Splits
Date
2020-08-31293.95296.88291.55293.201734510000
2020-09-01294.71301.49292.71295.441732090000
2020-09-02298.88303.60293.05302.502434140000
2020-09-03295.99297.60283.63291.123229410000
2020-09-04287.25289.00271.14282.733033370000
2020-09-08271.28279.30269.42271.162486400000
2020-09-09275.77278.48271.35273.722291880000
2020-09-10275.51279.16267.03268.092481470000
2020-09-11270.06271.39262.64266.611891390000
2020-09-14270.95276.64265.70266.152409380000
2020-09-15270.67274.52269.30272.421847850000
2020-09-16267.29272.44261.79263.522918340000
2020-09-17258.28261.50250.19254.823128140000
2020-09-18258.40259.20250.05252.532813080000
2020-09-21247.54249.95244.13248.152470940000
2020-09-22253.31255.32248.22254.753029310000
2020-09-23255.26257.99248.15249.021964130000
2020-09-24246.50252.24245.62249.532000680000
2020-09-25249.40255.75246.61254.821835130000
2020-09-28259.40259.60254.82256.821880780000
\n", 335 | "
" 336 | ], 337 | "text/plain": [ 338 | " Open High Low Close Volume Dividends Stock Splits\n", 339 | "Date \n", 340 | "2020-08-31 293.95 296.88 291.55 293.20 17345100 0 0\n", 341 | "2020-09-01 294.71 301.49 292.71 295.44 17320900 0 0\n", 342 | "2020-09-02 298.88 303.60 293.05 302.50 24341400 0 0\n", 343 | "2020-09-03 295.99 297.60 283.63 291.12 32294100 0 0\n", 344 | "2020-09-04 287.25 289.00 271.14 282.73 30333700 0 0\n", 345 | "2020-09-08 271.28 279.30 269.42 271.16 24864000 0 0\n", 346 | "2020-09-09 275.77 278.48 271.35 273.72 22918800 0 0\n", 347 | "2020-09-10 275.51 279.16 267.03 268.09 24814700 0 0\n", 348 | "2020-09-11 270.06 271.39 262.64 266.61 18913900 0 0\n", 349 | "2020-09-14 270.95 276.64 265.70 266.15 24093800 0 0\n", 350 | "2020-09-15 270.67 274.52 269.30 272.42 18478500 0 0\n", 351 | "2020-09-16 267.29 272.44 261.79 263.52 29183400 0 0\n", 352 | "2020-09-17 258.28 261.50 250.19 254.82 31281400 0 0\n", 353 | "2020-09-18 258.40 259.20 250.05 252.53 28130800 0 0\n", 354 | "2020-09-21 247.54 249.95 244.13 248.15 24709400 0 0\n", 355 | "2020-09-22 253.31 255.32 248.22 254.75 30293100 0 0\n", 356 | "2020-09-23 255.26 257.99 248.15 249.02 19641300 0 0\n", 357 | "2020-09-24 246.50 252.24 245.62 249.53 20006800 0 0\n", 358 | "2020-09-25 249.40 255.75 246.61 254.82 18351300 0 0\n", 359 | "2020-09-28 259.40 259.60 254.82 256.82 18807800 0 0" 360 | ] 361 | }, 362 | "metadata": { 363 | "tags": [] 364 | }, 365 | "execution_count": 20 366 | } 367 | ] 368 | }, 369 | { 370 | "cell_type": "code", 371 | "metadata": { 372 | "id": "x5G7JJfUsA0i" 373 | }, 374 | "source": [ 375 | "last_day = df.tail(1).copy()" 376 | ], 377 | "execution_count": 17, 378 | "outputs": [] 379 | }, 380 | { 381 | "cell_type": "markdown", 382 | "metadata": { 383 | "id": "WGfvJQKK5Hh3" 384 | }, 385 | "source": [ 386 | "https://www.tradingview.com/support/solutions/43000521824-pivot-points-standard/ \n" 387 | ] 388 | }, 389 | { 390 | "cell_type": "code", 391 | "metadata": { 392 | "id": "XyRdpLqq5B9z" 393 | }, 394 | "source": [ 395 | "last_day['Pivot'] = (last_day['High'] + last_day['Low'] + last_day['Close'])/3\n", 396 | "last_day['R1'] = 2*last_day['Pivot'] - last_day['Low']\n", 397 | "last_day['S1'] = 2*last_day['Pivot'] - last_day['High']\n", 398 | "last_day['R2'] = last_day['Pivot'] + (last_day['High'] - last_day['Low'])\n", 399 | "last_day['S2'] = last_day['Pivot'] - (last_day['High'] - last_day['Low'])\n", 400 | "last_day['R3'] = last_day['Pivot'] + 2*(last_day['High'] - last_day['Low'])\n", 401 | "last_day['S3'] = last_day['Pivot'] - 2*(last_day['High'] - last_day['Low'])\n" 402 | ], 403 | "execution_count": 21, 404 | "outputs": [] 405 | }, 406 | { 407 | "cell_type": "code", 408 | "metadata": { 409 | "id": "MO4FoBnrs3tG", 410 | "outputId": "122f2ba4-7583-448c-8851-1f4b2bef8958", 411 | "colab": { 412 | "base_uri": "https://localhost:8080/", 413 | "height": 109 414 | } 415 | }, 416 | "source": [ 417 | "last_day" 418 | ], 419 | "execution_count": 22, 420 | "outputs": [ 421 | { 422 | "output_type": "execute_result", 423 | "data": { 424 | "text/html": [ 425 | "
\n", 426 | "\n", 439 | "\n", 440 | " \n", 441 | " \n", 442 | " \n", 443 | " \n", 444 | " \n", 445 | " \n", 446 | " \n", 447 | " \n", 448 | " \n", 449 | " \n", 450 | " \n", 451 | " \n", 452 | " \n", 453 | " \n", 454 | " \n", 455 | " \n", 456 | " \n", 457 | " \n", 458 | " \n", 459 | " \n", 460 | " \n", 461 | " \n", 462 | " \n", 463 | " \n", 464 | " \n", 465 | " \n", 466 | " \n", 467 | " \n", 468 | " \n", 469 | " \n", 470 | " \n", 471 | " \n", 472 | " \n", 473 | " \n", 474 | " \n", 475 | " \n", 476 | " \n", 477 | " \n", 478 | " \n", 479 | " \n", 480 | " \n", 481 | " \n", 482 | " \n", 483 | " \n", 484 | " \n", 485 | " \n", 486 | " \n", 487 | " \n", 488 | " \n", 489 | " \n", 490 | " \n", 491 | " \n", 492 | " \n", 493 | " \n", 494 | " \n", 495 | "
OpenHighLowCloseVolumeDividendsStock SplitsPivotR1S1R2S2R3S3
Date
2020-09-28259.4259.6254.82256.821880780000257.08259.34254.56261.86252.3266.64247.52
\n", 496 | "
" 497 | ], 498 | "text/plain": [ 499 | " Open High Low Close ... R2 S2 R3 S3\n", 500 | "Date ... \n", 501 | "2020-09-28 259.4 259.6 254.82 256.82 ... 261.86 252.3 266.64 247.52\n", 502 | "\n", 503 | "[1 rows x 14 columns]" 504 | ] 505 | }, 506 | "metadata": { 507 | "tags": [] 508 | }, 509 | "execution_count": 22 510 | } 511 | ] 512 | } 513 | ] 514 | } -------------------------------------------------------------------------------- /Heikin_Ashi.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "nbformat": 4, 3 | "nbformat_minor": 0, 4 | "metadata": { 5 | "colab": { 6 | "name": "Heikin Ashi.ipynb", 7 | "provenance": [], 8 | "authorship_tag": "ABX9TyM0DD/2yAin1oGhrWEEoJKb" 9 | }, 10 | "kernelspec": { 11 | "name": "python3", 12 | "display_name": "Python 3" 13 | }, 14 | "language_info": { 15 | "name": "python" 16 | } 17 | }, 18 | "cells": [ 19 | { 20 | "cell_type": "code", 21 | "metadata": { 22 | "colab": { 23 | "base_uri": "https://localhost:8080/" 24 | }, 25 | "id": "-Y_YRzuvppCa", 26 | "outputId": "5ed4c5e0-bdde-4ba5-d70f-2eb78de21b85" 27 | }, 28 | "source": [ 29 | "!pip install yfinance" 30 | ], 31 | "execution_count": 79, 32 | "outputs": [ 33 | { 34 | "output_type": "stream", 35 | "text": [ 36 | "Requirement already satisfied: yfinance in /usr/local/lib/python3.7/dist-packages (0.1.59)\n", 37 | "Requirement already satisfied: multitasking>=0.0.7 in /usr/local/lib/python3.7/dist-packages (from yfinance) (0.0.9)\n", 38 | "Requirement already satisfied: numpy>=1.15 in /usr/local/lib/python3.7/dist-packages (from yfinance) (1.19.5)\n", 39 | "Requirement already satisfied: requests>=2.20 in /usr/local/lib/python3.7/dist-packages (from yfinance) (2.23.0)\n", 40 | "Requirement already satisfied: pandas>=0.24 in /usr/local/lib/python3.7/dist-packages (from yfinance) (1.1.5)\n", 41 | "Requirement already satisfied: lxml>=4.5.1 in /usr/local/lib/python3.7/dist-packages (from yfinance) (4.6.3)\n", 42 | "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.7/dist-packages (from requests>=2.20->yfinance) (2020.12.5)\n", 43 | "Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /usr/local/lib/python3.7/dist-packages (from requests>=2.20->yfinance) (1.24.3)\n", 44 | "Requirement already satisfied: idna<3,>=2.5 in /usr/local/lib/python3.7/dist-packages (from requests>=2.20->yfinance) (2.10)\n", 45 | "Requirement already satisfied: chardet<4,>=3.0.2 in /usr/local/lib/python3.7/dist-packages (from requests>=2.20->yfinance) (3.0.4)\n", 46 | "Requirement already satisfied: pytz>=2017.2 in /usr/local/lib/python3.7/dist-packages (from pandas>=0.24->yfinance) (2018.9)\n", 47 | "Requirement already satisfied: python-dateutil>=2.7.3 in /usr/local/lib/python3.7/dist-packages (from pandas>=0.24->yfinance) (2.8.1)\n", 48 | "Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.7/dist-packages (from python-dateutil>=2.7.3->pandas>=0.24->yfinance) (1.15.0)\n" 49 | ], 50 | "name": "stdout" 51 | } 52 | ] 53 | }, 54 | { 55 | "cell_type": "code", 56 | "metadata": { 57 | "colab": { 58 | "base_uri": "https://localhost:8080/" 59 | }, 60 | "id": "LPHWYHWNqdkS", 61 | "outputId": "d1d7f7ae-dba4-4605-b206-e67b1e9756c9" 62 | }, 63 | "source": [ 64 | "!pip install mpl_finance" 65 | ], 66 | "execution_count": 80, 67 | "outputs": [ 68 | { 69 | "output_type": "stream", 70 | "text": [ 71 | "Requirement already satisfied: mpl_finance in /usr/local/lib/python3.7/dist-packages (0.10.1)\n", 72 | "Requirement already satisfied: matplotlib in /usr/local/lib/python3.7/dist-packages (from mpl_finance) (3.2.2)\n", 73 | "Requirement already satisfied: python-dateutil>=2.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib->mpl_finance) (2.8.1)\n", 74 | "Requirement already satisfied: numpy>=1.11 in /usr/local/lib/python3.7/dist-packages (from matplotlib->mpl_finance) (1.19.5)\n", 75 | "Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.7/dist-packages (from matplotlib->mpl_finance) (0.10.0)\n", 76 | "Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib->mpl_finance) (2.4.7)\n", 77 | "Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib->mpl_finance) (1.3.1)\n", 78 | "Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.7/dist-packages (from python-dateutil>=2.1->matplotlib->mpl_finance) (1.15.0)\n" 79 | ], 80 | "name": "stdout" 81 | } 82 | ] 83 | }, 84 | { 85 | "cell_type": "code", 86 | "metadata": { 87 | "id": "og1Ipiicqeum" 88 | }, 89 | "source": [ 90 | "import pandas as pd\n", 91 | "import yfinance\n", 92 | "from mpl_finance import candlestick_ohlc\n", 93 | "import matplotlib.pyplot as plt\n", 94 | "\n", 95 | "plt.rcParams['figure.figsize'] = [12, 7]\n", 96 | "\n", 97 | "plt.rc('font', size=14) " 98 | ], 99 | "execution_count": 81, 100 | "outputs": [] 101 | }, 102 | { 103 | "cell_type": "code", 104 | "metadata": { 105 | "id": "Xmu5Pr5HqhiG" 106 | }, 107 | "source": [ 108 | "name = 'SPY'\n", 109 | "ticker = yfinance.Ticker(name)\n", 110 | "df = ticker.history(interval=\"1d\",start=\"2020-12-15\",end=\"2021-04-15\")\n", 111 | "\n" 112 | ], 113 | "execution_count": 82, 114 | "outputs": [] 115 | }, 116 | { 117 | "cell_type": "code", 118 | "metadata": { 119 | "id": "HfHSNs9TqiuM" 120 | }, 121 | "source": [ 122 | "\n", 123 | "df['Date'] = range(df.shape[0])\n", 124 | "df = df.loc[:,['Date', 'Open', 'High', 'Low', 'Close']]" 125 | ], 126 | "execution_count": 83, 127 | "outputs": [] 128 | }, 129 | { 130 | "cell_type": "code", 131 | "metadata": { 132 | "id": "xNcokXHkqlKI" 133 | }, 134 | "source": [ 135 | "def plot_chart(df):\n", 136 | " fig, ax = plt.subplots()\n", 137 | "\n", 138 | " candlestick_ohlc(ax,df.values,width=0.6, \\\n", 139 | " colorup='green', colordown='red', alpha=0.8)\n", 140 | "\n", 141 | " fig.tight_layout()\n", 142 | "\n", 143 | " fig.show()" 144 | ], 145 | "execution_count": 84, 146 | "outputs": [] 147 | }, 148 | { 149 | "cell_type": "code", 150 | "metadata": { 151 | "colab": { 152 | "base_uri": "https://localhost:8080/", 153 | "height": 505 154 | }, 155 | "id": "3V25LX-sqroQ", 156 | "outputId": "abce8dd1-769f-4da2-f1fc-17d93c7fcdf6" 157 | }, 158 | "source": [ 159 | "plot_chart(df)" 160 | ], 161 | "execution_count": 85, 162 | "outputs": [ 163 | { 164 | "output_type": "display_data", 165 | "data": { 166 | "image/png": "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\n", 167 | "text/plain": [ 168 | "
" 169 | ] 170 | }, 171 | "metadata": { 172 | "tags": [], 173 | "needs_background": "light" 174 | } 175 | } 176 | ] 177 | }, 178 | { 179 | "cell_type": "code", 180 | "metadata": { 181 | "id": "efeyvyrvqva6" 182 | }, 183 | "source": [ 184 | "df_ha = df.copy()" 185 | ], 186 | "execution_count": 86, 187 | "outputs": [] 188 | }, 189 | { 190 | "cell_type": "code", 191 | "metadata": { 192 | "id": "91N0HeBfqzuc" 193 | }, 194 | "source": [ 195 | "for i in range(df_ha.shape[0]):\n", 196 | " if i > 0:\n", 197 | " df_ha.loc[df_ha.index[i],'Open'] = (df['Open'][i-1] + df['Close'][i-1])/2\n", 198 | " \n", 199 | " df_ha.loc[df_ha.index[i],'Close'] = (df['Open'][i] + df['Close'][i] + df['Low'][i] + df['High'][i])/4\n", 200 | "\n", 201 | "df_ha = df_ha.iloc[1:,:]\n", 202 | "\n", 203 | " " 204 | ], 205 | "execution_count": 87, 206 | "outputs": [] 207 | }, 208 | { 209 | "cell_type": "code", 210 | "metadata": { 211 | "colab": { 212 | "base_uri": "https://localhost:8080/", 213 | "height": 505 214 | }, 215 | "id": "YW7fNhGstcR1", 216 | "outputId": "21454df8-1dbf-4490-85ba-ff546ead6388" 217 | }, 218 | "source": [ 219 | "plot_chart(df_ha)" 220 | ], 221 | "execution_count": 88, 222 | "outputs": [ 223 | { 224 | "output_type": "display_data", 225 | "data": { 226 | "image/png": "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0+74seNtd2HXzC4BAMDeCFCHkNklAADYG0v49mC4ot329j1zPhEAAEw8AWoP9lqY4ZqcTwQAABPPEj4AAICGBCgAAICGLOGbAcN7sjY2N7J2YW2rHQAAGB0BagYM78laumcpSyeX2usMAADMMEv4AAAAGhKgZoxDcgEA4OAIUDPGIbkAAHBwBCgAAICGBCgAAICGBCgAAICGBCgAAICGBCgAAICGBCgAAICGBCgAAICGBCgAAICGBChmx8JC2z0AAGDGCVDMjlOn2u4BAAAzToACAABoSIACAABoSIACAABoSIACAABoSIACAABoSIACAABoSIACAABoSIACAABoSIACAABoSIACAABoSIACAABoSIACAABoSIACAABoSIACAABoSIACAABoSIACAABoSIACAABoSIACAABoSIACAABoSICaJgsLbfcAAAAONQFqmpw61XYPAADgULtugCqlvLCUcn8p5XP9x3tLKc/Zds/Xl1L+71LKeinlQinlT0opTxy6/qhSys+VUs6VUjZKKW8tpTz+IN4QAADAQWkyA/WJJC9O8pQkJ5L8XpK3lFKenCSllK9O8u4kH0vybUm+MclPJ3lw6DleneR7knx/kmcl+bIkd5dSjozmbQAAABy8Umvd/Q+V8tkkL6m1/mIp5Y1Jaq31H13l3rkka0lur7X+ar/tryfpJvmOWuvbr/d6J06cqPfee++u+wkAALBbpZT7aq0ndrq2qz1QpZQjpZTnJnlskveUUm5I8p1J/rSU8jullLVSyh+XUr5v6MeemuSRSd4xaKi1fjzJh5I8Y5fvBQAAoDWNAlQp5UmllAeTfDHJv0/y3bXW9yf5yvTC1EvTC0jPTvIfkvzq0D6pW5JcTHJu29N+qn8NAABgKjyi4X0fTnJbkrkk35vk9aWUk0k+27/+m7XWV/W/PltKOZHkx5K8ba8dK6WcTnI6SW699da9Pg0AAMDINJqBqrU+XGv9aK31vlrrS5KcTXJnerNKX0ryp9t+5ENJBqnngSRHkhzfds/N/WtXe827aq0naq0n5ufnm3QTAADgQO31HKgbkjyq1vpwkj9O8oRt178+vSIRSXJfks30lvclSfolzJ+Y5D17fH0AAICxu+4SvlLKK9JbivfxJI9L8rwkJ5MM9ji9MsmvlVL+ML0S59+a5LlJvitJaq3nSymvS/LKUsqnk3wm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\n", 227 | "text/plain": [ 228 | "
" 229 | ] 230 | }, 231 | "metadata": { 232 | "tags": [], 233 | "needs_background": "light" 234 | } 235 | } 236 | ] 237 | }, 238 | { 239 | "cell_type": "code", 240 | "metadata": { 241 | "id": "gQm8nD4ktzk7" 242 | }, 243 | "source": [ 244 | " " 245 | ], 246 | "execution_count": 88, 247 | "outputs": [] 248 | } 249 | ] 250 | } -------------------------------------------------------------------------------- /Threshold.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "nbformat": 4, 3 | "nbformat_minor": 0, 4 | "metadata": { 5 | "colab": { 6 | "name": "Threshold.ipynb", 7 | "provenance": [], 8 | "authorship_tag": "ABX9TyOFYlTl5r9npPtfRIa4ypnY" 9 | }, 10 | "kernelspec": { 11 | "name": "python3", 12 | "display_name": "Python 3" 13 | }, 14 | "language_info": { 15 | "name": "python" 16 | } 17 | }, 18 | "cells": [ 19 | { 20 | "cell_type": "code", 21 | "metadata": { 22 | "id": "QMQ3e-0Tm0aR" 23 | }, 24 | "source": [ 25 | "import numpy as np\n", 26 | "import matplotlib.pyplot as plt\n" 27 | ], 28 | "execution_count": null, 29 | "outputs": [] 30 | }, 31 | { 32 | "cell_type": "code", 33 | "metadata": { 34 | "id": "R9VmqWlEkipF" 35 | }, 36 | "source": [ 37 | "from sklearn.datasets import load_boston" 38 | ], 39 | "execution_count": null, 40 | "outputs": [] 41 | }, 42 | { 43 | "cell_type": "code", 44 | "metadata": { 45 | "id": "WA4l8eSJmE4s" 46 | }, 47 | "source": [ 48 | "from sklearn.linear_model import LogisticRegression\n", 49 | "from sklearn.preprocessing import StandardScaler\n", 50 | "from sklearn.pipeline import make_pipeline" 51 | ], 52 | "execution_count": null, 53 | "outputs": [] 54 | }, 55 | { 56 | "cell_type": "code", 57 | "metadata": { 58 | "id": "Zl9G_yLSmJDd" 59 | }, 60 | "source": [ 61 | "from sklearn.model_selection import train_test_split,cross_val_score\n", 62 | "from sklearn.metrics import roc_curve,plot_roc_curve, balanced_accuracy_score" 63 | ], 64 | "execution_count": null, 65 | "outputs": [] 66 | }, 67 | { 68 | "cell_type": "code", 69 | "metadata": { 70 | "id": "q--Hc4VumQQe" 71 | }, 72 | "source": [ 73 | "X,y = load_boston(return_X_y=True)\n", 74 | "\n", 75 | "\n", 76 | "y = (y > y.mean()).astype(int)" 77 | ], 78 | "execution_count": null, 79 | "outputs": [] 80 | }, 81 | { 82 | "cell_type": "code", 83 | "metadata": { 84 | "id": "ZMmrxRlImLSQ" 85 | }, 86 | "source": [ 87 | "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42)" 88 | ], 89 | "execution_count": null, 90 | "outputs": [] 91 | }, 92 | { 93 | "cell_type": "code", 94 | "metadata": { 95 | "id": "z43ZuZvtmPI6" 96 | }, 97 | "source": [ 98 | "model = make_pipeline(StandardScaler(),LogisticRegression())" 99 | ], 100 | "execution_count": null, 101 | "outputs": [] 102 | }, 103 | { 104 | "cell_type": "code", 105 | "metadata": { 106 | "colab": { 107 | "base_uri": "https://localhost:8080/" 108 | }, 109 | "id": "zzf0l6HzmXX3", 110 | "outputId": "f7800eb5-bd64-482a-8d7b-708b65221fef" 111 | }, 112 | "source": [ 113 | "model.fit(X_train,y_train)" 114 | ], 115 | "execution_count": null, 116 | "outputs": [ 117 | { 118 | "output_type": "execute_result", 119 | "data": { 120 | "text/plain": [ 121 | "Pipeline(memory=None,\n", 122 | " steps=[('standardscaler',\n", 123 | " StandardScaler(copy=True, with_mean=True, with_std=True)),\n", 124 | " ('logisticregression',\n", 125 | " LogisticRegression(C=1.0, class_weight=None, dual=False,\n", 126 | " fit_intercept=True, intercept_scaling=1,\n", 127 | " l1_ratio=None, max_iter=100,\n", 128 | " multi_class='auto', n_jobs=None,\n", 129 | " penalty='l2', random_state=None,\n", 130 | " solver='lbfgs', tol=0.0001, verbose=0,\n", 131 | " warm_start=False))],\n", 132 | " verbose=False)" 133 | ] 134 | }, 135 | "metadata": { 136 | "tags": [] 137 | }, 138 | "execution_count": 8 139 | } 140 | ] 141 | }, 142 | { 143 | "cell_type": "code", 144 | "metadata": { 145 | "colab": { 146 | "base_uri": "https://localhost:8080/", 147 | "height": 296 148 | }, 149 | "id": "epLsoevIxk_k", 150 | "outputId": "16bc8ad9-47b2-4aab-8b2c-5852aebd82ea" 151 | }, 152 | "source": [ 153 | "plot_roc_curve(model,X_train,y_train)" 154 | ], 155 | "execution_count": null, 156 | "outputs": [ 157 | { 158 | "output_type": "execute_result", 159 | "data": { 160 | "text/plain": [ 161 | "" 162 | ] 163 | }, 164 | "metadata": { 165 | "tags": [] 166 | }, 167 | "execution_count": 9 168 | }, 169 | { 170 | "output_type": "display_data", 171 | "data": { 172 | "image/png": "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/rfeeos+ffrsEeupp57KG2+80eL4wInAzBrQtWtXli1bxsqVK+ncuTO33norFRUV3HTTTS0+dq9evbjnnntaIUrYunUrCxcu5OSTT9697e6772bEiBHMnj276OPMmzePf//3f2f+/PmsWLGChQsXcuCBB7Yotvfee4/LL7+cefPmUVVVxezZs6mqqqpT7qqrruLCCy9k+fLlXHfddUyePHmP/V//+tf3uD6Az33uc9xyyy0tiq+G7xoy28d945erqNrwVqsec1Cv7lz/t0cXXf6kk05i+fLlLFiwgOnTp/Pggw8yZcoUXnzxRVavXs2WLVv4p3/6Jz7/+c8DMG3aNObOncs777zDmWeeyTe+8Y09jrdmzRrOOOMMVq5cycyZM6msrGT79u28+OKLnHnmmXzve98DYP78+Vx//fW88847fOQjH+EnP/lJnW/19957L2PGjNlj2+zZs7nhhhs4//zzqa6upk+fPk1e47e//W2mT59Or169ANhvv/12X8/eWrx4MUcccQQf/vCHATj33HN54IEHGDRo0B7lqqqquPHGGwEYNWoUn/nMZ3bvW7p0Ka+++ipjxoxhyZIlu7ePGzeOk046iWuvvbZFMYJrBGbWhF27djFv3jyGDBlSZ9/y5cv5zW9+w5NPPsnUqVPZsGED8+fP54UXXmDx4sUsW7aMpUuX7tFsU59ly5YxZ84cVqxYwZw5c1i3bh1btmzhm9/8Jr/+9a95+umnqaio2P1hWejxxx/nuOOO272+bt06Nm7cyAknnMDEiROZM2dOUde5cuXKPY7TkFmzZjFs2LA6r/qautavX8/hhx++e71Pnz6sX7++TrmPfvSj3HfffQDcf//9vP3222zdupX333+fK6+8st4mqg996EO88847bN26tajra4xrBGb7uOZ8c29Nf/7znxk2bBiQ1AguueQSnnjiiT3KjB8/nq5du9K1a1dGjRrF4sWL+d3vfsf8+fM55phjANi2bRsvvPBCnaaNQqNHj97dDDNo0CBeeeUV/vjHP1JVVcWJJ54IwM6dOxk5cmSd927cuJGePXvuXp8zZw4TJ04Ekm/gF198MVdeeWWD527uXTYXXHABF1xwQbPe05Tp06czadIkZs6cycknn0zv3r3p0KEDt9xyC2PHjm2wRnPooYeyYcMGDjnkkBadP9NEIGkM8H2gA3BbRHyn1v79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\n", 173 | "text/plain": [ 174 | "
" 175 | ] 176 | }, 177 | "metadata": { 178 | "tags": [], 179 | "needs_background": "light" 180 | } 181 | } 182 | ] 183 | }, 184 | { 185 | "cell_type": "code", 186 | "metadata": { 187 | "id": "dbvF6TW3mYqc" 188 | }, 189 | "source": [ 190 | "threshold = []\n", 191 | "accuracy = []\n", 192 | "\n", 193 | "for p in np.unique(model.predict_proba(X_train)[:,1]):\n", 194 | " threshold.append(p)\n", 195 | " y_pred = (model.predict_proba(X_train)[:,1] >= p).astype(int)\n", 196 | " accuracy.append(balanced_accuracy_score(y_train,y_pred))" 197 | ], 198 | "execution_count": null, 199 | "outputs": [] 200 | }, 201 | { 202 | "cell_type": "code", 203 | "metadata": { 204 | "colab": { 205 | "base_uri": "https://localhost:8080/", 206 | "height": 282 207 | }, 208 | "id": "5OsZe4iTnHA-", 209 | "outputId": "aa0e241f-e636-427e-c71d-0276219546ed" 210 | }, 211 | "source": [ 212 | "plt.scatter(threshold,accuracy)\n", 213 | "plt.xlabel(\"Threshold\")\n", 214 | "plt.ylabel(\"Balanced accuracy\")\n", 215 | "plt.show()" 216 | ], 217 | "execution_count": null, 218 | "outputs": [ 219 | { 220 | "output_type": "display_data", 221 | "data": { 222 | "image/png": "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\n", 223 | "text/plain": [ 224 | "
" 225 | ] 226 | }, 227 | "metadata": { 228 | "tags": [], 229 | "needs_background": "light" 230 | } 231 | } 232 | ] 233 | }, 234 | { 235 | "cell_type": "code", 236 | "metadata": { 237 | "colab": { 238 | "base_uri": "https://localhost:8080/" 239 | }, 240 | "id": "jZGGUpLJzGDn", 241 | "outputId": "ac1265d2-4d28-455d-9087-a2d66c740cc4" 242 | }, 243 | "source": [ 244 | "threshold[np.argmax(accuracy)]" 245 | ], 246 | "execution_count": null, 247 | "outputs": [ 248 | { 249 | "output_type": "execute_result", 250 | "data": { 251 | "text/plain": [ 252 | "0.5602892029098923" 253 | ] 254 | }, 255 | "metadata": { 256 | "tags": [] 257 | }, 258 | "execution_count": 12 259 | } 260 | ] 261 | }, 262 | { 263 | "cell_type": "code", 264 | "metadata": { 265 | "id": "srGZ0zfSnOfF" 266 | }, 267 | "source": [ 268 | "fpr, tpr, thresholds = roc_curve(y_train,model.predict_proba(X_train)[:,1],drop_intermediate=False)" 269 | ], 270 | "execution_count": null, 271 | "outputs": [] 272 | }, 273 | { 274 | "cell_type": "code", 275 | "metadata": { 276 | "colab": { 277 | "base_uri": "https://localhost:8080/" 278 | }, 279 | "id": "jd1zYR6KnzYf", 280 | "outputId": "fd562b47-f8a3-4fbd-e506-667f71e8142d" 281 | }, 282 | "source": [ 283 | "np.argmin(np.abs(fpr+tpr-1))" 284 | ], 285 | "execution_count": null, 286 | "outputs": [ 287 | { 288 | "output_type": "execute_result", 289 | "data": { 290 | "text/plain": [ 291 | "154" 292 | ] 293 | }, 294 | "metadata": { 295 | "tags": [] 296 | }, 297 | "execution_count": 14 298 | } 299 | ] 300 | }, 301 | { 302 | "cell_type": "code", 303 | "metadata": { 304 | "colab": { 305 | "base_uri": "https://localhost:8080/", 306 | "height": 279 307 | }, 308 | "id": "A8_BOOpDyPQu", 309 | "outputId": "c9505de5-9ea0-4a95-fcab-636a3db811f2" 310 | }, 311 | "source": [ 312 | "plt.scatter(thresholds,np.abs(fpr+tpr-1))\n", 313 | "plt.xlabel(\"Threshold\")\n", 314 | "plt.ylabel(\"|FPR + TPR - 1|\")\n", 315 | "plt.show()" 316 | ], 317 | "execution_count": null, 318 | "outputs": [ 319 | { 320 | "output_type": "display_data", 321 | "data": { 322 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYIAAAEGCAYAAABo25JHAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAf6UlEQVR4nO3df5RcdZnn8feHtsEGkQ4Sd6AgBHYwTmIgrX1YFHfWX2f4MRra+ANYOSsOyszuoAZncjYsLBNYnOjkrDDMMOMyrgcVVgIM9gkjnuAMqHN0wtDYCTE40UyUQOEsGaBxhRZCePaPexsrna57qzp1q6vqfl7n9EnVvbeqnr5dqafu98fzVURgZmblddBcB2BmZnPLicDMrOScCMzMSs6JwMys5JwIzMxK7hVzHcBsHHXUUbFw4cK5DsPMrGs8+OCD/xoR82fa15WJYOHChYyNjc11GGZmXUPSI/X2uWnIzKzknAjMzErOicDMrOScCMzMSs6JwMys5AodNSTpi8C7gSci4g0z7Bfwp8DZwHPAhRHx/SJiGR2vsm7jdh6fmOSYwQFWnbGIkaFKES9lZtZSRX9+FX1FcBNwZsb+s4CT0p+Lgb8sIojR8Sqr7thCdWKSAKoTk6y6Ywuj49UiXs7MrGVGx6tcdufWfT6/Lrtza0s/vwpNBBHxHeCpjEPOAb4ciU3AoKSjWx3HVXdtY8/efctt79kbXHXXtla/lJXU6HiV0z9zLyes/jqnf+Zef8mwllm3cTuTe/bus21yz17WbdzesteY6wllFeDRmvuPpdt+Nv1ASReTXDWwYMGCpl7k6ef2NLXdrBmj41VW3b6FPS8lXzaqE5Osun0LgJsf7YA9PjHZ1PbZ6JrO4oi4MSKGI2J4/vwZZ0mbzYk1G7a9nASm7HkpWLPBV5x24I4ZHGhq+2zMdSKoAsfV3D823WbWNSYmZ76yrLfdrBmrzljEQH/fPtsG+vtYdcailr3GXCeCDcB/UuI04JmI2K9ZyMysrEaGKqxdsZTK4AACKoMDrF2xtKXNjkUPH/0q8DbgKEmPAX8E9ANExOeBu0mGju4gGT76kSLjMTPrRiNDlUL7mwpNBBFxfs7+AH6/yBjMipQ1OuggtTEQswMw101DZl0tq0N4Wv+xWcdyIjA7AFkdwpUWjuowK5ITgVlBWjmqw6xITgRmBfFkMusWTgRmZiXnRGBmVnJOBGZmJedEYGZWck4EZmYl50RgZlZyTgRms+TFZ6xXOBGYzVJWeYl5h/a3MRKzA+NEYDZLWeUl/ug9S9oYidmBcSIwK4BnFVs3cSIwMyu50icCd/iZWdmVPhFcdZcXGDezcitFIhgcqD+C4+nnvMC4mZVbKRLBmuUewWFmVk8pEoFHcJiZ1VeKRGBmZvU5EZiZlZwTgdkseNix9RInArNZcJ0h6yVOBGaz4DpD1kucCMxazKPUrNs4EZiZlZwTgZlZyTkRmJmVnBOBmVnJORGYmZVcoYlA0pmStkvaIWn1DPsXSLpP0rikhySdXWQ8Zma2v8ISgaQ+4AbgLGAxcL6kxdMOuwK4LSKGgPOAvygqHjMzm1mRVwSnAjsiYmdEvADcCpwz7ZgAXp3ePgJ4vMB4zMxsBkUmggrwaM39x9JttdYAF0h6DLgb+Hi9J5N0saQxSWO7d+9uaaCuG2NmZTbXncXnAzdFxLHA2cBXJM0YU0TcGBHDETE8f/78lgbh5SrNrMyKTARV4Lia+8em22pdBNwGEBH/ALwSOKqIYLxcpZnZzIpMBA8AJ0k6QdLBJJ3BG6Ydswt4J4Ck3yBJBK1t90l5uUprFTclWq8pLBFExIvAJcBG4Icko4O2Sbpa0vL0sD8APiZpC/BV4MKIiCLicSEwa5V1G7fPdQhmLfWKIp88Iu4m6QSu3XZlze2HgdOLjMGs1aoTk3X3eS0C60Zz3Vls1nWUsc9rEVg3ciIwa1JW26WbIK0bORGYmZWcE4FZEzxiyHqRE4FZE7xovfUiJwKzJnjReutFpUoEWaM9fMlvB8odxdatSpUIskZ7uN6QmZVVqRJBZXCg7j7XGzKzsipVIlh1xqK5DsHMrOOUKhG4DdfMbH+lSgR53GFsZmXkRFDDHcaWJeuLwkFZQ9LMOlzpEoEXqLHZyppM9lIhxdPN2qN0icAL1NhsZU0myxqRZtbpSpcI3GFsRfCINOtmpUsEZkXwFwzrZk4E03jkkM3E7wvrZZlLVUr6CdmVGZTuvy4irm9lYHPlqru2+dud7cfrFFsvy0wEEXFCuwJpp8GB/rodfx45ZDPxOsXWy0rZNOSRQ9Ysr1NsvWzWiUDSN1oZSDu56cea5XWKrZfl9RG8sd4uYFnrw+kMo+NV/+c2s9LITATAA8C3mfnKeLD14XQGdxibWZnkJYIfAr8bET+evkPSo8WE1B7uMDYzS+T1EazJOObjrQ2lvdxhbI3yHALrdZmJICLuiIgZB1BHxGgxIbWHm36sUZ5DYL2ulMNHG+FvgTbFcwis1zkR1OG1CWyK5xBYryt1IvDaBNYIzyGwXtd0IpB0YxPHnilpu6QdklbXOeaDkh6WtE3S/2k2ngOR12Hs5iEzK4PZXBEMN3KQpD7gBuAsYDFwvqTF0445CbgMOD0ilgArZxHPrI0MVRjor38K3DxkV4xunesQzAo3m0TwRIPHnQrsiIidEfECcCtwzrRjPgbcEBFPA0REo8/dMmtXnFx3n5uHyu2K0a3cvGlX3f3uKLZe0XQiiIgzGzy0AtROOnss3VbrdcDrJH1X0iZJdZ9b0sWSxiSN7d69u7mgM7iN12YyOl7llowkAO4ott4x153FrwBOAt4GnA/8laQZS1dExI0RMRwRw/Pnz29jiFZG6zZuz+wknndov79EWM8oMhFUgeNq7h+bbqv1GLAhIvZExE+AH5EkBrM5lTV3QPhqwHrLgZShPiznkAeAkySdIOlg4Dxgw7RjRkmuBpB0FElT0c7ZxmTWKllzBz502gJfDVhPyU0EkiqShtMPcyS9VtIfA/sVoqsVES8ClwAbSYrX3RYR2yRdLWl5ethG4ElJDwP3Aasi4skD+H1azkNIyymrWeiakaVti8OsHfLWI1gJXA7sAA6R9BfAZ4EvA2/Ke/KIuBu4e9q2K2tuB/Cp9KcjuSS1mfW6vDLUFwOLIuIpSQtI2vBPj4gHiw+tfVyS2mplXQUelNVmZNal8pqGfhkRTwFExC5ge68lAXBJatvXmg31JxK+lNVmZNal8q4IjpV0fc39o2vvR8QnigmrvUaGKqxcv3muw7AOUe/qEKAyONDGSMzaIy8RrJp2v+euBsyaseqMRXMdglnLZSaCiPiSpPnA8STlIibaE5bZ3MjqHxCeiW69KbOPQNJHgW3AnwH/VDPs06wnZfUPuHvAelVe09BKYElE7JZ0InAL+08KM+sZ7h+wMsobNfRCROwGiIidwCHFh2Q2N/JKTrt/wHpVs6OGju3FUUNmo+PVzJLThx3c5/4B61keNdSA0fGqPwR6XFbfAMCn3+uyEta78hLBooj4b22JpIO5zETvy+obcMlp63V5fQSNLkLT9byQfXnl9Q245LT1urwrgj5J86hTlXeq/EQvWLN8iWcXl8zoeJWr7tqWmejdN2BlkHdF8HqSfoGZfsaKDa298v6zuxx1bxkdr7Lq9i25V3vuG7AyyLsieDgihtoSSYe7/Gtb/c2wh6zZsI09ORXk3DdgZTHXaxZ3lKx+gmdf2Ourgh6S1TkMXo7SyiUvEfxpW6LoEHnlqK+6K3uIofUG4eUorVwyE0FE3NSmODrCyFCFgf76p8Sjh8rh2nOXeTlKKxU3DU2zdsXJcx2CzTFfCVjZOBFM4w8BMyubphKBpA8XFUi3cIdx98ubQGZWNs1eEXyykCi6iDuMu9sVo1szi8vNO7T+yDGzXuWmoRm43ERvGh2vcktGEgAPGbVyyk0Eku6TdK+k+4Bfn7ot6d42xDcn8oaRWndat3F75ipjnkBmZdXIFcGFwEfSn0fTf6e29aS8DwO3MXen6sRk3X2eQGZllpsIIuKR9OenwPM19x8pPrzOdPOmXSy76h53HHeRvL+VJ5BZmTXbR/DTIoLoRFn9BJCUKFh1xxYngy6Rt/CMJ5BZmTWVCCJiRVGBdJpG+gn27A2PIuoSXpTerD6PGqpjZKjCBactyD3Oo4g6X95Vmxelt7LLK0NdalPNBbds2pU52sQ622V3PlR3nxeeMfMVQa5rRpZy7bnLMo9xP0HnGh2vMrnnpbr7vfCM2SwTgaRBSZc3cNyZkrZL2iFpdcZx75MUkoZnE0/RRoYqmZ3H7ifoXOs2bs/c76sBs5xEIOk4STdK+htJH5V0mKT/CfwIeG3OY/uAG4CzgMXA+ZIWz3Dc4SSlK+6f7S/RDlmdx+4n6FxZcwdcTsIskXdF8GXgceDPgCUk6xQfA5wcEXl1h04FdkTEzoh4AbgVOGeG4/4H8Fngl80E3m7+5th98prsPIHMLJGXCI6MiDURsTEiLgUOBz4UEf/SwHNXSGYiT3ks3fYySW8EjouIr+c9maSLJY1JGtu9e3cDL29ll9VJDE7uZlMaqTU0T9KRko4EngSOqLk/a5IOAj4H/EEjx0fEjRExHBHD8+fPP5CXthLI6yT23AGzX8kbPnoE8P1p26buB3BixmOrwHE1949Nt005HHgD8C1JAL8GbJC0PCLGcuLqOKPjVX/D7CB5ncSeO2D2K5mJICIWHsBzPwCcJOkEkgRwHvAfa577GeCoqfuSvgX8YTcmAUhGDjkRdI6sTmLPHTDbV96ooddKui4dNfTHkl7d6BNHxIvAJcBG4IfAbRGxTdLVkpYfWNhzw+sU9AbPHTDbVyOjhp4lGTV0OHB9M08eEXdHxOsi4t9GxKfTbVdGxIYZjn1bp18N5NUf8sSyzpBXJtxXA2b7yksER0fE5emooY8DJ7cjqE6V9wFy+de8TsFca2QVMjPbV7Ojhvqm3S+drOahZ1/Y60Vr5tiaDdtyVyEzs33lJYIjgAdrfl5NMmroQZLJZaWT1zx086ZdTgZz5IrRrZnlpsGTyMxmkpkIImJhRJwYESfM8JM1dLRnjQxVGOjPzp83b9rl/oI2Gx2vcnNOk9AFXoXMbEZ5o4Yuqbntr1KptSvyu0rcX9BeeSuQXXDaAq9CZlZHXtPQ79Tc/kqRgXSTRhatefaFvb4qaKOsJqF5h/Y7CZhlaKYMtQqLogtdM7I0Nxm4PHVncL+AWba8EhODkt5LkjBeLWmfNYsj4s7CIusC14ws5a8ffKxuTRtPMmuPrCsv4XkDZnnyrgi+DSwH3g18B3hPzc+7iw2tOzTSX2DFyqoy6iVGzfLl1Rr6SLsC6VYjQxVWrt9cd/8Vo1vdPl0gVxk1O3CZiUBSdiP4r0xExM9bEE9XGhzor9tZefOmXQwff6SbJwqSN1rIVUbN8uX1EXypgecI4CaSukSltGb5ksyrAlcmLcboeDVztJCrjJo1Jq9p6O3tCqSbjQxVWLNhW90PJXcat8boeJV1G7fz+MQkxwwO8NSzz2ce7yqjZo1pZvioZXBl0mKNjle57M6tVCcmCZL1BrL6BjyL2KxxTgQtkveh4zkFB2bNhm1M7tnb8PHuoDdrnBNBC3nhmmI0UkyuliuMmjXHiaCF8pqHrHmNFJOr1d8nzyQ2a5ITQQvlNQ8tu+oe9xU0qZFicpXBAUQyZ2Dd+09x34BZk/KGj1oLTUzu4dL1mxl75Cm3YTfIxeTMiucrghbL6ieAZNKFF69pTN45chOQWWs4EbRYo/0EXrymvtHxKkNX35PZN+DJYmat40TQYlNrFTRSs9uL1+xvar5A3igrTxYzax0nggJcM7KUa89dljuM0YvX7G/dxu258wXmHdrvqwGzFnIiKMjIUIXxK3/Li9c0qToxmblfuG/ArNWcCAp2zcjSzMXun35ujzuOU3nnQcCHXDrCrOWcCNogb/EadxwnSSBv4ti15y7zcFGzAngeQRuMDFUYe+SpzA+6spWqrq0kOnhof27ncGVwoFTnx6ydfEXQJteMLHUtotT0SqJ5v7vwAjNmRXIiaKOyl6oeHa9y+mfuZeX6zU1VEnW/gFmxFNF9y3sPDw/H2NjYXIcxKwtXfz1zf2VwgFVnLOqZD76pJqDqxCSi+cXkLzhtgfsFzFpA0oMRMTzTvkKvCCSdKWm7pB2SVs+w/1OSHpb0kKS/k3R8kfF0grwSFNWJSVbdsaUnrg5Gx6usun3Ly0NCm0kCwknArF0KSwSS+oAbgLOAxcD5khZPO2wcGI6Ik4E7gD8pKp5O0UgJij17oyfmF6zZsI09LzX28d/fJwYH+l+uIuoRQmbtU+SooVOBHRGxE0DSrcA5wMNTB0TEfTXHbwIuKDCejjAyVOGyOx/KXGYRkg7U0fFqVzcRNbqYTK81h5l1myKbhirAozX3H0u31XMR8I0C4+kYa1ecTP9B+dWIeqWJqJ6B/j6uO3cZ3139DicBsznUEaOGJF0ADAPrMo65WNKYpLHdu3e3L7gCjAxVWPeBU6gMDmQet2dvdG1hurwEVhkcYO2KpU4AZh2gyERQBY6ruX9sum0fkt4FXA4sj4jn6z1ZRNwYEcMRMTx//vyWB9tuI0MVvrv6Hbmdx91amO6yOx+qu2/eof2+CjDrIEUmggeAkySdIOlg4DxgQ+0BkoaA/0WSBJ4oMJaOtWb5ktxmonUbt7cpmgM3tZZAVh+Ii8aZdZbCOosj4kVJlwAbgT7gixGxTdLVwFhEbCBpCnoVcLskgF0RsbyomDrR1LfiS2/bTL0pHXkVOTvF1IzhvMlivhIw6yyF1hqKiLuBu6dtu7Lm9ruKfP1uMfXBuHL95rrHdMMIojUbtjW0loCZdZaO6Cy2/G/Jnd5pPDpebWi4qJuFzDqPE0EHyRpF9OwLezt63YI1G7InwE3NFO70qxqzMnIi6CB5FTY7ed2CrKuBwYF+zxQ262BOBB1kZKiSuZoZdObSlnnJafMf/ZavBMw6mBNBh8lbzawT1y3IaxYys87mRNBhRoYquQved5K8TmKPEjLrfE4EHSivLb1TOo1Hx6tcelv9Ia/gUUJm3cCJoENllZ64edOuOU8GU5PHstY18ighs+7gRNCh8tYtuHnTLpZddc+cjSJat3F77uQxjxIy6w5OBB1qZKiSW5BuYnLPnJWqzit74b4Bs+7hRNDB1ixfQt6qBZ1Yqrq/T+4bMOsiTgQdbGSowocaGEHUzlLVU9VFs6x7/ynuGzDrIk4EHe6akaVccNqC3CuDdkw0u2J0K5eu35w7l8FJwKy7OBF0gWtGlnLtuctQRjZ4+rk9hXYej45XuXnTLvKWonffgFn3cSLoEiNDFa794LLMYyYm93Dp+s2FDC3NWnGslvsGzLqPE0EXaWTWcdD64nSj49XMFcfA1UXNupkTQZe5ZmRp7rBSSBa5Of0z97YkIeTVEnJ1UbPu5kTQhdYsX8JAf1/ucdWJyQOeZ3DF6NbMWkKHHdzn6qJmXc6JoAuNDFVYu2JpQx2zBzLPYKqDOMun3+urALNuV+iaxVackaEKI0MVfuO/fyO3/X5qdbO8ppvR8SrrNm7n8YlJjhkc4Klnn8883n0CZr3BVwRdbu2Kk+k/KG+WQXYH8tQksZXrN1OdmCRImpWyEsy8Q/vdJ2DWI5wIutzIUIV1Hzglc73jKTM1EY2OV1l1+5amF7zxMFGz3qHIqiPcoYaHh2NsbGyuw+g4o+NVVq7PXh9gcKCfZyb3cMzgAKvOWMRldz6U27Q03WEH97Ht6jMPJFQzazNJD0bE8Ez7fEXQQxqZZzAxueflpp+V6zc3nQT6++QOYrMe40TQY64ZWcpAf2v+rAP9fVxw2gIqgwMIqAwOuKCcWQ/yqKEetHbFyblNRHkkWLtiqT/0zUrAVwQ9aKqJKH8sUX3XfnCZk4BZSTgR9KipiqVTzTrNVgV1EjArDzcN9bCpSWdTFq7+ekOPcylps3LxFYHtx3MEzMrFiaBEGqlaCm4WMiubQhOBpDMlbZe0Q9LqGfYfIml9uv9+SQuLjKfs1iz3N30z219hiUBSH3ADcBawGDhf0uJph10EPB0Rvw5cC3y2qHjM3/TNbGZFXhGcCuyIiJ0R8QJwK3DOtGPOAb6U3r4DeKeUtTKvHai8mkTuKDYrnyITQQV4tOb+Y+m2GY+JiBeBZ4DXzPRkki6WNCZpbPfu3QWEWw6rzliUud8dxWbl0zWdxRFxY0QMR8Tw/Pnz5zqcrjUyVKFeBYqD++TmI7MSKjIRVIHjau4fm26b8RhJrwCOAJ4sMCYD1n1gGdOXMDhI8CfvP2VuAjKzOVVkIngAOEnSCZIOBs4DNkw7ZgPw4fT2+4F7oxvrYneZkaEKn/vgsn2KyX3OJSXMSquwmcUR8aKkS4CNQB/wxYjYJulqYCwiNgD/G/iKpB3AUyTJwtpg+qxjMyuvQktMRMTdwN3Ttl1Zc/uXwAeKjMHMzLJ1TWexmZkVw4nAzKzknAjMzErOicDMrOTUjaM1Je0GHpnlw48C/rWF4bSK42qO42qO42pOL8Z1fETMOBu3KxPBgZA0FhHDcx3HdI6rOY6rOY6rOWWLy01DZmYl50RgZlZyZUwEN851AHU4ruY4ruY4ruaUKq7S9RGYmdm+ynhFYGZmNZwIzMxKrmcSgaQzJW2XtEPS6hn2HyJpfbr/fkkLa/Zdlm7fLumMNsf1KUkPS3pI0t9JOr5m315Jm9Of6SW8i47rQkm7a17/ozX7Pizpx+nPh6c/tuC4rq2J6UeSJmr2FXm+vijpCUk/qLNfkq5P435I0htr9hV5vvLi+lAaz1ZJ35N0Ss2+n6bbN0saa3Ncb5P0TM3f68qafZnvgYLjWlUT0w/S99SR6b4iz9dxku5LPwu2SfrkDMcU9x6LiK7/ISlz/c/AicDBwBZg8bRj/gvw+fT2ecD69Pbi9PhDgBPS5+lrY1xvBw5Nb//nqbjS+7+Yw/N1IfDnMzz2SGBn+u+89Pa8dsU17fiPk5Q3L/R8pc/9m8AbgR/U2X828A1AwGnA/UWfrwbjesvU6wFnTcWV3v8pcNQcna+3AX9zoO+BVsc17dj3kKyR0o7zdTTwxvT24cCPZvg/Wdh7rFeuCE4FdkTEzoh4AbgVOGfaMecAX0pv3wG8U5LS7bdGxPMR8RNgR/p8bYkrIu6LiOfSu5tIVnIrWiPnq54zgG9GxFMR8TTwTeDMOYrrfOCrLXrtTBHxHZI1M+o5B/hyJDYBg5KOptjzlRtXRHwvfV1o3/urkfNVz4G8N1sdVzvfXz+LiO+nt/8f8EP2X+O9sPdYrySCCvBozf3H2P8kvnxMRLwIPAO8psHHFhlXrYtIMv6UV0oak7RJ0kiLYmomrvell6B3SJpadrQjzlfahHYCcG/N5qLOVyPqxV7k+WrW9PdXAPdIelDSxXMQz5slbZH0DUlL0m0dcb4kHUryYfrXNZvbcr6UNFsPAfdP21XYe6zQhWmscZIuAIaB/1Cz+fiIqEo6EbhX0taI+Oc2hXQX8NWIeF7S75JcTb2jTa/diPOAOyJib822uTxfHU3S20kSwVtrNr81PV+vBb4p6Z/Sb8zt8H2Sv9cvJJ0NjAIntem1G/Ee4LsRUXv1UPj5kvQqkuSzMiJ+3srnztIrVwRV4Lia+8em22Y8RtIrgCOAJxt8bJFxIeldwOXA8oh4fmp7RFTTf3cC3yL5ltCWuCLiyZpYvgC8qdHHFhlXjfOYdtle4PlqRL3YizxfDZF0Msnf8JyIeHJqe835egL4Gq1rEs0VET+PiF+kt+8G+iUdRQecr1TW+6uQ8yWpnyQJ3BIRd85wSHHvsSI6Ptr9Q3Jls5OkqWCqg2nJtGN+n307i29Lby9h387inbSus7iRuIZIOsdOmrZ9HnBIevso4Me0qNOswbiOrrn9XmBT/Kpj6idpfPPS20e2K670uNeTdNypHeer5jUWUr/z87fZtyPvH4s+Xw3GtYCk3+st07YfBhxec/t7wJltjOvXpv5+JB+ou9Jz19B7oKi40v1HkPQjHNau85X+7l8Grss4prD3WMtO7lz/kPSo/4jkQ/XydNvVJN+yAV4J3J7+p/hH4MSax16ePm47cFab4/pb4P8Cm9OfDen2twBb0/8IW4GL2hzXWmBb+vr3Aa+veezvpOdxB/CRdsaV3l8DfGba44o+X18FfgbsIWmDvQj4PeD30v0Cbkjj3goMt+l85cX1BeDpmvfXWLr9xPRcbUn/zpe3Oa5Lat5fm6hJVDO9B9oVV3rMhSQDSGofV/T5eitJH8RDNX+rs9v1HnOJCTOzkuuVPgIzM5slJwIzs5JzIjAzKzknAjOzknMiMDMrOScCKw1Jr6mpLPkvkqrp7QlJDxfwemsk/WGTj/lFne03SXp/ayIz25cTgZVGJLOll0XEMuDzwLXp7WXAS3mPT2ekm/UcJwKzRJ+kv0prwd8jaQBA0rckXZfWn/+kpDdJ+nZaeGxjWv0RSZ/Qr9aVuLXmeRenz7FT0iemNipZh+IH6c/K6cGktef/PK3L/7fAawv+/a3E/A3HLHEScH5EfEzSbcD7gJvTfQdHxHBaC+bbJDV7dks6F/g0yazO1cAJkRTpG6x53teTrDlxOLBd0l8CJwMfAf4dyWzR+yV9OyLGax73XmARyXoZ/wZ4GPhiIb+5lZ4TgVniJxGxOb39IEk9minr038XAW8gqTwJySIqP0v3PQTcImmUpJLmlK9HUrzveUlPkHyovxX4WkQ8CyDpTuDfA7WJ4DdJqr/uBR6XVFtu26ylnAjMEs/X3N4LDNTcfzb9V8C2iHjzDI//bZIP7/cAl0taWud5/X/OOo77CMwatx2YL+nNkJQNlrRE0kHAcRFxH/BfSapXvirjef4eGJF0qKTDSJqB/n7aMd8BzpXUl/ZDvL3Vv4zZFH87MWtQRLyQDuG8XtIRJP9/riOplHlzuk3A9RExkTYfzfQ835d0E0kVXIAvTOsfgKTe/TtI+gZ2Af/Q6t/HbIqrj5qZlZybhszMSs6JwMys5JwIzMxKzonAzKzknAjMzErOicDMrOScCMzMSu7/A7w+5wkLnSc5AAAAAElFTkSuQmCC\n", 323 | "text/plain": [ 324 | "
" 325 | ] 326 | }, 327 | "metadata": { 328 | "tags": [], 329 | "needs_background": "light" 330 | } 331 | } 332 | ] 333 | }, 334 | { 335 | "cell_type": "code", 336 | "metadata": { 337 | "colab": { 338 | "base_uri": "https://localhost:8080/" 339 | }, 340 | "id": "Av9NUfKsy5HQ", 341 | "outputId": "0a0b4fdb-4fdc-483a-ce1b-d1f82d8efcbe" 342 | }, 343 | "source": [ 344 | "thresholds[np.argmin(np.abs(fpr+tpr-1))]" 345 | ], 346 | "execution_count": null, 347 | "outputs": [ 348 | { 349 | "output_type": "execute_result", 350 | "data": { 351 | "text/plain": [ 352 | "0.44625685602433796" 353 | ] 354 | }, 355 | "metadata": { 356 | "tags": [] 357 | }, 358 | "execution_count": 16 359 | } 360 | ] 361 | } 362 | ] 363 | } --------------------------------------------------------------------------------