Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
130 changes: 99 additions & 31 deletions METHODOLOGY.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,22 +22,35 @@ the narrative is coherent, not pulled from Hyundai's actuals.

## 3. Core formulas

The central correction over a naive DSI model: **above-target stock is not automatically a
liquidation candidate.** Stock that will sell through within a patience window at current
demand should simply have its replenishment paused — it *bleeds off* at no clearance cost.
Only the residual still sitting after the window is a **structural overhang** worth a
clearance haircut. This is what stops the model from recommending you discount demand you
already have.

```
dailySales = avgMonthlySales × (1 + demandShift) / 30
DSI = stock / dailySales # days of inventory on hand
targetStock = targetDSI[category] × dailySales
excessUnits = max(0, stock − targetStock)
excessCapital = excessUnits × unitCost
carryingOnExcess= excessCapital × carryingRate # annual $ bled on the excess
liquidationLoss = excessCapital × liquidationDiscount # one-time clearance haircut
recaptured = excessCapital × (1 − liquidationDiscount)
netFirstYear = carryingOnExcess − liquidationLoss
excessUnits = max(0, stock − targetStock) # gross above target
windowUnits = dailySales × 30 × clearWindowMonths # what sells within the patience window
bleedUnits = min(excessUnits, windowUnits) # clears organically — no action
overhangUnits = max(0, excessUnits − bleedUnits) # structural overhang — the actionable base
overhangCapital = overhangUnits × unitCost
monthsToClear = excessUnits / (dailySales × 30) # organic sell-through of the excess

carryOnOverhang = overhangCapital × carryingRate # annual $ bled on the overhang
liquidationLoss = overhangCapital × liquidationDiscount # one-time clearance haircut
recaptured = overhangCapital × (1 − liquidationDiscount)
netBenefit = carryOnOverhang − liquidationLoss
portfolioDSI = Σ stock / Σ dailySales # volume-weighted, not a simple average
```

**Status rule (segment-specific, not one universal cutoff):**

