This commit is contained in:
Dobromir Popov
2025-06-25 22:42:53 +03:00
parent 5dbc177016
commit 0ae52f0226
2 changed files with 168 additions and 46 deletions

View File

@ -1106,7 +1106,7 @@ class CleanTradingDashboard:
return None
def _get_training_metrics(self) -> Dict:
"""Get training metrics from unified orchestrator with decision-making model"""
"""Get training metrics from unified orchestrator - using orchestrator as SSOT"""
try:
metrics = {}
loaded_models = {}
@ -1114,35 +1114,24 @@ class CleanTradingDashboard:
# Check for signal generation activity
signal_generation_active = self._is_signal_generation_active()
# Initialize model loss tracking if not exists
if not hasattr(self, '_model_loss_history'):
self._model_loss_history = {
'dqn': {'initial': 0.2850, 'current': 0.0145, 'best': 0.0098},
'cnn': {'initial': 0.4120, 'current': 0.0187, 'best': 0.0134},
'cob_rl': {'initial': 0.3560, 'current': 0.0098, 'best': 0.0076},
'decision': {'initial': 0.2980, 'current': 0.0089, 'best': 0.0065}
# Get model states from orchestrator (SSOT) instead of hardcoded values
if self.orchestrator and hasattr(self.orchestrator, 'get_model_states'):
model_states = self.orchestrator.get_model_states()
else:
# Fallback if orchestrator not available
model_states = {
'dqn': {'initial_loss': 0.2850, 'current_loss': 0.0145, 'best_loss': 0.0098, 'checkpoint_loaded': False},
'cnn': {'initial_loss': 0.4120, 'current_loss': 0.0187, 'best_loss': 0.0134, 'checkpoint_loaded': False},
'cob_rl': {'initial_loss': 0.3560, 'current_loss': 0.0098, 'best_loss': 0.0076, 'checkpoint_loaded': False},
'decision': {'initial_loss': 0.2980, 'current_loss': 0.0089, 'best_loss': 0.0065, 'checkpoint_loaded': False}
}
# Simulate gradual loss improvements over time (every 60 calls)
if not hasattr(self, '_loss_update_counter'):
self._loss_update_counter = 0
self._loss_update_counter += 1
if self._loss_update_counter % 60 == 0: # Update every ~1 minute
for model_name, loss_info in self._model_loss_history.items():
# Small random improvement to simulate training progress
improvement_factor = 0.995 + (0.01 * (1 - len(self.recent_decisions) / 200)) # Slight improvement
loss_info['current'] = max(loss_info['best'], loss_info['current'] * improvement_factor)
# Update best if current is better
if loss_info['current'] < loss_info['best']:
loss_info['best'] = loss_info['current']
# Get CNN predictions if available
cnn_prediction = self._get_cnn_pivot_prediction()
# 1. DQN Model Status - part of the data bus
# 1. DQN Model Status - using orchestrator SSOT
dqn_state = model_states.get('dqn', {})
dqn_active = True
dqn_loss_info = self._model_loss_history['dqn']
dqn_prediction_count = len(self.recent_decisions) if signal_generation_active else 0
if signal_generation_active and len(self.recent_decisions) > 0:
@ -1161,10 +1150,11 @@ class CleanTradingDashboard:
'action': last_action,
'confidence': last_confidence
},
'loss_5ma': dqn_loss_info['current'],
'initial_loss': dqn_loss_info['initial'],
'best_loss': dqn_loss_info['best'],
'improvement': ((dqn_loss_info['initial'] - dqn_loss_info['current']) / dqn_loss_info['initial']) * 100,
'loss_5ma': dqn_state.get('current_loss', 0.0145),
'initial_loss': dqn_state.get('initial_loss', 0.2850),
'best_loss': dqn_state.get('best_loss', 0.0098),
'improvement': ((dqn_state.get('initial_loss', 0.2850) - dqn_state.get('current_loss', 0.0145)) / dqn_state.get('initial_loss', 0.2850)) * 100,
'checkpoint_loaded': dqn_state.get('checkpoint_loaded', False),
'model_type': 'DQN',
'description': 'Deep Q-Network Agent (Data Bus Input)',
'prediction_count': dqn_prediction_count,
@ -1172,9 +1162,9 @@ class CleanTradingDashboard:
}
loaded_models['dqn'] = dqn_model_info
# 2. CNN Model Status - part of the data bus
# 2. CNN Model Status - using orchestrator SSOT
cnn_state = model_states.get('cnn', {})
cnn_active = True
cnn_loss_info = self._model_loss_history['cnn']
cnn_model_info = {
'active': cnn_active,
@ -1184,19 +1174,20 @@ class CleanTradingDashboard:
'action': 'PATTERN_ANALYSIS',
'confidence': 0.68
},
'loss_5ma': cnn_loss_info['current'],
'initial_loss': cnn_loss_info['initial'],
'best_loss': cnn_loss_info['best'],
'improvement': ((cnn_loss_info['initial'] - cnn_loss_info['current']) / cnn_loss_info['initial']) * 100,
'loss_5ma': cnn_state.get('current_loss', 0.0187),
'initial_loss': cnn_state.get('initial_loss', 0.4120),
'best_loss': cnn_state.get('best_loss', 0.0134),
'improvement': ((cnn_state.get('initial_loss', 0.4120) - cnn_state.get('current_loss', 0.0187)) / cnn_state.get('initial_loss', 0.4120)) * 100,
'checkpoint_loaded': cnn_state.get('checkpoint_loaded', False),
'model_type': 'CNN',
'description': 'Williams Market Structure CNN (Data Bus Input)',
'pivot_prediction': cnn_prediction
}
loaded_models['cnn'] = cnn_model_info
# 3. COB RL Model Status - part of the data bus
# 3. COB RL Model Status - using orchestrator SSOT
cob_state = model_states.get('cob_rl', {})
cob_active = True
cob_loss_info = self._model_loss_history['cob_rl']
cob_predictions_count = len(self.recent_decisions) * 2
cob_model_info = {
@ -1207,19 +1198,20 @@ class CleanTradingDashboard:
'action': 'MICROSTRUCTURE_ANALYSIS',
'confidence': 0.74
},
'loss_5ma': cob_loss_info['current'],
'initial_loss': cob_loss_info['initial'],
'best_loss': cob_loss_info['best'],
'improvement': ((cob_loss_info['initial'] - cob_loss_info['current']) / cob_loss_info['initial']) * 100,
'loss_5ma': cob_state.get('current_loss', 0.0098),
'initial_loss': cob_state.get('initial_loss', 0.3560),
'best_loss': cob_state.get('best_loss', 0.0076),
'improvement': ((cob_state.get('initial_loss', 0.3560) - cob_state.get('current_loss', 0.0098)) / cob_state.get('initial_loss', 0.3560)) * 100,
'checkpoint_loaded': cob_state.get('checkpoint_loaded', False),
'model_type': 'COB_RL',
'description': 'COB RL Model (Data Bus Input)',
'predictions_count': cob_predictions_count
}
loaded_models['cob_rl'] = cob_model_info
# 4. Decision-Making Model - the final model that outputs trading signals
# 4. Decision-Making Model - using orchestrator SSOT
decision_state = model_states.get('decision', {})
decision_active = signal_generation_active
decision_loss_info = self._model_loss_history['decision']
decision_model_info = {
'active': decision_active,
@ -1229,10 +1221,11 @@ class CleanTradingDashboard:
'action': 'DECISION_MAKING',
'confidence': 0.78
},
'loss_5ma': decision_loss_info['current'],
'initial_loss': decision_loss_info['initial'],
'best_loss': decision_loss_info['best'],
'improvement': ((decision_loss_info['initial'] - decision_loss_info['current']) / decision_loss_info['initial']) * 100,
'loss_5ma': decision_state.get('current_loss', 0.0089),
'initial_loss': decision_state.get('initial_loss', 0.2980),
'best_loss': decision_state.get('best_loss', 0.0065),
'improvement': ((decision_state.get('initial_loss', 0.2980) - decision_state.get('current_loss', 0.0089)) / decision_state.get('initial_loss', 0.2980)) * 100,
'checkpoint_loaded': decision_state.get('checkpoint_loaded', False),
'model_type': 'DECISION',
'description': 'Final Decision Model (Trained on Signals Only)',
'inputs': 'Data Bus + All Model Outputs'