Fix remote training and model validation pipeline

This commit is contained in:
Курнат Андрей
2026-07-12 22:56:49 +03:00
parent 18936cf8b1
commit da53483164
22 changed files with 1691 additions and 246 deletions
+54
View File
@@ -304,6 +304,60 @@ def test_time_series_forecaster_attaches_quality_gate(make_settings, tmp_path) -
assert forecast.quality_gate["status"] == "fail"
def test_time_series_forecaster_uses_symbol_calibration(make_settings, tmp_path) -> None:
artifact_path = tmp_path / "lstm_forecaster.json"
_write_torch_gru_artifact(artifact_path, head_bias=0.2)
(tmp_path / "torch_threshold_calibration.json").write_text(
json.dumps(
{
"validation": {"status": "pass", "passed": True},
"recommended": {"edge": 0.08, "probability": 0.52, "confidence": 0.4},
"symbol_recommendations": {
"BTCUSDT": {"edge": 0.03, "probability": 0.55, "confidence": 0.45}
},
}
),
encoding="utf-8",
)
settings = make_settings(
tmp_path,
time_series_lstm_model_path=artifact_path,
time_series_forecast_horizon=1,
)
forecast = TimeSeriesForecaster(settings).forecast(
_candles_from_returns([0.0001] * 140), symbol="BTCUSDT"
)
assert forecast.calibrated_min_edge_percent == 0.03
assert forecast.calibrated_min_probability_up == 0.55
assert forecast.calibrated_min_confidence == 0.45
def test_time_series_forecaster_averages_ensemble_members(make_settings, tmp_path) -> None:
artifact_path = tmp_path / "lstm_forecaster.json"
_write_torch_gru_artifact(artifact_path, head_bias=0.9)
artifact = json.loads(artifact_path.read_text(encoding="utf-8"))
entry = artifact["symbols"]["BTCUSDT"]
entry["ensemble_members"] = [
{"state_dict": entry["state_dict"], "head_weight": [0.0, 0.0], "head_bias": bias}
for bias in (0.1, 0.3)
]
artifact_path.write_text(json.dumps(artifact), encoding="utf-8")
settings = make_settings(
tmp_path,
time_series_lstm_model_path=artifact_path,
time_series_forecast_horizon=1,
)
forecast = TimeSeriesForecaster(settings).forecast(
_candles_from_returns([0.0001] * 140), symbol="BTCUSDT"
)
assert forecast.usable is True
assert 0.015 <= forecast.expected_return_percent <= 0.025
def test_time_series_forecaster_reads_multifeature_direct_horizon_artifact(make_settings, tmp_path) -> None:
artifact_path = tmp_path / "lstm_forecaster.json"
_write_multifeature_torch_gru_artifact(artifact_path, head_bias=0.2)