- `At Risk` — `DSI > targetDSI` (over-stocked relative to the segment's velocity)
- `Overhang` — `overhangUnits > 0` (above target *and* won't clear within the window → clearance candidate)
- `Bleeding Off` — above target but `overhangUnits = 0` (self-resolves once replenishment pauses → no clearance)
- `Stockout Risk` — `DSI < 0.5 × targetDSI` (too lean; turning away serviceable demand)
- `Healthy` — otherwise

Expand All @@ -53,45 +66,63 @@ segments do not. A uniform threshold would contradict the thesis.
| SUV | 60 | Mainstream mid-velocity |
| Volume | 45 | High turnover; lean target protects ROIC |

## 5. Decision rule
## 5. Decision rule (two steps)

1. **Pause, don't dump.** For every above-target pool, first stop replenishment and let it
bleed off. Anything that clears within `clearWindowMonths` never warrants a clearance
haircut — liquidating demand you already have is value-destructive.
2. **Clear the overhang on net benefit.** For the structural overhang that remains, act
**only when `netBenefit > 0`** — the annual carrying cost avoided exceeds the one-time
clearance loss. Because the overhang sits *beyond* the window by construction, annual
carry is the right horizon to weigh against the one-time haircut.

For each above-target pool, act **only when `netFirstYear > 0`** — i.e. the annual
carrying cost avoided exceeds the one-time clearance loss. Recaptured capital is then
redeployed against `Stockout Risk` pools first (relieving lost-sale demand), with the
remainder funding strategic EV / growth priorities. This resolves the
redirect-vs-liquidate distinction: transfer where a constrained pool can absorb units,
clear only where none can.
Recaptured capital is then redeployed against `Stockout Risk` pools first (relieving
lost-sale demand), with the remainder funding strategic EV / growth priorities. This is why
the model clears the IONIQ 5 (soft demand → a months-long overhang) but *not* the Tucson
(above target, yet sells through in days). It also resolves the redirect-vs-liquidate
distinction: transfer where a constrained pool can absorb units, clear only where none can.

## 6. Scenario parameters (defaults & ranges)

| Parameter | Default | Range | Source logic |
|---|---|---|---|
| `carryingRate` | 18%/yr | 8–28% | Floorplan interest (~8%) + depreciation (~7%) + storage/insurance (~3%) |
| `liquidationDiscount` | 6% | 2–15% | Wholesale/auction haircut to clear excess units |
| `liquidationDiscount` | 6% | 2–15% | Wholesale/auction haircut to clear excess units (see §12 for the channel ladder) |
| `clearWindowMonths` | 2 mo | 1–6 mo | Patience window: above-target stock that sells through within it bleeds off rather than being cleared |
| `demandShift` | 0% | −20% to +20% | Demand stress test |

## 7. Baseline results (default assumptions)

| Metric | Value |
|---|---|
| Capital deployed | $2.87B |
| Capital above target | $412M (14% of deployed) |
| Annualized carrying cost on excess | $74M/yr |
| Capital recaptured (net of discount) | $387M |
| One-time clearance loss | $25M |
| First-year net benefit | $49M |
| Capital deployed | $2.80B |
| Capital above target (gross) | $603M (22% of deployed) |
| Structural overhang (actionable) | $320M (11% of deployed) |
| Annualized carrying cost on overhang | $58M/yr |
| Capital recaptured (net of discount) | $301M |
| One-time clearance loss | $19M |
| Net benefit | $38M |
| Stockout-risk funding gap | $216M (fully covered by recaptured capital) |
| Portfolio DSI (volume-weighted) | 50 days |
| Portfolio DSI (volume-weighted) | 52 days |
| Overhang pools / bleeding-off pools | 3 / 1 |

Note the gap between **$603M above target** and the **$320M actually cleared**: ~$283M of
above-target stock bleeds off on its own once replenishment pauses, and is never liquidated.

## 8. Sensitivity (illustrative)

- **Carrying rate is the swing factor.** At 8% the annual bleed falls to ~$33M and several
pools no longer clear the net-benefit hurdle; at 28% it rises past ~$115M and clearance is
obviously worth it. This is why the rate assumption must be owned by Finance, not assumed.
- **Clearance discount** mostly affects *how much* is recaptured, not *whether* to act,
until it approaches the carrying rate.
- **Demand shift** moves pools across thresholds — a −10% shock pushes additional volume/SUV
pools above target; +10% relieves them. The status logic recomputes live.
- **The bleed-off window decides how much is even actionable.** This is the parameter that
encodes "don't liquidate demand you still have." At a 1-month window more above-target stock
counts as overhang; widen it toward 6 months and most pools are judged self-resolving, so the
overhang — and the recommended clearance — shrinks toward zero. At the 2-month default, $320M
of the $603M above-target is overhang.
- **Carrying rate** scales the annual bleed on the overhang (≈$26M at 8%, ≈$90M at 28% on the
baseline overhang) and, with the discount, sets whether clearing clears the net-benefit hurdle.
It must be owned by Finance, not assumed.
- **Clearance discount** mostly affects *how much* is recaptured, not *whether* to act, until it
approaches the carrying rate.
- **Demand shift** moves pools across thresholds and resizes the overhang — a −10% shock lengthens
sell-through (more overhang); +10% lets more stock bleed off. The status logic recomputes live.

## 9. Known limitations (and the honest next steps)

Expand All @@ -100,8 +131,9 @@ clear only where none can.
- **Contribution margin not modeled**, so redeployment upside is stated as the funded demand gap,
not an incremental-profit figure. *Next step: per-segment margin to value recaptured capital.*
- **Steady-state demand** — no seasonality, model-year transitions, or incentive elasticity.
- **Single-period view** — `netFirstYear` mixes a recurring annual saving with a one-time loss;
a full NPV would discount multi-year carrying savings. *Next step: multi-period NPV.*
- **Single-period view** — `netBenefit` weighs one year of carry on the overhang against a one-time
loss. The bleed-off window removes the cruder "annual-vs-one-time always clears" bias, but a true
model would integrate carry over each pool's expected hold path. *Next step: multi-period NPV.*
- Figures are illustrative and not Hyundai actuals.

## 10. Retail & DMS layer
Expand Down Expand Up @@ -147,3 +179,39 @@ from the OEM layer, now visible as floorplan cost.
yet modeled (would quantify the *margin* cost of aging, not just floorplan); dealer-trade
logistics cost is assumed negligible; and a live DMS integration (vs. illustrative aging
vectors) is the obvious productionization step.

## 11. Whose capital is it — OEM vs. dealer floorplan

A deliberate simplification worth stating plainly: the OEM layer values the **entire** national
pipeline at OEM wholesale cost and frames clearing it as recovering OEM capital. In reality,
once a unit is wholesaled to a franchised dealer it sits on the **dealer's floorplan**, not the
OEM's balance sheet — which is exactly what the Retail & DMS layer (§10) measures. The two
layers describe the same metal from two balance sheets:

| Stage | Who owns it | Where the carry lands |
|---|---|---|
| In production / in-transit / port / unallocated | **OEM** | OEM working capital |
| Allocated & wholesaled to a dealer (on the lot) | **Dealer** | Dealer floorplan interest (Retail layer) |

The OEM's *direct* capital-at-risk is therefore the un-wholesaled slice plus its exposure to
incentives and residual support; the on-lot overhang is borne by dealers and influenced by the
OEM through **allocation and incentive policy**, not by repossessing units. Figures are stated on
a single OEM-wholesale-cost basis for clarity, with the dealer view reconciled in §10. *Next step:
split the pipeline into OEM-owned vs. dealer-floorplanned and carry each at its own rate.*

## 12. How the overhang actually clears (the "6%" unpacked)

`liquidationDiscount` is a single blended haircut; in practice clearance runs down a ladder of
channels, each with a different cost and side effect — there is no single anonymous buyer:

| Channel | Buyer | Typical haircut | Side effect |
|---|---|---|---|
| Retail incentive | Ordinary retail customer | ~2–8% (subvented APR/lease, cash) | Pulls demand forward; brand-equity drag on luxury |
| Fleet / commercial | Rental & commercial fleets | ~8–15% | Floods the used market later → **depresses residuals** |
| Dealer trade / wholesale | Other dealers | ~10–20% | Logistics cost; limited absorbing capacity |
| Auction / remarketing | Dealers & exporters | ~15–30% | Last resort for 90+ day units (see §10 curtailment) |

The default 6% corresponds to a **modest retail-incentive bump** — the cheapest rung. The model
does not yet price the residual-value contamination from the fleet/auction rungs, which would feed
back into a higher effective EV carrying rate. *Next step: a channel-mix input that blends the
haircut and routes the residual hit back into `carryingRate`.*
33 changes: 20 additions & 13 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,23 +18,27 @@ one place while demand goes unserved in another.
## The approach

Measure each model's **Days Sales of Inventory (DSI)** against a **segment-specific target**,
then apply a **net-benefit decision rule**: clear above-target inventory *only when the annual
carrying cost avoided exceeds the one-time clearance loss*, and redeploy the recaptured capital
to relieve stockout-risk segments first.
separate stock that will **bleed off on its own** (just pause replenishment) from a genuine
**structural overhang**, then clear only that overhang *when the annual carrying cost avoided
exceeds the one-time clearance loss* — redeploying the recaptured capital to relieve
stockout-risk segments first. The point of the bleed-off step: never discount demand you
already have.

## Key results (illustrative baseline)

| Metric | Value |
|---|---|
| Capital deployed | **$2.87B** |
| Capital above segment target | **$412M** (14%) |
| Annualized carrying cost bled | **$74M/yr** |
| Capital recaptured | **$387M** |
| First-year net benefit | **$49M** |
| Capital deployed | **$2.80B** |
| Capital above segment target (gross) | **$603M** (22%) |
| Structural overhang (won't bleed off) | **$320M** (11%) |
| Annualized carrying cost on overhang | **$58M/yr** |
| Capital recaptured | **$301M** |
| Net benefit | **$38M** |
| Demand-constrained gap funded | **$216M**, fully covered |

The recaptured capital more than covers the volume shortfall — the EV-glut and slow-luxury pools
fund the lean volume line, with ~$171M left for strategic priorities. Full derivation in
Most above-target stock isn't cleared — it *bleeds off* once replenishment pauses; only the **$320M
structural overhang** (EV-glut + slow-luxury) is liquidated. The recaptured capital more than covers
the volume shortfall, with **~$85M** left for strategic priorities. Full derivation in
[METHODOLOGY.md](./METHODOLOGY.md).

## How it's structured
Expand All @@ -43,9 +47,10 @@ The app is organized as four role-targeted views:

1. **Strategy Brief** — answer-first recommendation with quantified impact, then a
Situation / Complication / Resolution case. *(Consulting framing.)*
2. **Decision Dashboard** — segment-targeted DSI table, corrected and accurately-labeled KPIs,
a ranked net-benefit recommendation engine, and **live scenario sliders** (carrying rate,
clearance discount, demand shift) so every figure can be stress-tested. *(Planning / analytics.)*
2. **Decision Dashboard** — segment-targeted DSI table that separates a **structural overhang**
from above-target stock that simply **bleeds off**, accurately-labeled KPIs, a ranked
net-benefit recommendation engine, and **live scenario sliders** (carrying rate, clearance
discount, bleed-off window, demand shift) so every figure can be stress-tested. *(Planning / analytics.)*
3. **Execution Plan** — phased rollout, RACI decision rights, governance KPIs, and a
risk/mitigation register. *(Program management.)*
4. **Retail & DMS** — drills the OEM thesis down to the dealer P&L: DMS-sourced aging buckets,
Expand All @@ -62,6 +67,8 @@ This was deliberately built to survive a probing interview:
and a volume-weighted "Portfolio DSI," not a count ratio mislabeled as a financial return.
- **The headline tradeoff is actually computed** — carrying cost avoided vs. clearance loss, per
pool, with an explicit act/hold rule — not asserted in prose.
- **Above-target ≠ liquidate** — the model strips out inventory that sells through on its own and
only clears the structural overhang, so it never recommends discounting demand you already have.
- **Targets are segment-specific**, consistent with the core thesis.
- **Assumptions are owned and sourced**, with sensitivity and limitations documented openly.

Expand Down
Loading
Loading