added leverage, better training
This commit is contained in:
@ -811,19 +811,73 @@ class TradingOrchestrator:
|
||||
}
|
||||
}
|
||||
|
||||
def get_model_states(self) -> Dict[str, Any]:
|
||||
"""Get model states (SSOT) - Single Source of Truth for model loss tracking"""
|
||||
if not hasattr(self, 'model_states'):
|
||||
# Initialize if not exists (fallback)
|
||||
self.model_states = {
|
||||
'dqn': {'initial_loss': 0.285, 'current_loss': 0.0145, 'best_loss': 0.0098, 'checkpoint_loaded': False},
|
||||
'cnn': {'initial_loss': 0.412, 'current_loss': 0.0187, 'best_loss': 0.0134, 'checkpoint_loaded': False},
|
||||
'cob_rl': {'initial_loss': 0.356, 'current_loss': 0.0098, 'best_loss': 0.0076, 'checkpoint_loaded': False},
|
||||
'decision': {'initial_loss': 0.298, 'current_loss': 0.0089, 'best_loss': 0.0065, 'checkpoint_loaded': False},
|
||||
'extrema_trainer': {'initial_loss': 0.356, 'current_loss': 0.0098, 'best_loss': 0.0076, 'checkpoint_loaded': False}
|
||||
def get_model_states(self) -> Dict[str, Dict]:
|
||||
"""Get current model states with real training metrics - SSOT for dashboard"""
|
||||
try:
|
||||
# Update DQN state from actual agent if available
|
||||
if self.rl_agent and hasattr(self.rl_agent, 'losses') and len(self.rl_agent.losses) > 0:
|
||||
recent_losses = self.rl_agent.losses[-100:] # Last 100 training steps
|
||||
current_loss = sum(recent_losses) / len(recent_losses) if recent_losses else self.model_states['dqn']['current_loss']
|
||||
|
||||
# Update DQN state with real metrics
|
||||
self.model_states['dqn']['current_loss'] = current_loss
|
||||
self.model_states['dqn']['checkpoint_loaded'] = hasattr(self.rl_agent, 'episode_count') and self.rl_agent.episode_count > 0
|
||||
|
||||
# Update best loss if we have training history
|
||||
if hasattr(self.rl_agent, 'best_reward') and self.rl_agent.best_reward > 0:
|
||||
# Convert reward to approximate loss (inverse relationship)
|
||||
estimated_loss = max(0.001, 1.0 / (1.0 + self.rl_agent.best_reward))
|
||||
if self.model_states['dqn']['best_loss'] is None or estimated_loss < self.model_states['dqn']['best_loss']:
|
||||
self.model_states['dqn']['best_loss'] = estimated_loss
|
||||
|
||||
# Update CNN state from actual model if available
|
||||
if self.cnn_model and hasattr(self.cnn_model, 'losses') and len(self.cnn_model.losses) > 0:
|
||||
recent_losses = self.cnn_model.losses[-50:] # Last 50 training steps
|
||||
current_loss = sum(recent_losses) / len(recent_losses) if recent_losses else self.model_states['cnn']['current_loss']
|
||||
self.model_states['cnn']['current_loss'] = current_loss
|
||||
self.model_states['cnn']['checkpoint_loaded'] = True
|
||||
|
||||
# Update extrema trainer state if available
|
||||
if self.extrema_trainer and hasattr(self.extrema_trainer, 'training_losses'):
|
||||
recent_losses = self.extrema_trainer.training_losses[-50:]
|
||||
if recent_losses:
|
||||
current_loss = sum(recent_losses) / len(recent_losses)
|
||||
self.model_states['extrema_trainer']['current_loss'] = current_loss
|
||||
self.model_states['extrema_trainer']['checkpoint_loaded'] = True
|
||||
|
||||
# Ensure initial_loss is set for new models
|
||||
for model_key, model_state in self.model_states.items():
|
||||
if model_state['initial_loss'] is None:
|
||||
# Set reasonable initial loss values for new models
|
||||
initial_losses = {
|
||||
'dqn': 0.285,
|
||||
'cnn': 0.412,
|
||||
'cob_rl': 0.356,
|
||||
'decision': 0.298,
|
||||
'extrema_trainer': 0.356
|
||||
}
|
||||
model_state['initial_loss'] = initial_losses.get(model_key, 0.3)
|
||||
|
||||
# If current_loss is None, set it to initial_loss
|
||||
if model_state['current_loss'] is None:
|
||||
model_state['current_loss'] = model_state['initial_loss']
|
||||
|
||||
# If best_loss is None, set it to current_loss
|
||||
if model_state['best_loss'] is None:
|
||||
model_state['best_loss'] = model_state['current_loss']
|
||||
|
||||
return self.model_states
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Error getting model states: {e}")
|
||||
# Return safe fallback values
|
||||
return {
|
||||
'dqn': {'initial_loss': 0.285, 'current_loss': 0.285, 'best_loss': 0.285, 'checkpoint_loaded': False},
|
||||
'cnn': {'initial_loss': 0.412, 'current_loss': 0.412, 'best_loss': 0.412, 'checkpoint_loaded': False},
|
||||
'cob_rl': {'initial_loss': 0.356, 'current_loss': 0.356, 'best_loss': 0.356, 'checkpoint_loaded': False},
|
||||
'decision': {'initial_loss': 0.298, 'current_loss': 0.298, 'best_loss': 0.298, 'checkpoint_loaded': False},
|
||||
'extrema_trainer': {'initial_loss': 0.356, 'current_loss': 0.356, 'best_loss': 0.356, 'checkpoint_loaded': False}
|
||||
}
|
||||
|
||||
return self.model_states.copy()
|
||||
|
||||
def update_model_loss(self, model_name: str, current_loss: float, best_loss: float = None):
|
||||
"""Update model loss values (called during training)"""
|
||||
@ -1033,7 +1087,7 @@ class TradingOrchestrator:
|
||||
expected_features = 13800 # Updated to include 400 COB features
|
||||
|
||||
if total_features >= expected_features - 100: # Allow small tolerance
|
||||
logger.info(f"TRAINING: Comprehensive RL state built successfully: {total_features} features (including COB)")
|
||||
# logger.info(f"TRAINING: Comprehensive RL state built successfully: {total_features} features (including COB)")
|
||||
return comprehensive_features
|
||||
else:
|
||||
logger.warning(f"⚠️ Comprehensive RL state incomplete: {total_features} features (expected {expected_features}+)")
|
||||
|
Reference in New Issue
Block a user