FICO 8 is the most widely used credit scoring model in the United States, yet its exact formula is a closely guarded trade secret. Scores range from 300 to 850 and influence the interest rates, credit limits, and loan approvals available to hundreds of millions of consumers.
In a remarkable piece of reverse-engineering work, data scientist Michael Fowlie published a study analyzing a large dataset of credit files with known FICO 8 scores. Using ordinary least squares (OLS) regression and machine learning models, he was able to approximate the scoring formula with surprising accuracy — an R-squared of 0.64 and a mean absolute error of just 14 points.
This article summarizes the key findings from that research. It is not the official FICO formula, and it cannot predict your exact score. But it reveals which variables matter, how much they matter, and what a "perfect" credit profile looks like under the hood.
This article is based on the research of Michael Fowlie, published as "Reverse Engineering FICO 8" on Medium. The original article walks through the full methodology, including data collection, feature engineering, and model evaluation.
All code, datasets, and a live API are open-source on GitHub. The FICO 8 estimation API is also publicly available for testing.
CreditCookbook is not affiliated with FICO, Michael Fowlie, or the original research. All findings are summarized for educational purposes.
FICO publicly discloses the five categories that make up a FICO 8 score and their approximate weights. What they don't disclose is how each category is computed internally or how the sub-calculations combine into the final number.
| Factor | Weight | What it measures |
|---|---|---|
| Payment History | 35% | Late payments, delinquencies, collections, public records |
| Amounts Owed | 30% | Utilization ratios, total balances, number of accounts with balances |
| Length of Credit History | 15% | Age of oldest account, average age of accounts, time since account activity |
| New Credit | 10% | Hard inquiries, recently opened accounts, time since last inquiry |
| Credit Mix | 10% | Diversity of account types — revolving, installment, mortgage, auto |
The weights are additive, not multiplicative — a perfect payment history does not guarantee a perfect score if utilization is high and credit history is short. The interplay between factors is what the regression and ML models attempted to capture.
The first approach was a linear regression — fitting the FICO score as a weighted sum of credit file variables. The model achieved an R-squared of 0.64, meaning it explained 64% of the variance in FICO scores, with a standard deviation of error around 19 points.
While not precise enough to predict an individual's exact score, the regression coefficients reveal the marginal impact of each variable — how many points each factor costs or gains.
| Variable | Coefficient | Interpretation |
|---|---|---|
| 30-day late payment | −8 pts | Each 30-day late mark costs ~8 points |
| 120-day late payment | −13 pts | Each 120-day late mark costs ~13 points |
| First delinquency | −22 pts | The first-ever delinquency on file carries the largest single penalty |
| Recent delinquency | −8 pts | A delinquency in the recent past (vs. aged) costs an additional ~8 points |
| Revolving utilization | −1 pt / 3% | Every 3% increase in utilization costs ~1 point |
| Hard inquiries (6 months) | −1.1 pts | Each hard inquiry within 6 months costs ~1.1 points |
Linear regression treats every variable as independent and additive. FICO 8 does not — it uses segmented scorecards and interaction effects. To capture this, the research trained a machine learning model that decomposes the credit file into five subscores, each normalized to a 0.0–1.0 range.
The ML model achieved a mean absolute error of 14 points — meaning that on average, the predicted score was within 14 points of the actual FICO 8 score. This is a meaningful improvement over the OLS model's 19-point standard deviation of error.
Captures lates, delinquencies, collections, public records, and their age/recency.
range: 0.0 – 1.0
Captures utilization, total balances, and proportion of accounts with balances.
range: 0.0 – 1.0
Captures age of oldest account, average age, and time since last activity.
range: 0.0 – 1.0
Captures hard inquiries, new accounts, and recent credit-seeking behavior.
range: 0.0 – 1.0
Captures diversity of account types — revolving, installment, mortgage, auto.
range: 0.0 – 1.0
Weighted combination of all five subscores, mapped to the 300–850 scale.
MAE: 14 pts
Beyond the regression and ML models, the research identified that FICO 8 uses segmented scorecards — decision-tree-like rules that bucket consumers into segments, each with its own scoring baseline. The same variable can have a very different marginal impact depending on which segment you fall into.
For example, the cost of a new inquiry is higher for someone with a thin file than for someone with a thick file. The penalty for a late payment is steeper for someone with no prior delinquencies than for someone whose file already has several. This is why the linear model only captured 64% of the variance — the other 36% lives in these interaction effects.
The ML model approximated these scorecards by learning the segment boundaries from the data, which is why it achieved a tighter error band (14 points vs. 19 points).
The regression and ML analysis surfaced several non-linear thresholds — points where a specific balance or credit limit crosses a boundary and triggers a discrete score change. These are not smooth gradients; they are step functions in the scoring formula.
| Threshold | Trigger | Effect |
|---|---|---|
| $10K avg balance | Average balance across accounts exceeds $10,000 | Cutoff — scores above this balance level begin to drop more steeply |
| $15K revolving limit | Total revolving credit limit crosses $15,000 | Score boost — higher limits signal trust and lower utilization |
| $50K revolving limit | Total revolving credit limit crosses $50,000 | Additional score boost — a second tier of limit benefit |
| $31K balance | Total balance crosses $31,000 | Score drop — a specific penalty band |
| $50K balance | Total balance crosses $50,000 | Further score drop — debt load becomes a stronger negative signal |
| $100K balance | Total balance crosses $100,000 | Most severe balance-related score drop |
| $39K bankcard limit | Total bankcard (credit card) limit crosses $39,000 | Score boost — a specific threshold for bankcard-only limits |
These thresholds suggest that increasing your credit limits (e.g., requesting CLI increases from existing card issuers) can produce score gains at specific boundaries — particularly at $15K, $39K, and $50K in total revolving/bankcard limits. Conversely, carrying balances above $10K average, $31K total, $50K total, and $100K total triggers discrete penalties. If you're near one of these boundaries, paying down to get under it may produce a larger score jump than the OLS coefficient alone would suggest.
By isolating the credit files that scored 840 or above, the research identified a consistent profile — the shared characteristics of near-perfect FICO 8 scores. This is what the scoring model rewards most heavily.
Hard inquiries in the last 6 months
Late payments or delinquencies on file
Bankruptcies, judgments, or tax liens
Average number of open accounts
Average revolving utilization rate
Total accounts (open + closed)
No bankruptcies on file — ever
Average age of oldest account
FICO 8 score range (of 300–850)