├── 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 | "
"
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 | " Open | \n",
161 | " High | \n",
162 | " Low | \n",
163 | " Close | \n",
164 | " Volume | \n",
165 | " Dividends | \n",
166 | " Stock Splits | \n",
167 | " Bullish swing | \n",
168 | " Bearish swing | \n",
169 | " Bullish pinbar | \n",
170 | " Bearish pinbar | \n",
171 | " Inside bar | \n",
172 | " Outside bar | \n",
173 | " Bullish engulfing | \n",
174 | " Bearish engulfing | \n",
175 | "
\n",
176 | " \n",
177 | " | Date | \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 | " | 2020-06-03 | \n",
198 | " 307.649227 | \n",
199 | " 310.604352 | \n",
200 | " 307.351744 | \n",
201 | " 309.573029 | \n",
202 | " 92567600 | \n",
203 | " 0.0 | \n",
204 | " 0 | \n",
205 | " False | \n",
206 | " False | \n",
207 | " False | \n",
208 | " False | \n",
209 | " False | \n",
210 | " False | \n",
211 | " False | \n",
212 | " False | \n",
213 | "
\n",
214 | " \n",
215 | " | 2020-06-04 | \n",
216 | " 308.511945 | \n",
217 | " 310.386176 | \n",
218 | " 306.498898 | \n",
219 | " 308.759857 | \n",
220 | " 75794400 | \n",
221 | " 0.0 | \n",
222 | " 0 | \n",
223 | " False | \n",
224 | " False | \n",
225 | " False | \n",
226 | " False | \n",
227 | " False | \n",
228 | " False | \n",
229 | " False | \n",
230 | " False | \n",
231 | "
\n",
232 | " \n",
233 | " | 2020-06-05 | \n",
234 | " 314.580853 | \n",
235 | " 318.587093 | \n",
236 | " 314.511430 | \n",
237 | " 316.673218 | \n",
238 | " 150524700 | \n",
239 | " 0.0 | \n",
240 | " 0 | \n",
241 | " True | \n",
242 | " False | \n",
243 | " False | \n",
244 | " False | \n",
245 | " False | \n",
246 | " False | \n",
247 | " False | \n",
248 | " False | \n",
249 | "
\n",
250 | " \n",
251 | " | 2020-06-08 | \n",
252 | " 317.545882 | \n",
253 | " 320.709245 | \n",
254 | " 316.960812 | \n",
255 | " 320.501007 | \n",
256 | " 73641200 | \n",
257 | " 0.0 | \n",
258 | " 0 | \n",
259 | " False | \n",
260 | " False | \n",
261 | " False | \n",
262 | " False | \n",
263 | " False | \n",
264 | " False | \n",
265 | " False | \n",
266 | " False | \n",
267 | "
\n",
268 | " \n",
269 | " | 2020-06-09 | \n",
270 | " 317.625216 | \n",
271 | " 320.580342 | \n",
272 | " 316.693064 | \n",
273 | " 318.111145 | \n",
274 | " 77479200 | \n",
275 | " 0.0 | \n",
276 | " 0 | \n",
277 | " False | \n",
278 | " True | \n",
279 | " False | \n",
280 | " False | \n",
281 | " False | \n",
282 | " False | \n",
283 | " False | \n",
284 | " False | \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 | " | 2020-10-27 | \n",
306 | " 339.760010 | \n",
307 | " 340.119995 | \n",
308 | " 337.989990 | \n",
309 | " 338.220001 | \n",
310 | " 65994100 | \n",
311 | " 0.0 | \n",
312 | " 0 | \n",
313 | " True | \n",
314 | " False | \n",
315 | " False | \n",
316 | " False | \n",
317 | " True | \n",
318 | " False | \n",
319 | " False | \n",
320 | " False | \n",
321 | "
\n",
322 | " \n",
323 | " | 2020-10-28 | \n",
324 | " 332.100006 | \n",
325 | " 338.250000 | \n",
326 | " 326.130005 | \n",
327 | " 326.660004 | \n",
328 | " 127094300 | \n",
329 | " 0.0 | \n",
330 | " 0 | \n",
331 | " False | \n",
332 | " False | \n",
333 | " False | \n",
334 | " False | \n",
335 | " False | \n",
336 | " False | \n",
337 | " False | \n",
338 | " False | \n",
339 | "
\n",
340 | " \n",
341 | " | 2020-10-29 | \n",
342 | " 326.910004 | \n",
343 | " 333.399994 | \n",
344 | " 325.089996 | \n",
345 | " 329.980011 | \n",
346 | " 90597700 | \n",
347 | " 0.0 | \n",
348 | " 0 | \n",
349 | " False | \n",
350 | " False | \n",
351 | " False | \n",
352 | " False | \n",
353 | " False | \n",
354 | " False | \n",
355 | " False | \n",
356 | " False | \n",
357 | "
\n",
358 | " \n",
359 | " | 2020-10-30 | \n",
360 | " 328.279999 | \n",
361 | " 329.690002 | \n",
362 | " 322.600006 | \n",
363 | " 326.540009 | \n",
364 | " 120287300 | \n",
365 | " 0.0 | \n",
366 | " 0 | \n",
367 | " False | \n",
368 | " False | \n",
369 | " True | \n",
370 | " False | \n",
371 | " False | \n",
372 | " False | \n",
373 | " False | \n",
374 | " False | \n",
375 | "
\n",
376 | " \n",
377 | " | 2020-11-02 | \n",
378 | " 330.200012 | \n",
379 | " 332.359985 | \n",
380 | " 327.239990 | \n",
381 | " 330.200012 | \n",
382 | " 85702800 | \n",
383 | " 0.0 | \n",
384 | " 0 | \n",
385 | " True | \n",
386 | " False | \n",
387 | " False | \n",
388 | " False | \n",
389 | " False | \n",
390 | " False | \n",
391 | " False | \n",
392 | " False | \n",
393 | "
\n",
394 | " \n",
395 | "
\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 | " Open | \n",
114 | " High | \n",
115 | " Low | \n",
116 | " Close | \n",
117 | " Volume | \n",
118 | " Dividends | \n",
119 | " Stock Splits | \n",
120 | "
\n",
121 | " \n",
122 | " | Date | \n",
123 | " | \n",
124 | " | \n",
125 | " | \n",
126 | " | \n",
127 | " | \n",
128 | " | \n",
129 | " | \n",
130 | "
\n",
131 | " \n",
132 | " \n",
133 | " \n",
134 | " | 2020-08-31 | \n",
135 | " 293.95 | \n",
136 | " 296.88 | \n",
137 | " 291.55 | \n",
138 | " 293.20 | \n",
139 | " 17345100 | \n",
140 | " 0 | \n",
141 | " 0 | \n",
142 | "
\n",
143 | " \n",
144 | " | 2020-09-01 | \n",
145 | " 294.71 | \n",
146 | " 301.49 | \n",
147 | " 292.71 | \n",
148 | " 295.44 | \n",
149 | " 17320900 | \n",
150 | " 0 | \n",
151 | " 0 | \n",
152 | "
\n",
153 | " \n",
154 | " | 2020-09-02 | \n",
155 | " 298.88 | \n",
156 | " 303.60 | \n",
157 | " 293.05 | \n",
158 | " 302.50 | \n",
159 | " 24341400 | \n",
160 | " 0 | \n",
161 | " 0 | \n",
162 | "
\n",
163 | " \n",
164 | " | 2020-09-03 | \n",
165 | " 295.99 | \n",
166 | " 297.60 | \n",
167 | " 283.63 | \n",
168 | " 291.12 | \n",
169 | " 32294100 | \n",
170 | " 0 | \n",
171 | " 0 | \n",
172 | "
\n",
173 | " \n",
174 | " | 2020-09-04 | \n",
175 | " 287.25 | \n",
176 | " 289.00 | \n",
177 | " 271.14 | \n",
178 | " 282.73 | \n",
179 | " 30333700 | \n",
180 | " 0 | \n",
181 | " 0 | \n",
182 | "
\n",
183 | " \n",
184 | " | 2020-09-08 | \n",
185 | " 271.28 | \n",
186 | " 279.30 | \n",
187 | " 269.42 | \n",
188 | " 271.16 | \n",
189 | " 24864000 | \n",
190 | " 0 | \n",
191 | " 0 | \n",
192 | "
\n",
193 | " \n",
194 | " | 2020-09-09 | \n",
195 | " 275.77 | \n",
196 | " 278.48 | \n",
197 | " 271.35 | \n",
198 | " 273.72 | \n",
199 | " 22918800 | \n",
200 | " 0 | \n",
201 | " 0 | \n",
202 | "
\n",
203 | " \n",
204 | " | 2020-09-10 | \n",
205 | " 275.51 | \n",
206 | " 279.16 | \n",
207 | " 267.03 | \n",
208 | " 268.09 | \n",
209 | " 24814700 | \n",
210 | " 0 | \n",
211 | " 0 | \n",
212 | "
\n",
213 | " \n",
214 | " | 2020-09-11 | \n",
215 | " 270.06 | \n",
216 | " 271.39 | \n",
217 | " 262.64 | \n",
218 | " 266.61 | \n",
219 | " 18913900 | \n",
220 | " 0 | \n",
221 | " 0 | \n",
222 | "
\n",
223 | " \n",
224 | " | 2020-09-14 | \n",
225 | " 270.95 | \n",
226 | " 276.64 | \n",
227 | " 265.70 | \n",
228 | " 266.15 | \n",
229 | " 24093800 | \n",
230 | " 0 | \n",
231 | " 0 | \n",
232 | "
\n",
233 | " \n",
234 | " | 2020-09-15 | \n",
235 | " 270.67 | \n",
236 | " 274.52 | \n",
237 | " 269.30 | \n",
238 | " 272.42 | \n",
239 | " 18478500 | \n",
240 | " 0 | \n",
241 | " 0 | \n",
242 | "
\n",
243 | " \n",
244 | " | 2020-09-16 | \n",
245 | " 267.29 | \n",
246 | " 272.44 | \n",
247 | " 261.79 | \n",
248 | " 263.52 | \n",
249 | " 29183400 | \n",
250 | " 0 | \n",
251 | " 0 | \n",
252 | "
\n",
253 | " \n",
254 | " | 2020-09-17 | \n",
255 | " 258.28 | \n",
256 | " 261.50 | \n",
257 | " 250.19 | \n",
258 | " 254.82 | \n",
259 | " 31281400 | \n",
260 | " 0 | \n",
261 | " 0 | \n",
262 | "
\n",
263 | " \n",
264 | " | 2020-09-18 | \n",
265 | " 258.40 | \n",
266 | " 259.20 | \n",
267 | " 250.05 | \n",
268 | " 252.53 | \n",
269 | " 28130800 | \n",
270 | " 0 | \n",
271 | " 0 | \n",
272 | "
\n",
273 | " \n",
274 | " | 2020-09-21 | \n",
275 | " 247.54 | \n",
276 | " 249.95 | \n",
277 | " 244.13 | \n",
278 | " 248.15 | \n",
279 | " 24709400 | \n",
280 | " 0 | \n",
281 | " 0 | \n",
282 | "
\n",
283 | " \n",
284 | " | 2020-09-22 | \n",
285 | " 253.31 | \n",
286 | " 255.32 | \n",
287 | " 248.22 | \n",
288 | " 254.75 | \n",
289 | " 30293100 | \n",
290 | " 0 | \n",
291 | " 0 | \n",
292 | "
\n",
293 | " \n",
294 | " | 2020-09-23 | \n",
295 | " 255.26 | \n",
296 | " 257.99 | \n",
297 | " 248.15 | \n",
298 | " 249.02 | \n",
299 | " 19641300 | \n",
300 | " 0 | \n",
301 | " 0 | \n",
302 | "
\n",
303 | " \n",
304 | " | 2020-09-24 | \n",
305 | " 246.50 | \n",
306 | " 252.24 | \n",
307 | " 245.62 | \n",
308 | " 249.53 | \n",
309 | " 20006800 | \n",
310 | " 0 | \n",
311 | " 0 | \n",
312 | "
\n",
313 | " \n",
314 | " | 2020-09-25 | \n",
315 | " 249.40 | \n",
316 | " 255.75 | \n",
317 | " 246.61 | \n",
318 | " 254.82 | \n",
319 | " 18351300 | \n",
320 | " 0 | \n",
321 | " 0 | \n",
322 | "
\n",
323 | " \n",
324 | " | 2020-09-28 | \n",
325 | " 259.40 | \n",
326 | " 259.60 | \n",
327 | " 254.82 | \n",
328 | " 256.82 | \n",
329 | " 18807800 | \n",
330 | " 0 | \n",
331 | " 0 | \n",
332 | "
\n",
333 | " \n",
334 | "
\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 | " Open | \n",
444 | " High | \n",
445 | " Low | \n",
446 | " Close | \n",
447 | " Volume | \n",
448 | " Dividends | \n",
449 | " Stock Splits | \n",
450 | " Pivot | \n",
451 | " R1 | \n",
452 | " S1 | \n",
453 | " R2 | \n",
454 | " S2 | \n",
455 | " R3 | \n",
456 | " S3 | \n",
457 | "
\n",
458 | " \n",
459 | " | Date | \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 | " | 2020-09-28 | \n",
479 | " 259.4 | \n",
480 | " 259.6 | \n",
481 | " 254.82 | \n",
482 | " 256.82 | \n",
483 | " 18807800 | \n",
484 | " 0 | \n",
485 | " 0 | \n",
486 | " 257.08 | \n",
487 | " 259.34 | \n",
488 | " 254.56 | \n",
489 | " 261.86 | \n",
490 | " 252.3 | \n",
491 | " 266.64 | \n",
492 | " 247.52 | \n",
493 | "
\n",
494 | " \n",
495 | "
\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 | }
--------------------------------------------------------------------------------