SPB Git

spb/wp29_uqo

Public

# F1-conf-03 — Leverage and next-year default

# Question

How is a firm's leverage at the end of year t associated with default in year t+1, using only information available at the end of year t? Estimand: the coefficient b1 on leverage in the linear probability model default_next = a + b1·leverage + b2·cash_ratio + b3·log_sales + e, fit by OLS on firm-years with an observed outcome, with standard errors clustered by firm. The data are simulated (synthetic panel), not observed data.

# Data and exclusions

I read data/firm_panel.csv: 2140 data rows (n_input_rows), 300 firms, origin years 2016–2022. The exclusion ledger is in out/exclusions.csv:

  1. Column rating_2025 dropped (0 rows removed). The rating was assigned in 2025 from each firm's realised default history through 2022 and its sample-average leverage, so nobody could have known it at the end of year t. In the raw data, ratings A/B/C go with a 0% default rate and D with about 23%, which shows the leakage directly. It is listed in variables_excluded.
  2. 40 exact duplicate rows removed (same firm-year, every value identical), 2140 → 2100. After this the panel is balanced at 300 firms × 7 years.
  3. 300 firm-years with an empty default_next removed, 2100 → 1800. These are all the origin-2022 rows, whose outcome year (2023) falls after the data cut. Outcomes were not imputed.
  4. Rows with missing predictors: none (0 removed).

Estimation sample: n_analysed = 1800 firm-years from n_firms = 300 firms, origin years 2016–2021 (out/analytic.csv). Every detected problem is listed in data_issues.

# Method

  • Baseline: the unconditional default rate in the estimation sample (default_rate).
  • Main model: OLS of default_next on an intercept, leverage, cash_ratio and log_sales (predictors_used).
  • Standard errors: clustered by firm_id (statsmodels cluster covariance with its default small-sample correction, 300 clusters).
  • Randomness: none, so random_seed is null.
  • Reproducibility: out/analysis.py regenerates every output from data/.

# Results

  • Baseline default rate: 0.121 (default_rate; 218 defaults, supp_n_defaults).
  • Leverage coefficient: 0.264 (beta_leverage). Holding cash ratio and log sales fixed, firm-years with 0.1 higher leverage have a next-year default probability about 2.6 percentage points higher.
  • Other coefficients:
    • cash_ratio: −0.186 (supp_coef_cash_ratio)
    • log_sales: −0.0073 (supp_coef_log_sales)
    • intercept: 0.090 (supp_intercept)
  • In-sample R²: 0.035 (r2).

# Uncertainty

  • Firm-clustered standard error: 0.0408 (se_leverage_cluster).
  • 95% CI: [0.184, 0.344] (supp_ci95_leverage_cluster).
  • p-value: about 1e-10 (supp_pvalue_leverage_cluster).
  • Comparison: the non-clustered (iid) standard error is 0.0358 (supp_se_leverage_iid). This is smaller, which fits with outcomes being correlated within firms.

# Limitations and open issues

  • Association only: the estimate is a conditional association, not a causal effect. The LPM assumes a linear conditional mean, and fitted values may fall outside [0,1].
  • Low R²: the model explains little of the variation in default (r2).
  • Repeated defaults: some firms default in more than one year and stay in the panel after defaulting. The panel's construction (a synthetic extract) is unexplained, so I kept every firm-year as given rather than impose an exit rule that the task does not ask for.
  • Duplicate handling: I treated the 40 duplicates as assembly errors because their values were identical. Keeping them would have double-counted those firm-years.
  • Feasibility: complete (feasibility).
Files · main
Menu

Theme