Normalize one-point regression residual volatility

This commit is contained in:
2026-04-07 17:02:00 +08:00
parent 18174a9e11
commit f6670d9e6d
2 changed files with 22 additions and 1 deletions

View File

@@ -309,6 +309,9 @@ def run_factor_regression(
fitted = x @ coefficients fitted = x @ coefficients
residuals = y.to_numpy() - fitted residuals = y.to_numpy() - fitted
residual_series = pd.Series(residuals, index=regression_frame.index) residual_series = pd.Series(residuals, index=regression_frame.index)
if len(residual_series) == 1:
residual_vol_ann = 0.0
else:
residual_vol_ann = float(residual_series.std(ddof=1) * np.sqrt(TRADING_DAYS_PER_YEAR)) residual_vol_ann = float(residual_series.std(ddof=1) * np.sqrt(TRADING_DAYS_PER_YEAR))
dof = n_obs - param_count dof = n_obs - param_count

View File

@@ -501,6 +501,24 @@ class RegressionTests(unittest.TestCase):
self.assertTrue(np.isnan(result["adj_r_squared"])) self.assertTrue(np.isnan(result["adj_r_squared"]))
self.assertAlmostEqual(result["residual_vol_ann"], 0.0, places=12) self.assertAlmostEqual(result["residual_vol_ann"], 0.0, places=12)
def test_run_factor_regression_single_observation_intercept_only_has_zero_residual_vol(self):
dates = pd.date_range("2024-01-01", periods=1, freq="B")
factors = pd.DataFrame(index=dates)
strategy = pd.Series([0.0015], index=dates)
result = run_factor_regression(strategy, factors, factor_cols=[])
self.assertAlmostEqual(result["alpha_daily"], 0.0015, places=12)
self.assertEqual(result["betas"], {})
self.assertEqual(result["t_stats"], {})
self.assertEqual(result["p_values"], {})
self.assertEqual(result["r_squared"], 0.0)
self.assertTrue(np.isnan(result["alpha_t_stat"]))
self.assertTrue(np.isnan(result["alpha_p_value"]))
self.assertTrue(np.isnan(result["adj_r_squared"]))
self.assertEqual(result["n_obs"], 1)
self.assertAlmostEqual(result["residual_vol_ann"], 0.0, places=12)
def test_run_factor_regression_rejects_rank_deficient_designs(self): def test_run_factor_regression_rejects_rank_deficient_designs(self):
dates = pd.date_range("2024-01-01", periods=6, freq="B") dates = pd.date_range("2024-01-01", periods=6, freq="B")
market = np.array([0.01, -0.02, 0.015, 0.005, -0.01, 0.02]) market = np.array([0.01, -0.02, 0.015, 0.005, -0.01, 0.02])