A Python pipeline for scraping, cleaning, and analyzing auto-loan Asset-Backed Security (ABS) distribution reports filed with the SEC on Form 10-D. Built for academic research at the University of Georgia.
This project targets all Auto Loan and Auto Lease 10-D filings on EDGAR and extracts four standardized financial tables from each filing's Exhibit 99:
| Table | Description |
|---|---|
| Table 2 | Available Funds / Collections |
| Table 3 | Distributions |
| Table 4 | Noteholder Payments |
| Table 5 | Note Balance |
Covered issuers include Ford, CarMax, Ally, Fifth Third, Capital One, Santander, Toyota, BMW, Mercedes-Benz, and more.
The primary research output focuses on Cleanup Calls — the early retirement of ABS trusts once the remaining pool balance falls to ~10% of the original. The analytics pipeline:
- Validates the 10% Industry Standard — confirms cleanup calls are consistently triggered at ~10% of initial pool balance across all issuers.
- Proves the Terminal Event — shows a 1:1 ratio between the Cleanup Call Amount and the Remaining Pool Balance, confirming full debt retirement.
- Tranche Waterfalls — generates per-trust case study plots tracing subordinated tranche lifecycles down to their cleanup call date.
├── src/ # Core pipeline scripts
│ ├── scraper.py # Multi-threaded EDGAR scraper (Tables 2–5)
│ ├── analyze_abs.py # Master analytics & aggregation script
│ ├── rescrape_edgar.py # Targeted re-scrape for missing filings
│ ├── repair_collections.py # Repairs malformed collections data
│ ├── extract_cleanup_tranche_data.py # Extracts tranche-level cleanup call data
│ ├── final_abs_repair.py # Final post-processing repair pass
│ ├── verify_all.py # End-to-end output verification
│ └── plots/
│ ├── honkanen_plots_v7.py # Main visualization script (latest)
│ └── honkanen_response.py # Response plots for Dr. Honkanen
├── tests/
│ ├── test_mercedes_abs.py
│ ├── test_sec.py
│ └── test_sec_home.py
├── data/ # Raw input data (large files gitignored)
│ ├── all_10D_ABS.txt # Full list of 10-D filing URLs from EDGAR full-text index
│ └── all_ABS.txt # Filtered ABS URL list
├── deliverables/ # Outputs delivered to Dr. Honkanen
│ ├── For_Dr_Honkanen/ # Final plots and case study CSVs
│ ├── honkanen_deliverable_may2026.zip
│ ├── honkanen_instructions.txt
│ └── Table4 notes.xlsx
├── output/ # Generated data (gitignored)
├── requirements.txt
└── README.md
pip install -r requirements.txtDependencies: pandas, matplotlib, requests, lxml, beautifulsoup4
Fetches all 10-D filings from the URL list and writes Tables 2–5 to output/.
Uses 10 parallel threads, respects the SEC's 10 RPS rate limit, and supports resuming interrupted runs.
python src/scraper.py data/all_10D_ABS.txtOptional — write output to a custom directory:
python src/scraper.py data/all_10D_ABS.txt my_output_dir/Runs the master analytics pass over the scraped CSVs.
python src/analyze_abs.pyProduces all cleanup call visualizations and case study charts into output/analysis_v7/.
python src/plots/honkanen_plots_v7.pyOutputs:
01_scatter_by_brand.png— Cleanup call scatter by issuer02_call_to_initial_over_time.png— Cleanup-to-initial ratio time series03_call_to_remaining_over_time.png— Cleanup-to-remaining ratio time series04_casestudy_*.png— Individual tranche waterfall plotscase_study_pools.csv— Raw pool data for all case studies
python src/verify_all.py- Rate limiting: The scraper sleeps 1.05s per thread × 10 threads ≈ 9.5 RPS, staying under the SEC's 10 RPS cap.
- Resume support: Already-processed URLs are tracked in
output/processed_urls.txtand skipped on re-runs. - Large files:
output/CSVs (Tables 2–5 are 100–150 MB each) and raw input files are excluded from version control via.gitignore.