From 0cbe5de67b9e25b08bcf60ea1c7ecf56c08a7a58 Mon Sep 17 00:00:00 2001 From: Stefan Jansen Date: Thu, 15 Oct 2026 16:43:02 -0400 Subject: [PATCH 1/2] test: reproduce Friday equity weekend misclassification (#87) --- tests/assets/test_validation.py | 40 ++++++++++++++++++++++++++++----- 1 file changed, 35 insertions(+), 5 deletions(-) diff --git a/tests/assets/test_validation.py b/tests/assets/test_validation.py index ea9e7570..66957a23 100644 --- a/tests/assets/test_validation.py +++ b/tests/assets/test_validation.py @@ -253,15 +253,46 @@ def test_validate_valid_data_no_issues(self): class TestValidateEquity: """Tests for equity-specific validation.""" - def test_validate_weekend_data(self): + @pytest.mark.parametrize( + "timestamp", + [ + pytest.param(datetime(2025, 7, 7, 10), id="monday"), + pytest.param(datetime(2025, 7, 8, 10), id="tuesday"), + pytest.param(datetime(2025, 7, 9, 10), id="wednesday"), + pytest.param(datetime(2025, 7, 10, 10), id="thursday"), + pytest.param(datetime(2025, 7, 11, 10), id="friday"), + ], + ) + def test_validate_regular_weekdays_do_not_report_weekend(self, timestamp): + info = AssetInfo(symbol="SPY", asset_class=AssetClass.EQUITY, exchange="NYSE") + df = pl.DataFrame( + { + "timestamp": [timestamp], + "open": [100.0], + "high": [101.0], + "low": [99.0], + "close": [100.0], + "volume": [1000.0], + } + ) + + assert AssetValidator(info).validate(df) == {} + + @pytest.mark.parametrize( + "timestamp", + [ + pytest.param(datetime(2025, 7, 12, 10), id="saturday"), + pytest.param(datetime(2025, 7, 13, 10), id="sunday"), + ], + ) + def test_validate_weekend_data(self, timestamp): """Test detecting weekend data for equities.""" info = AssetInfo(symbol="AAPL", asset_class=AssetClass.EQUITY) validator = AssetValidator(info) - # January 7, 2023 is a Saturday df = pl.DataFrame( { - "timestamp": [datetime(2023, 1, 7)], + "timestamp": [timestamp], "open": [100.0], "high": [101.0], "low": [99.0], @@ -272,8 +303,7 @@ def test_validate_weekend_data(self): results = validator.validate(df) - assert "equity_specific" in results - assert any("weekend" in issue.lower() for issue in results["equity_specific"]) + assert results == {"equity_specific": ["Found 1 weekend data points"]} def test_validate_negative_prices(self): """Test detecting non-positive prices.""" From bf9743e772b9653b777d380fa207484d17864a04 Mon Sep 17 00:00:00 2001 From: Stefan Jansen Date: Thu, 15 Oct 2026 16:43:48 -0400 Subject: [PATCH 2/2] fix: reject only ISO weekend days in equity validation (#87) --- src/ml4t/data/assets/validation.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ml4t/data/assets/validation.py b/src/ml4t/data/assets/validation.py index dcd5ff6e..670b78ae 100644 --- a/src/ml4t/data/assets/validation.py +++ b/src/ml4t/data/assets/validation.py @@ -128,7 +128,7 @@ def _validate_equity(self, df: pl.DataFrame) -> dict[str, list[str]]: # Check for weekend data (should not exist for regular equities) if "timestamp" in df.columns: - weekend_data = df.filter(pl.col("timestamp").dt.weekday() >= 5) + weekend_data = df.filter(pl.col("timestamp").dt.weekday() >= 6) if len(weekend_data) > 0: issues.append(f"Found {len(weekend_data)} weekend data points")