feat(trading_service): wire all 10 ML models into ensemble coordinator

Register TGGN, TLOB, KAN, xLSTM, and Diffusion inference adapters
alongside the existing DQN, PPO, TFT, Mamba2, and Liquid-CfC.
Rebalance weights to 0.10 each (equal weighting across 10 models).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
jgrusewski
2026-02-23 15:55:11 +01:00
parent 6d43f8d8d2
commit 1999e5ddbe

View File

@@ -263,7 +263,7 @@ async fn main() -> Result<()> {
ml::ModelType::DQN,
));
if let Err(e) = coordinator
.register_loaded_model("DQN".to_string(), bridge, 0.25)
.register_loaded_model("DQN".to_string(), bridge, 0.10)
.await
{
warn!("Failed to register DQN adapter: {}", e);
@@ -289,7 +289,7 @@ async fn main() -> Result<()> {
ml::ModelType::PPO,
));
if let Err(e) = coordinator
.register_loaded_model("PPO".to_string(), bridge, 0.25)
.register_loaded_model("PPO".to_string(), bridge, 0.10)
.await
{
warn!("Failed to register PPO adapter: {}", e);
@@ -324,7 +324,7 @@ async fn main() -> Result<()> {
ml::ModelType::TFT,
));
if let Err(e) = coordinator
.register_loaded_model("TFT".to_string(), bridge, 0.20)
.register_loaded_model("TFT".to_string(), bridge, 0.10)
.await
{
warn!("Failed to register TFT adapter: {}", e);
@@ -355,7 +355,7 @@ async fn main() -> Result<()> {
ml::ModelType::MAMBA,
));
if let Err(e) = coordinator
.register_loaded_model("MAMBA2".to_string(), bridge, 0.15)
.register_loaded_model("MAMBA2".to_string(), bridge, 0.10)
.await
{
warn!("Failed to register MAMBA2 adapter: {}", e);
@@ -385,7 +385,7 @@ async fn main() -> Result<()> {
ml::ModelType::LNN,
));
if let Err(e) = coordinator
.register_loaded_model("Liquid-CfC".to_string(), bridge, 0.15)
.register_loaded_model("Liquid-CfC".to_string(), bridge, 0.10)
.await
{
warn!("Failed to register Liquid-CfC adapter: {}", e);
@@ -396,10 +396,131 @@ async fn main() -> Result<()> {
Err(e) => warn!("Failed to create Liquid-CfC inference adapter: {}", e),
}
// TGGN adapter (51-dim input, 2-layer candle projection)
match ml::ensemble::adapters::TggnInferenceAdapter::new(51, 64) {
Ok(adapter) => {
let bridge = Arc::new(InferenceAdapterBridge::new(
Box::new(adapter),
"TGGN".to_string(),
ml::ModelType::TGGN,
));
if let Err(e) = coordinator
.register_loaded_model("TGGN".to_string(), bridge, 0.10)
.await
{
warn!("Failed to register TGGN adapter: {}", e);
} else {
info!("Registered TGGN inference adapter (51-dim, candle projection)");
}
}
Err(e) => warn!("Failed to create TGGN inference adapter: {}", e),
}
// TLOB adapter (51-dim features, 3-layer MLP, seq_len=10)
match ml::ensemble::adapters::TlobInferenceAdapter::new(51, 64, 10) {
Ok(adapter) => {
let bridge = Arc::new(InferenceAdapterBridge::new(
Box::new(adapter),
"TLOB".to_string(),
ml::ModelType::TLOB,
));
if let Err(e) = coordinator
.register_loaded_model("TLOB".to_string(), bridge, 0.10)
.await
{
warn!("Failed to register TLOB adapter: {}", e);
} else {
info!("Registered TLOB inference adapter (51-dim, seq=10, candle MLP)");
}
}
Err(e) => warn!("Failed to create TLOB inference adapter: {}", e),
}
// KAN adapter (51-dim input, B-spline activations)
match ml::ensemble::adapters::KanInferenceAdapter::new(ml::kan::KANConfig {
layer_widths: vec![51, 32, 16, 1],
..Default::default()
}) {
Ok(adapter) => {
let bridge = Arc::new(InferenceAdapterBridge::new(
Box::new(adapter),
"KAN".to_string(),
ml::ModelType::KAN,
));
if let Err(e) = coordinator
.register_loaded_model("KAN".to_string(), bridge, 0.10)
.await
{
warn!("Failed to register KAN adapter: {}", e);
} else {
info!("Registered KAN inference adapter (51-dim, B-spline, candle)");
}
}
Err(e) => warn!("Failed to create KAN inference adapter: {}", e),
}
// xLSTM adapter (51-dim input, sLSTM+mLSTM, seq_len=10)
match ml::ensemble::adapters::XlstmInferenceAdapter::new(
ml::xlstm::XLSTMConfig {
input_dim: 51,
hidden_dim: 64,
num_blocks: 2,
num_heads: 2,
..Default::default()
},
10, // sequence_length for buffer
) {
Ok(adapter) => {
let bridge = Arc::new(InferenceAdapterBridge::new(
Box::new(adapter),
"xLSTM".to_string(),
ml::ModelType::XLSTM,
));
if let Err(e) = coordinator
.register_loaded_model("xLSTM".to_string(), bridge, 0.10)
.await
{
warn!("Failed to register xLSTM adapter: {}", e);
} else {
info!("Registered xLSTM inference adapter (51-dim, seq=10, candle)");
}
}
Err(e) => warn!("Failed to create xLSTM inference adapter: {}", e),
}
// Diffusion adapter (51-dim features, DDPM denoiser, t=1 inference)
match ml::ensemble::adapters::DiffusionInferenceAdapter::new(ml::diffusion::DiffusionConfig {
seq_len: 1,
feature_dim: 51,
hidden_dim: 64,
num_layers: 2,
time_embed_dim: 32,
num_timesteps: 100,
sampling_steps: 5,
..Default::default()
}) {
Ok(adapter) => {
let bridge = Arc::new(InferenceAdapterBridge::new(
Box::new(adapter),
"Diffusion".to_string(),
ml::ModelType::Diffusion,
));
if let Err(e) = coordinator
.register_loaded_model("Diffusion".to_string(), bridge, 0.10)
.await
{
warn!("Failed to register Diffusion adapter: {}", e);
} else {
info!("Registered Diffusion inference adapter (51-dim, DDPM, candle)");
}
}
Err(e) => warn!("Failed to create Diffusion inference adapter: {}", e),
}
let model_count = coordinator.model_count().await;
info!(
"Ensemble coordinator initialized with {} real inference adapters \
(DQN=0.25, PPO=0.25, TFT=0.20, MAMBA2=0.15, Liquid-CfC=0.15)",
(all 10 models at 0.10 weight each)",
model_count
);