From 99cac17d3019bf1e30132d836af7ad08a0f0d50e Mon Sep 17 00:00:00 2001 From: MoaazEmam Date: Tue, 5 May 2026 00:56:42 +0300 Subject: [PATCH] fix entry point command, run evaluation --- Dockerfile.prod | 3 +- mlflow.db | Bin 1052672 -> 1138688 bytes models/artifacts/backtest_results.json | 82 +++++++++--------- models/artifacts/best_model.json | 12 +-- .../artifacts/confusion_matrix_adaboost.csv | 6 +- .../confusion_matrix_decision_tree.csv | 6 +- .../artifacts/confusion_matrix_lightgbm.csv | 6 +- .../confusion_matrix_logistic_regression.csv | 6 +- .../confusion_matrix_random_forest.csv | 6 +- .../confusion_matrix_voting_classifier.csv | 6 +- models/artifacts/model_comparison.csv | 14 +-- models/artifacts/training_results.json | 48 +++++----- 12 files changed, 98 insertions(+), 97 deletions(-) diff --git a/Dockerfile.prod b/Dockerfile.prod index 9790e7e..02144dd 100644 --- a/Dockerfile.prod +++ b/Dockerfile.prod @@ -31,6 +31,7 @@ RUN az storage blob download-batch \ --source mlruns \ --destination /app/mlruns/ || echo "No mlruns/ in storage yet, skipping" EXPOSE 8000 8501 + COPY docker/entrypoint.sh /entrypoint.sh RUN chmod +x /entrypoint.sh -CMD ["/entrypoint.sh"] \ No newline at end of file +CMD ["/bin/bash", "/entrypoint.sh"] \ No newline at end of file diff --git a/mlflow.db b/mlflow.db index 2f0cdf70bcf55d1326f7fa026ed69e46f9f89edc..492b80e434d416029c7239645ac15a86a25fb845 100644 GIT binary patch delta 80186 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 delta 16628 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 BLhJwl diff --git a/models/artifacts/backtest_results.json b/models/artifacts/backtest_results.json index 9ee9f3f..0e85b0a 100644 --- a/models/artifacts/backtest_results.json +++ b/models/artifacts/backtest_results.json @@ -2,85 +2,85 @@ "logistic_regression": { "model_name": "logistic_regression", "initial_capital": 500000.0, - "final_capital": 493204.1575020498, - "total_trades": 136738, + "final_capital": 492705.5220935263, + "total_trades": 136657, "metrics": { - "total_return_pct": -0.7007231456740204, - "sharpe_ratio": 0.009860509042075846, - "win_rate": 0.49995612046395294, - "profit_factor": 0.9927246230177307 + "total_return_pct": -0.8011159236488097, + "sharpe_ratio": 0.0027096238618928097, + "win_rate": 0.49990121252478836, + "profit_factor": 0.9921891798679353 } }, "decision_tree": { "model_name": "decision_tree", "initial_capital": 500000.0, - "final_capital": 578881.831804675, - "total_trades": 131809, + "final_capital": 535574.7952353342, + "total_trades": 139347, "metrics": { - "total_return_pct": 15.009130022201145, - "sharpe_ratio": 1.106539644244743, - "win_rate": 0.5029929670963288, - "profit_factor": 1.0827461283809072 + "total_return_pct": 6.638419192753875, + "sharpe_ratio": 0.4680495126617511, + "win_rate": 0.5132295636073974, + "profit_factor": 1.0388947831273074 } }, "adaboost": { "model_name": "adaboost", "initial_capital": 500000.0, - "final_capital": 527884.436830822, - "total_trades": 138862, + "final_capital": 497490.2428801132, + "total_trades": 139963, "metrics": { - "total_return_pct": 6.16692067536555, - "sharpe_ratio": 0.5479899310298146, - "win_rate": 0.5121199464216273, - "profit_factor": 1.0302239065896193 + "total_return_pct": -0.12140197236132355, + "sharpe_ratio": 0.03631951202318103, + "win_rate": 0.5066767645734944, + "profit_factor": 0.9972326441488291 } }, "random_forest": { "model_name": "random_forest", "initial_capital": 500000.0, - "final_capital": 535141.0293030565, - "total_trades": 137898, + "final_capital": 567910.5106008762, + "total_trades": 137675, "metrics": { - "total_return_pct": 6.959293080633122, - "sharpe_ratio": 0.5176854615114458, - "win_rate": 0.5085715528869165, - "profit_factor": 1.0360523930337522 + "total_return_pct": 14.323199716288414, + "sharpe_ratio": 1.029771534052213, + "win_rate": 0.5054512438714364, + "profit_factor": 1.06602984774183 } }, "lightgbm": { "model_name": "lightgbm", "initial_capital": 500000.0, - "final_capital": 502976.41332192585, - "total_trades": 133002, + "final_capital": 504583.0645151714, + "total_trades": 133377, "metrics": { - "total_return_pct": 1.2614237556337615, - "sharpe_ratio": 0.14759871549408887, - "win_rate": 0.49972932737853565, - "profit_factor": 1.0030046186448662 + "total_return_pct": 1.6038144528949472, + "sharpe_ratio": 0.17137856645149313, + "win_rate": 0.5027628451682075, + "profit_factor": 1.0046778475452267 } }, "voting_classifier": { "model_name": "voting_classifier", "initial_capital": 500000.0, - "final_capital": 511678.2427597648, - "total_trades": 135828, + "final_capital": 508977.30249215994, + "total_trades": 136029, "metrics": { - "total_return_pct": 3.0150256782757623, - "sharpe_ratio": 0.2756268746125455, - "win_rate": 0.5035338810849015, - "profit_factor": 1.0119298707075866 + "total_return_pct": 2.4780097080419727, + "sharpe_ratio": 0.24514815714230245, + "win_rate": 0.5021943850208411, + "profit_factor": 1.0091277291482916 } }, "naive_buy_baseline": { "model_name": "naive_buy_baseline", "initial_capital": 500000.0, - "final_capital": 583926.7224497921, + "final_capital": 583902.3325100574, "total_trades": 151524, "metrics": { - "total_return_pct": 17.606993973683593, - "sharpe_ratio": 0.9842788949006163, - "win_rate": 0.5174163828832397, - "profit_factor": 1.0829189840007805 + "total_return_pct": 17.602081666393786, + "sharpe_ratio": 0.9840903604306787, + "win_rate": 0.5174097832686572, + "profit_factor": 1.0828999784672162 } } } \ No newline at end of file diff --git a/models/artifacts/best_model.json b/models/artifacts/best_model.json index 0fa5eee..60b8681 100644 --- a/models/artifacts/best_model.json +++ b/models/artifacts/best_model.json @@ -1,10 +1,10 @@ { "model_name": "lightgbm", "model_path": "models/lightgbm.pkl", - "test_f1_macro": 0.0, - "test_accuracy": 0.0, - "test_precision_macro": 0.0, - "test_recall_macro": 0.0, - "test_mcc": 0.1183, - "selected_at": "2026-05-04T15:21:09.345798+00:00Z" + "test_f1_macro": 0.4073584602583696, + "test_accuracy": 0.417024663986895, + "test_precision_macro": 0.43576849537949297, + "test_recall_macro": 0.417024663986895, + "test_mcc": 0.10451422641901091, + "selected_at": "2026-05-04T21:13:44.737894+00:00Z" } \ No newline at end of file diff --git a/models/artifacts/confusion_matrix_adaboost.csv b/models/artifacts/confusion_matrix_adaboost.csv index ee0df42..c693be7 100644 --- a/models/artifacts/confusion_matrix_adaboost.csv +++ b/models/artifacts/confusion_matrix_adaboost.csv @@ -1,4 +1,4 @@ ,Pred Hold,Pred Buy,Pred Sell -Hold,46820,3038,12092 -Buy,28556,5761,5404 -Sell,37832,2923,9577 +Hold,45241,3032,13678 +Buy,28304,5669,5747 +Sell,36772,2938,10622 diff --git a/models/artifacts/confusion_matrix_decision_tree.csv b/models/artifacts/confusion_matrix_decision_tree.csv index 1b81e94..77a7b33 100644 --- a/models/artifacts/confusion_matrix_decision_tree.csv +++ b/models/artifacts/confusion_matrix_decision_tree.csv @@ -1,4 +1,4 @@ ,Pred Hold,Pred Buy,Pred Sell -Hold,34039,5565,22346 -Buy,21613,7929,10179 -Sell,26686,5034,18612 +Hold,33257,3765,24929 +Buy,21340,5300,13080 +Sell,26159,3149,21024 diff --git a/models/artifacts/confusion_matrix_lightgbm.csv b/models/artifacts/confusion_matrix_lightgbm.csv index 0139c4d..43ec5b0 100644 --- a/models/artifacts/confusion_matrix_lightgbm.csv +++ b/models/artifacts/confusion_matrix_lightgbm.csv @@ -1,4 +1,4 @@ ,Pred Hold,Pred Buy,Pred Sell -Hold,27783,5582,28585 -Buy,13376,9794,16551 -Sell,19146,3892,27294 +Hold,26473,5541,29937 +Buy,13067,8926,17727 +Sell,18492,3850,27990 diff --git a/models/artifacts/confusion_matrix_logistic_regression.csv b/models/artifacts/confusion_matrix_logistic_regression.csv index ab8f887..4ff8dce 100644 --- a/models/artifacts/confusion_matrix_logistic_regression.csv +++ b/models/artifacts/confusion_matrix_logistic_regression.csv @@ -1,4 +1,4 @@ ,Pred Hold,Pred Buy,Pred Sell -Hold,29952,4493,27505 -Buy,17248,8002,14471 -Sell,23531,2611,24190 +Hold,37905,4572,19474 +Buy,22756,7745,9219 +Sell,30309,2657,17366 diff --git a/models/artifacts/confusion_matrix_random_forest.csv b/models/artifacts/confusion_matrix_random_forest.csv index e68d473..7aba26c 100644 --- a/models/artifacts/confusion_matrix_random_forest.csv +++ b/models/artifacts/confusion_matrix_random_forest.csv @@ -1,4 +1,4 @@ ,Pred Hold,Pred Buy,Pred Sell -Hold,39225,4054,18671 -Buy,21213,7325,11183 -Sell,29766,2836,17730 +Hold,34209,4077,23665 +Buy,17679,7300,14741 +Sell,24995,2680,22657 diff --git a/models/artifacts/confusion_matrix_voting_classifier.csv b/models/artifacts/confusion_matrix_voting_classifier.csv index 9b0629f..1f43bb4 100644 --- a/models/artifacts/confusion_matrix_voting_classifier.csv +++ b/models/artifacts/confusion_matrix_voting_classifier.csv @@ -1,4 +1,4 @@ ,Pred Hold,Pred Buy,Pred Sell -Hold,31878,4486,25586 -Buy,16279,8415,15027 -Sell,22826,3114,24392 +Hold,29621,4591,27739 +Buy,14984,7937,16799 +Sell,20986,3146,26200 diff --git a/models/artifacts/model_comparison.csv b/models/artifacts/model_comparison.csv index fb81058..92addb6 100644 --- a/models/artifacts/model_comparison.csv +++ b/models/artifacts/model_comparison.csv @@ -1,7 +1,7 @@ -model,train_accuracy,test_accuracy,cv_accuracy,overfit_gap,train_time_s -logistic_regression,0.4483937946341601,0.40883014697175035,0.3877766233304916,0.03956364766240977,1360.18 -decision_tree,0.4823761149694377,0.39855396639517904,0.3804392227905655,0.08382214857425868,13.56 -adaboost,0.4685643972379895,0.4089551453270352,0.3916595623756749,0.059609251910954286,4792.6 -random_forest,0.5800421927579644,0.4231457480822621,0.39460562304631996,0.15689644467570235,683.38 -lightgbm,0.6146572379561654,0.42779042381021304,0.4080615942028986,0.1868668141459524,479.19 -voting_classifier,0.6056908606223682,0.4261654451915106,,0.1795254154308576,1994.97 +Model,Train Acc,Test Acc,Overfit Gap,Weighted F1,MCC,Signal Precision (B),Hold Recall (B) +logistic_regression,0.4393,0.4146,0.0248,0.3954,0.0749,0.4471,0.6119 +decision_tree,0.4798,0.392,0.0878,0.3706,0.0426,0.395,0.5368 +adaboost,0.4664,0.4048,0.0616,0.3593,0.0444,0.4203,0.7303 +random_forest,0.5792,0.4221,0.157,0.4065,0.0958,0.4452,0.5522 +lightgbm,0.5989,0.417,0.1818,0.4074,0.1045,0.4286,0.4273 +voting_classifier,0.5931,0.4195,0.1736,0.4075,0.1008,0.4384,0.4781 diff --git a/models/artifacts/training_results.json b/models/artifacts/training_results.json index 29fd040..fa12da1 100644 --- a/models/artifacts/training_results.json +++ b/models/artifacts/training_results.json @@ -1,15 +1,15 @@ { - "generated_at": "2026-05-03T16:58:59.199060+00:00", + "generated_at": "2026-05-04T21:02:49.210784+00:00", "models": { "logistic_regression": { "best_params": { "C": 0.1, "l1_ratio": 0.1 }, - "cv_accuracy": 0.3877766233304916, - "train_accuracy": 0.4483937946341601, - "test_accuracy": 0.40883014697175035, - "train_time_s": 1360.18, + "cv_accuracy": 0.3884759519749929, + "train_accuracy": 0.43933157502131287, + "test_accuracy": 0.4145707650506898, + "train_time_s": 97.81, "artifact_path": "models/logistic_regression.pkl" }, "decision_tree": { @@ -17,10 +17,10 @@ "max_depth": 8, "min_samples_leaf": 200 }, - "cv_accuracy": 0.3804392227905655, - "train_accuracy": 0.4823761149694377, - "test_accuracy": 0.39855396639517904, - "train_time_s": 13.56, + "cv_accuracy": 0.4016943734015345, + "train_accuracy": 0.4797877371057119, + "test_accuracy": 0.39197252685802253, + "train_time_s": 3.23, "artifact_path": "models/decision_tree.pkl" }, "adaboost": { @@ -28,10 +28,10 @@ "learning_rate": 0.1, "n_estimators": 200 }, - "cv_accuracy": 0.3916595623756749, - "train_accuracy": 0.4685643972379895, - "test_accuracy": 0.4089551453270352, - "train_time_s": 4792.6, + "cv_accuracy": 0.39465668513782326, + "train_accuracy": 0.4663806079497016, + "test_accuracy": 0.4048077998460557, + "train_time_s": 754.96, "artifact_path": "models/adaboost.pkl" }, "random_forest": { @@ -40,10 +40,10 @@ "max_samples": 0.7, "min_samples_leaf": 100 }, - "cv_accuracy": 0.39460562304631996, - "train_accuracy": 0.5800421927579644, - "test_accuracy": 0.4231457480822621, - "train_time_s": 683.38, + "cv_accuracy": 0.3956046639670361, + "train_accuracy": 0.5791756580349531, + "test_accuracy": 0.4221364052025289, + "train_time_s": 204.96, "artifact_path": "models/random_forest.pkl" }, "lightgbm": { @@ -54,10 +54,10 @@ "num_leaves": 48, "reg_lambda": 1.0 }, - "cv_accuracy": 0.4080615942028986, - "train_accuracy": 0.6146572379561654, - "test_accuracy": 0.42779042381021304, - "train_time_s": 479.19, + "cv_accuracy": 0.3952450092355783, + "train_accuracy": 0.5988517689684569, + "test_accuracy": 0.417024663986895, + "train_time_s": 1833.6, "artifact_path": "models/lightgbm.pkl" }, "voting_classifier": { @@ -70,9 +70,9 @@ "voting": "soft" }, "cv_accuracy": null, - "train_accuracy": 0.6056908606223682, - "test_accuracy": 0.4261654451915106, - "train_time_s": 1994.97, + "train_accuracy": 0.5930540014919011, + "test_accuracy": 0.41945224765300687, + "train_time_s": 469.87, "artifact_path": "models/voting_classifier.pkl" } }