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 2f0cdf7..492b80e 100644 Binary files a/mlflow.db and b/mlflow.db differ 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" } }