diff --git a/gru_sac_predictor/__pycache__/main.cpython-312.pyc b/gru_sac_predictor/__pycache__/main.cpython-312.pyc index 9d6bfd93..6eaa0804 100644 Binary files a/gru_sac_predictor/__pycache__/main.cpython-312.pyc and b/gru_sac_predictor/__pycache__/main.cpython-312.pyc differ diff --git a/gru_sac_predictor/logs/20250416_183051/main_20250416_183051.log b/gru_sac_predictor/logs/20250416_183051/main_20250416_183051.log new file mode 100644 index 00000000..e69de29b diff --git a/gru_sac_predictor/logs/20250416_183508/main_20250416_183508.log b/gru_sac_predictor/logs/20250416_183508/main_20250416_183508.log new file mode 100644 index 00000000..e69de29b diff --git a/gru_sac_predictor/main.py b/gru_sac_predictor/main.py index 16a0460a..aff76c8b 100644 --- a/gru_sac_predictor/main.py +++ b/gru_sac_predictor/main.py @@ -97,7 +97,7 @@ SAC_REWARD_SCALE = 1.0 # Decreased from 10.0 -> 2.0 -> 1.0 SAC_USE_BATCH_NORM = True SAC_USE_RESIDUAL = True SAC_MODEL_DIR = 'models/simplified_sac' # Default dir within the agent class -SAC_EPOCHS = 50 # Keep this from previous config for training loop control +SAC_EPOCHS = 5 # Keep this from previous config for training loop control # V7.9 Experience Generation Config (Based on instructions.txt) # TOTAL_TRAINING_STEPS = 1000 # Removed - Not used in current training loop diff --git a/gru_sac_predictor/models/run_20250416_182038/sac_agent/actor.weights.h5 b/gru_sac_predictor/models/run_20250416_182038/sac_agent/actor.weights.h5 new file mode 100644 index 00000000..82f6ff98 Binary files /dev/null and b/gru_sac_predictor/models/run_20250416_182038/sac_agent/actor.weights.h5 differ diff --git a/gru_sac_predictor/models/run_20250416_182038/sac_agent/alpha.npy b/gru_sac_predictor/models/run_20250416_182038/sac_agent/alpha.npy new file mode 100644 index 00000000..5b9784ad Binary files /dev/null and b/gru_sac_predictor/models/run_20250416_182038/sac_agent/alpha.npy differ diff --git a/gru_sac_predictor/models/run_20250416_182038/sac_agent/critic_1.weights.h5 b/gru_sac_predictor/models/run_20250416_182038/sac_agent/critic_1.weights.h5 new file mode 100644 index 00000000..b5625db8 Binary files /dev/null and b/gru_sac_predictor/models/run_20250416_182038/sac_agent/critic_1.weights.h5 differ diff --git a/gru_sac_predictor/models/run_20250416_182038/sac_agent/critic_2.weights.h5 b/gru_sac_predictor/models/run_20250416_182038/sac_agent/critic_2.weights.h5 new file mode 100644 index 00000000..2367e829 Binary files /dev/null and b/gru_sac_predictor/models/run_20250416_182038/sac_agent/critic_2.weights.h5 differ diff --git a/gru_sac_predictor/models/run_20250416_182038/sac_agent/target_critic_1.weights.h5 b/gru_sac_predictor/models/run_20250416_182038/sac_agent/target_critic_1.weights.h5 new file mode 100644 index 00000000..1d4ceebd Binary files /dev/null and b/gru_sac_predictor/models/run_20250416_182038/sac_agent/target_critic_1.weights.h5 differ diff --git a/gru_sac_predictor/models/run_20250416_182038/sac_agent/target_critic_2.weights.h5 b/gru_sac_predictor/models/run_20250416_182038/sac_agent/target_critic_2.weights.h5 new file mode 100644 index 00000000..984a526e Binary files /dev/null and b/gru_sac_predictor/models/run_20250416_182038/sac_agent/target_critic_2.weights.h5 differ diff --git a/gru_sac_predictor/models/run_20250416_183051/sac_agent/actor.weights.h5 b/gru_sac_predictor/models/run_20250416_183051/sac_agent/actor.weights.h5 new file mode 100644 index 00000000..37063e4f Binary files /dev/null and b/gru_sac_predictor/models/run_20250416_183051/sac_agent/actor.weights.h5 differ diff --git a/gru_sac_predictor/models/run_20250416_183051/sac_agent/alpha.npy b/gru_sac_predictor/models/run_20250416_183051/sac_agent/alpha.npy new file mode 100644 index 00000000..3f8055fd Binary files /dev/null and b/gru_sac_predictor/models/run_20250416_183051/sac_agent/alpha.npy differ diff --git a/gru_sac_predictor/models/run_20250416_183051/sac_agent/critic_1.weights.h5 b/gru_sac_predictor/models/run_20250416_183051/sac_agent/critic_1.weights.h5 new file mode 100644 index 00000000..7c96ab2d Binary files /dev/null and b/gru_sac_predictor/models/run_20250416_183051/sac_agent/critic_1.weights.h5 differ diff --git a/gru_sac_predictor/models/run_20250416_183051/sac_agent/critic_2.weights.h5 b/gru_sac_predictor/models/run_20250416_183051/sac_agent/critic_2.weights.h5 new file mode 100644 index 00000000..9ae51864 Binary files /dev/null and b/gru_sac_predictor/models/run_20250416_183051/sac_agent/critic_2.weights.h5 differ diff --git a/gru_sac_predictor/models/run_20250416_183051/sac_agent/target_critic_1.weights.h5 b/gru_sac_predictor/models/run_20250416_183051/sac_agent/target_critic_1.weights.h5 new file mode 100644 index 00000000..f117f012 Binary files /dev/null and b/gru_sac_predictor/models/run_20250416_183051/sac_agent/target_critic_1.weights.h5 differ diff --git a/gru_sac_predictor/models/run_20250416_183051/sac_agent/target_critic_2.weights.h5 b/gru_sac_predictor/models/run_20250416_183051/sac_agent/target_critic_2.weights.h5 new file mode 100644 index 00000000..89952e05 Binary files /dev/null and b/gru_sac_predictor/models/run_20250416_183051/sac_agent/target_critic_2.weights.h5 differ diff --git a/gru_sac_predictor/models/run_20250416_183508/sac_agent/actor.weights.h5 b/gru_sac_predictor/models/run_20250416_183508/sac_agent/actor.weights.h5 new file mode 100644 index 00000000..d347bb7e Binary files /dev/null and b/gru_sac_predictor/models/run_20250416_183508/sac_agent/actor.weights.h5 differ diff --git a/gru_sac_predictor/models/run_20250416_183508/sac_agent/alpha.npy b/gru_sac_predictor/models/run_20250416_183508/sac_agent/alpha.npy new file mode 100644 index 00000000..4f7d1b57 Binary files /dev/null and b/gru_sac_predictor/models/run_20250416_183508/sac_agent/alpha.npy differ diff --git a/gru_sac_predictor/models/run_20250416_183508/sac_agent/critic_1.weights.h5 b/gru_sac_predictor/models/run_20250416_183508/sac_agent/critic_1.weights.h5 new file mode 100644 index 00000000..b6909207 Binary files /dev/null and b/gru_sac_predictor/models/run_20250416_183508/sac_agent/critic_1.weights.h5 differ diff --git a/gru_sac_predictor/models/run_20250416_183508/sac_agent/critic_2.weights.h5 b/gru_sac_predictor/models/run_20250416_183508/sac_agent/critic_2.weights.h5 new file mode 100644 index 00000000..1729e426 Binary files /dev/null and b/gru_sac_predictor/models/run_20250416_183508/sac_agent/critic_2.weights.h5 differ diff --git a/gru_sac_predictor/models/run_20250416_183508/sac_agent/target_critic_1.weights.h5 b/gru_sac_predictor/models/run_20250416_183508/sac_agent/target_critic_1.weights.h5 new file mode 100644 index 00000000..00081b5d Binary files /dev/null and b/gru_sac_predictor/models/run_20250416_183508/sac_agent/target_critic_1.weights.h5 differ diff --git a/gru_sac_predictor/models/run_20250416_183508/sac_agent/target_critic_2.weights.h5 b/gru_sac_predictor/models/run_20250416_183508/sac_agent/target_critic_2.weights.h5 new file mode 100644 index 00000000..d2f9f298 Binary files /dev/null and b/gru_sac_predictor/models/run_20250416_183508/sac_agent/target_critic_2.weights.h5 differ diff --git a/gru_sac_predictor/results/20250416_182038/backtest_performance_report_20250416_182038.md b/gru_sac_predictor/results/20250416_182038/backtest_performance_report_20250416_182038.md new file mode 100644 index 00000000..3e495997 --- /dev/null +++ b/gru_sac_predictor/results/20250416_182038/backtest_performance_report_20250416_182038.md @@ -0,0 +1,41 @@ +# GRU+SAC Backtesting Performance Report + +Report generated on: 2025-04-16 18:25:01.350032 +Data range: N/A +Total duration: N/A + +## Strategy Performance Metrics + +* **Initial capital:** $0.00 +* **Final portfolio value:** $0.00 +* **Total return:** 0.00% +* **Annualized return:** 0.00% +* **Sharpe ratio (annualized):** 0.0000 +* **Sortino ratio (annualized):** 0.0000 +* **Volatility (annualized):** 0.00% +* **Maximum drawdown:** 0.00% +* **Total trades:** 0 + +## Buy and Hold Benchmark + +* *Buy and Hold benchmark could not be calculated.* + +## Position & Prediction Analysis + +* **Average absolute position size:** 0.0000 +* **Position sign accuracy vs return:** 0.00% +* **Prediction sign accuracy vs return:** 0.00% +* **Prediction RMSE (on returns):** 0.000000 + +## Correlations + +* **Prediction-Return correlation:** 0.0000 +* **Prediction-Position correlation:** 0.0000 +* **Uncertainty-Position Size correlation:** 0.0000 + +## Notes + +* Transaction cost used: 0.0500% per position change value. +* GRU lookback period: 60 minutes. +* V6 features + return features used. +* Uncertainty estimated via MC Dropout standard deviation. diff --git a/gru_sac_predictor/results/20250416_182038/backtest_results_20250416_182038.png b/gru_sac_predictor/results/20250416_182038/backtest_results_20250416_182038.png new file mode 100644 index 00000000..3f1c1c6f Binary files /dev/null and b/gru_sac_predictor/results/20250416_182038/backtest_results_20250416_182038.png differ diff --git a/gru_sac_predictor/results/20250416_182038/sac_training_history_20250416_182038.png b/gru_sac_predictor/results/20250416_182038/sac_training_history_20250416_182038.png new file mode 100644 index 00000000..bea1e2ba Binary files /dev/null and b/gru_sac_predictor/results/20250416_182038/sac_training_history_20250416_182038.png differ diff --git a/gru_sac_predictor/results/20250416_183051/backtest_performance_report_20250416_183051.md b/gru_sac_predictor/results/20250416_183051/backtest_performance_report_20250416_183051.md new file mode 100644 index 00000000..74907f09 --- /dev/null +++ b/gru_sac_predictor/results/20250416_183051/backtest_performance_report_20250416_183051.md @@ -0,0 +1,41 @@ +# GRU+SAC Backtesting Performance Report + +Report generated on: 2025-04-16 18:31:42.150811 +Data range: N/A +Total duration: N/A + +## Strategy Performance Metrics + +* **Initial capital:** $0.00 +* **Final portfolio value:** $0.00 +* **Total return:** 0.00% +* **Annualized return:** 0.00% +* **Sharpe ratio (annualized):** 0.0000 +* **Sortino ratio (annualized):** 0.0000 +* **Volatility (annualized):** 0.00% +* **Maximum drawdown:** 0.00% +* **Total trades:** 0 + +## Buy and Hold Benchmark + +* *Buy and Hold benchmark could not be calculated.* + +## Position & Prediction Analysis + +* **Average absolute position size:** 0.0000 +* **Position sign accuracy vs return:** 0.00% +* **Prediction sign accuracy vs return:** 0.00% +* **Prediction RMSE (on returns):** 0.000000 + +## Correlations + +* **Prediction-Return correlation:** 0.0000 +* **Prediction-Position correlation:** 0.0000 +* **Uncertainty-Position Size correlation:** 0.0000 + +## Notes + +* Transaction cost used: 0.0500% per position change value. +* GRU lookback period: 60 minutes. +* V6 features + return features used. +* Uncertainty estimated via MC Dropout standard deviation. diff --git a/gru_sac_predictor/results/20250416_183051/backtest_results_20250416_183051.png b/gru_sac_predictor/results/20250416_183051/backtest_results_20250416_183051.png new file mode 100644 index 00000000..9d17a6ea Binary files /dev/null and b/gru_sac_predictor/results/20250416_183051/backtest_results_20250416_183051.png differ diff --git a/gru_sac_predictor/results/20250416_183051/config_20250416_183051.json b/gru_sac_predictor/results/20250416_183051/config_20250416_183051.json new file mode 100644 index 00000000..41648c3e --- /dev/null +++ b/gru_sac_predictor/results/20250416_183051/config_20250416_183051.json @@ -0,0 +1,66 @@ +{ + "run_id": "20250416_183051", + "db_dir": "../downloaded_data", + "ticker": "BTC-USD", + "exchange": "COINBASE", + "start_date": "2025-03-01", + "end_date": "2025-03-10", + "interval": "1min", + "model_save_path": "gru_sac_predictor/models/run_20250416_183051", + "results_plot_path": "gru_sac_predictor/results/20250416_183051/backtest_results_20250416_183051.png", + "report_save_path": "gru_sac_predictor/results/20250416_183051/backtest_performance_report_20250416_183051.md", + "train_ratio": 0.6, + "validation_ratio": 0.2, + "gru_lookback": 60, + "gru_prediction_horizon": 1, + "gru_epochs": 20, + "gru_batch_size": 32, + "gru_patience": 10, + "gru_lr_factor": 0.5, + "gru_return_scale": 0.03, + "gru_model_load_run_id": "20250416_142744", + "sac_state_dim": 5, + "sac_hidden_size": 64, + "sac_gamma": 0.97, + "sac_tau": 0.02, + "sac_actor_lr": 1.5e-05, + "sac_critic_lr": 2.5e-05, + "sac_batch_size": 64, + "sac_buffer_max_size": 20000, + "sac_min_buffer_size": 1000, + "sac_update_interval": 1, + "sac_target_update_interval": 2, + "sac_gradient_clip": 1.0, + "sac_reward_scale": 1.0, + "sac_use_batch_norm": true, + "sac_use_residual": true, + "sac_model_dir": "models/simplified_sac", + "sac_epochs": 5, + "experience_config": { + "initial_experiences": 3000, + "experiences_per_batch": 64, + "batch_generation_interval": 500, + "balance_market_regimes": false, + "recency_bias_strength": 0.5, + "high_uncertainty_quantile": 0.75, + "extreme_return_quantile": 0.1, + "min_uncertainty_ratio": 0.2, + "min_extreme_return_ratio": 0.1, + "use_parallel_generation": false, + "precompute_all_gru_outputs": true, + "buffer_update_strategy": "fifo", + "training_iterations_per_step": 1 + }, + "initial_capital": 10000.0, + "transaction_cost": 0.0005, + "opportunity_cost_penalty_factor": 0.0, + "high_return_threshold": 0.002, + "action_tolerance": 0.3, + "load_existing_system": true, + "train_gru_model": false, + "train_sac_agent": true, + "load_sac_agent": false, + "run_backtest": true, + "generate_plots": true, + "generate_report": true +} \ No newline at end of file diff --git a/gru_sac_predictor/results/20250416_183051/sac_training_history_20250416_183051.png b/gru_sac_predictor/results/20250416_183051/sac_training_history_20250416_183051.png new file mode 100644 index 00000000..bd975076 Binary files /dev/null and b/gru_sac_predictor/results/20250416_183051/sac_training_history_20250416_183051.png differ diff --git a/gru_sac_predictor/results/20250416_183508/backtest_performance_report_20250416_183508.md b/gru_sac_predictor/results/20250416_183508/backtest_performance_report_20250416_183508.md new file mode 100644 index 00000000..aa02007a --- /dev/null +++ b/gru_sac_predictor/results/20250416_183508/backtest_performance_report_20250416_183508.md @@ -0,0 +1,42 @@ +# GRU+SAC Backtesting Performance Report + +Report generated on: 2025-04-16 18:36:19.355066 +Data range: 2025-03-06 15:23:00+00:00 to 2025-03-07 23:57:00+00:00 +Total duration: 1 days 08:34:00 + +## Strategy Performance Metrics + +* **Initial capital:** $10,000.00 +* **Final portfolio value:** $10,102.70 +* **Total return:** 1.03% +* **Annualized return:** 1484.12% +* **Sharpe ratio (annualized):** 3.2039 +* **Sortino ratio (annualized):** 4.8489 +* **Volatility (annualized):** 102.65% +* **Maximum drawdown:** 7.56% +* **Total trades:** 1489 + +## Buy and Hold Benchmark + +* **Final value (B&H):** $9,658.75 +* **Total return (B&H):** -3.41% + +## Position & Prediction Analysis + +* **Average absolute position size:** 0.9056 +* **Position sign accuracy vs return:** 50.93% +* **Prediction sign accuracy vs return:** 48.92% +* **Prediction RMSE (on returns):** 0.004036 + +## Correlations + +* **Prediction-Return correlation:** -0.0042 +* **Prediction-Position correlation:** 0.1459 +* **Uncertainty-Position Size correlation:** 0.8410 + +## Notes + +* Transaction cost used: 0.0500% per position change value. +* GRU lookback period: 60 minutes. +* V6 features + return features used. +* Uncertainty estimated via MC Dropout standard deviation. diff --git a/gru_sac_predictor/results/20250416_183508/backtest_results_20250416_183508.png b/gru_sac_predictor/results/20250416_183508/backtest_results_20250416_183508.png new file mode 100644 index 00000000..6ba739e2 Binary files /dev/null and b/gru_sac_predictor/results/20250416_183508/backtest_results_20250416_183508.png differ diff --git a/gru_sac_predictor/results/20250416_183508/config_20250416_183508.json b/gru_sac_predictor/results/20250416_183508/config_20250416_183508.json new file mode 100644 index 00000000..31cdcaa5 --- /dev/null +++ b/gru_sac_predictor/results/20250416_183508/config_20250416_183508.json @@ -0,0 +1,66 @@ +{ + "run_id": "20250416_183508", + "db_dir": "../downloaded_data", + "ticker": "BTC-USD", + "exchange": "COINBASE", + "start_date": "2025-03-01", + "end_date": "2025-03-10", + "interval": "1min", + "model_save_path": "gru_sac_predictor/models/run_20250416_183508", + "results_plot_path": "gru_sac_predictor/results/20250416_183508/backtest_results_20250416_183508.png", + "report_save_path": "gru_sac_predictor/results/20250416_183508/backtest_performance_report_20250416_183508.md", + "train_ratio": 0.6, + "validation_ratio": 0.2, + "gru_lookback": 60, + "gru_prediction_horizon": 1, + "gru_epochs": 20, + "gru_batch_size": 32, + "gru_patience": 10, + "gru_lr_factor": 0.5, + "gru_return_scale": 0.03, + "gru_model_load_run_id": "20250416_142744", + "sac_state_dim": 5, + "sac_hidden_size": 64, + "sac_gamma": 0.97, + "sac_tau": 0.02, + "sac_actor_lr": 1.5e-05, + "sac_critic_lr": 2.5e-05, + "sac_batch_size": 64, + "sac_buffer_max_size": 20000, + "sac_min_buffer_size": 1000, + "sac_update_interval": 1, + "sac_target_update_interval": 2, + "sac_gradient_clip": 1.0, + "sac_reward_scale": 1.0, + "sac_use_batch_norm": true, + "sac_use_residual": true, + "sac_model_dir": "models/simplified_sac", + "sac_epochs": 5, + "experience_config": { + "initial_experiences": 3000, + "experiences_per_batch": 64, + "batch_generation_interval": 500, + "balance_market_regimes": false, + "recency_bias_strength": 0.5, + "high_uncertainty_quantile": 0.75, + "extreme_return_quantile": 0.1, + "min_uncertainty_ratio": 0.2, + "min_extreme_return_ratio": 0.1, + "use_parallel_generation": false, + "precompute_all_gru_outputs": true, + "buffer_update_strategy": "fifo", + "training_iterations_per_step": 1 + }, + "initial_capital": 10000.0, + "transaction_cost": 0.0005, + "opportunity_cost_penalty_factor": 0.0, + "high_return_threshold": 0.002, + "action_tolerance": 0.3, + "load_existing_system": true, + "train_gru_model": false, + "train_sac_agent": true, + "load_sac_agent": false, + "run_backtest": true, + "generate_plots": true, + "generate_report": true +} \ No newline at end of file diff --git a/gru_sac_predictor/results/20250416_183508/sac_training_history_20250416_183508.png b/gru_sac_predictor/results/20250416_183508/sac_training_history_20250416_183508.png new file mode 100644 index 00000000..e0d2051c Binary files /dev/null and b/gru_sac_predictor/results/20250416_183508/sac_training_history_20250416_183508.png differ diff --git a/gru_sac_predictor/src/__pycache__/trading_system.cpython-312.pyc b/gru_sac_predictor/src/__pycache__/trading_system.cpython-312.pyc index 153f16e0..a2dae5f8 100644 Binary files a/gru_sac_predictor/src/__pycache__/trading_system.cpython-312.pyc and b/gru_sac_predictor/src/__pycache__/trading_system.cpython-312.pyc differ diff --git a/gru_sac_predictor/src/trading_system.py b/gru_sac_predictor/src/trading_system.py index d72c1f53..b008e85f 100644 --- a/gru_sac_predictor/src/trading_system.py +++ b/gru_sac_predictor/src/trading_system.py @@ -375,7 +375,7 @@ class TradingSystem: if self.gru_model and self.gru_model.is_loaded: self.feature_scaler = self.gru_model.feature_scaler self.y_scaler = self.gru_model.y_scaler - self._logger.info("Scalers initialized from pre-loaded GRU model.") + _logger.info("Scalers initialized from pre-loaded GRU model.") # V7.23: Attempt to set indices if scaler loaded self._set_feature_indices() @@ -1262,6 +1262,13 @@ class ExtendedBacktester: feature_logger.error(f"Error during pre-computation evaluate call on test data: {e}", exc_info=True) # Use feature_logger return None + # --- Calculate num_sequences FIRST --- + # Moved from below to be available for feature extraction + num_sequences = len(all_pred_returns) + if num_sequences <= 1: + feature_logger.warning("Not enough sequences generated from test data to perform backtest.") # Use feature_logger + return None + # --- V7.13 START: Extract Momentum and Volatility Features --- # These features should be aligned with the *sequences* used for GRU prediction # Use test_features_df which is aligned with the sequences' start times @@ -1300,11 +1307,6 @@ class ExtendedBacktester: return None # --- V7.13 END: Extract Momentum and Volatility Features --- - num_sequences = len(all_pred_returns) - if num_sequences <= 1: - feature_logger.warning("Not enough sequences generated from test data to perform backtest.") # Use feature_logger - return None - feature_logger.info("--- GRU Pre-computation Complete. Starting Backtest Simulation ---") # Use feature_logger # --- Refined Timestamp Handling START (from original test_data before preprocessing) ---