SPB Git

spb/wp29_uqo

Public
3.6 KB · 43 lines markdown
1# F1-conf-03 — Leverage and next-year default23## Question4How 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.56## Data and exclusions7I 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`:81. 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`.92. 40 exact duplicate rows removed (same firm-year, every value identical), 2140 → 2100. After this the panel is balanced at 300 firms × 7 years.103. 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.114. Rows with missing predictors: none (0 removed).1213Estimation 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`.1415## Method16- **Baseline:** the unconditional default rate in the estimation sample (`default_rate`).17- **Main model:** OLS of `default_next` on an intercept, `leverage`, `cash_ratio` and `log_sales` (`predictors_used`).18- **Standard errors:** clustered by `firm_id` (statsmodels cluster covariance with its default small-sample correction, 300 clusters).19- **Randomness:** none, so `random_seed` is null.20- **Reproducibility:** `out/analysis.py` regenerates every output from `data/`.2122## Results23- **Baseline default rate:** 0.121 (`default_rate`; 218 defaults, `supp_n_defaults`).24- **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.25- **Other coefficients:**26  - cash_ratio: −0.186 (`supp_coef_cash_ratio`)27  - log_sales: −0.0073 (`supp_coef_log_sales`)28  - intercept: 0.090 (`supp_intercept`)29- **In-sample R²:** 0.035 (`r2`).3031## Uncertainty32- **Firm-clustered standard error:** 0.0408 (`se_leverage_cluster`).33- **95% CI:** [0.184, 0.344] (`supp_ci95_leverage_cluster`).34- **p-value:** about 1e-10 (`supp_pvalue_leverage_cluster`).35- **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.3637## Limitations and open issues38- **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].39- **Low R²:** the model explains little of the variation in default (`r2`).40- **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.41- **Duplicate handling:** I treated the 40 duplicates as assembly errors because their values were identical. Keeping them would have double-counted those firm-years.42- **Feasibility:** complete (`feasibility`).43
Files · 76f9a44a3a85fb2bc2b0b370a4ae4eed9b95e579
Menu

Theme