Eleven months of warning at a small-town cattle auction
Steer prices at one Alabama sale barn tripled in seven years, and the model dates every break. The interesting one happened eleven months earlier, in a series nobody watches.
Every Tuesday, in Clay County, Alabama, cattle go through a ring and a USDA market reporter writes down what they sold for. The report goes out as a PDF the same day — head count, weight range, price range, one line per lot. It has done this since at least May 2019, on 298 Tuesdays and, for reasons I have not established, one Wednesday and one Saturday.
It is a small barn. The median sale day moves about 170 head. Nobody is setting a national price in Lineville. But the national price arrives there anyway, every week, and gets written down.
I pulled 15,583 usable rows out of 300 of those PDFs — May 2019 to March 2026 — and fit the same class of model I used on Nashville’s 311 data: a Bayesian changepoint model that is handed a series and asked where it breaks, without being told where to look.
Last time I went looking for a date and found a slope. This time the dates are real. That turned out to be the less interesting half of it.
Four regimes in the steer price
Here is the headline series — the average price of feeder steers, in dollars per hundredweight, monthly, 82 months.
regimes
| regime | months | mean $/cwt | drift/mo | vs prior |
|---|---|---|---|---|
| 2019-05 — 2022-11 | 43 | 136.46 | +0.85 | — |
| 2022-12 — 2023-12 | 13 | 212.48 | +5.28 | +55.7% |
| 2024-01 — 2024-11 | 11 | 268.38 | −4.70 | +26.3% |
| 2024-12 — 2026-02 | 15 | 360.49 | +8.71 | +34.3% |
data table
| month | observed | fit | P(boundary) |
|---|---|---|---|
| 2019-05 | 135.35 | 118.57 | 0.000 |
| 2019-06 | 120.72 | 119.42 | 0.000 |
| 2019-07 | 125.42 | 120.27 | 0.000 |
| 2019-08 | 125.45 | 121.12 | 0.005 |
| 2019-09 | 117.91 | 121.98 | 0.004 |
| 2019-10 | 120.97 | 122.83 | 0.003 |
| 2019-11 | 131.03 | 123.68 | 0.003 |
| 2019-12 | 111.62 | 124.53 | 0.002 |
| 2020-01 | 143.96 | 125.38 | 0.003 |
| 2020-02 | 145.95 | 126.24 | 0.002 |
| 2020-03 | 123.74 | 127.09 | 0.009 |
| 2020-04 | 114.52 | 127.94 | 0.007 |
| 2020-05 | 123.43 | 128.79 | 0.003 |
| 2020-06 | 123.26 | 129.64 | 0.003 |
| 2020-07 | 123.68 | 130.50 | 0.003 |
| 2020-08 | 120.42 | 131.35 | 0.002 |
| 2020-09 | 123.72 | 132.20 | 0.003 |
| 2020-10 | 133.66 | 133.05 | 0.003 |
| 2020-11 | 128.14 | 133.90 | 0.002 |
| 2020-12 | 135.90 | 134.76 | 0.002 |
| 2021-01 | 132.83 | 135.61 | 0.002 |
| 2021-02 | 137.01 | 136.46 | 0.002 |
| 2021-03 | 138.89 | 137.31 | 0.002 |
| 2021-04 | 130.84 | 138.16 | 0.002 |
| 2021-05 | 125.41 | 139.02 | 0.002 |
| 2021-06 | 132.86 | 139.87 | 0.002 |
| 2021-07 | 143.20 | 140.72 | 0.003 |
| 2021-08 | 142.68 | 141.57 | 0.002 |
| 2021-09 | 135.05 | 142.42 | 0.002 |
| 2021-10 | 142.11 | 143.28 | 0.002 |
| 2021-11 | 140.10 | 144.13 | 0.003 |
| 2021-12 | 144.38 | 144.98 | 0.004 |
| 2022-01 | 148.75 | 145.83 | 0.005 |
| 2022-02 | 157.84 | 146.68 | 0.006 |
| 2022-03 | 165.76 | 147.54 | 0.004 |
| 2022-04 | 151.71 | 148.39 | 0.008 |
| 2022-05 | 151.99 | 149.24 | 0.021 |
| 2022-06 | 145.25 | 150.09 | 0.053 |
| 2022-07 | 143.79 | 150.94 | 0.061 |
| 2022-08 | 162.95 | 151.80 | 0.063 |
| 2022-09 | 158.07 | 152.65 | 0.085 |
| 2022-10 | 153.50 | 153.50 | 0.100 |
| 2022-11 | 154.14 | 154.35 | 0.133 |
| 2022-12 | 186.75 | 180.78 | 0.409 |
| 2023-01 | 173.73 | 186.06 | 0.030 |
| 2023-02 | 182.17 | 191.35 | 0.028 |
| 2023-03 | 201.88 | 196.63 | 0.024 |
| 2023-04 | 199.16 | 201.91 | 0.004 |
| 2023-05 | 206.58 | 207.20 | 0.005 |
| 2023-06 | 223.84 | 212.48 | 0.009 |
| 2023-07 | 229.27 | 217.76 | 0.006 |
| 2023-08 | 232.03 | 223.05 | 0.007 |
| 2023-09 | 223.11 | 228.33 | 0.021 |
| 2023-10 | 230.39 | 233.61 | 0.016 |
| 2023-11 | 234.31 | 238.89 | 0.016 |
| 2023-12 | 239.00 | 244.18 | 0.018 |
| 2024-01 | 282.00 | 291.88 | 0.602 |
| 2024-02 | 282.70 | 287.18 | 0.053 |
| 2024-03 | 318.23 | 282.48 | 0.032 |
| 2024-04 | 285.67 | 277.78 | 0.144 |
| 2024-05 | 245.91 | 273.08 | 0.433 |
| 2024-06 | 259.91 | 268.38 | 0.007 |
| 2024-07 | 257.59 | 263.68 | 0.005 |
| 2024-08 | 274.89 | 258.98 | 0.010 |
| 2024-09 | 244.71 | 254.28 | 0.038 |
| 2024-10 | 248.72 | 249.58 | 0.010 |
| 2024-11 | 251.86 | 244.88 | 0.021 |
| 2024-12 | 289.70 | 299.56 | 0.846 |
| 2025-01 | 307.92 | 308.26 | 0.029 |
| 2025-02 | 314.66 | 316.97 | 0.002 |
| 2025-03 | 346.31 | 325.67 | 0.005 |
| 2025-04 | 353.33 | 334.38 | 0.003 |
| 2025-05 | 341.25 | 343.08 | 0.018 |
| 2025-06 | 333.32 | 351.79 | 0.004 |
| 2025-07 | 371.42 | 360.49 | 0.001 |
| 2025-08 | 368.49 | 369.19 | 0.001 |
| 2025-09 | 379.49 | 377.90 | 0.003 |
| 2025-10 | 353.75 | 386.61 | 0.047 |
| 2025-11 | 390.06 | 395.31 | 0.003 |
| 2025-12 | 385.86 | 404.01 | 0.004 |
| 2026-01 | 433.12 | 412.72 | 0.000 |
| 2026-02 | 438.60 | 421.43 | 0.000 |
Read left to right:
| regime | months | mean $/cwt | drift/mo | vs prior |
|---|---|---|---|---|
| 2019-05 — 2022-11 | 43 | 136.46 | +0.85 | — |
| 2022-12 — 2023-12 | 13 | 212.48 | +5.28 | +55.7% |
| 2024-01 — 2024-11 | 11 | 268.38 | −4.70 | +26.3% |
| 2024-12 — 2026-02 | 15 | 360.49 | +8.71 | +34.3% |
Forty-three months of essentially nothing — $0.85 a month on a $136 base, which over three and a half years is drift you would not notice standing at the rail. Then a breakout, a genuine pullback through 2024, and then the steepest stretch in the record: +$8.71 per hundredweight per month, sustained for fifteen months and still going at the end of the data. First month in the series, $135.35. Last month, $438.60.
The model is most confident about the most recent break. P(boundary at 2024-12) = 0.846, and 0.895 of the posterior mass sits in the three months around it. The 2024-01 turn carries 0.602. The original 2022-12 breakout is the weakest of the three at 0.409 — the mass smears across late 2022 — though 0.699 of it lands in the five months from October 2022 to February 2023.
All three survive the obvious robustness check. The fit ships with a sensitivity grid — the same model re-fit at six different priors on expected regime length — and 2022-12, 2024-01 and 2024-12 appear at every single setting. Only the tightest prior adds a fourth boundary. Nothing here is an artefact of how long I told the model regimes ought to be.
This is, so far, an unremarkable finding. Cattle prices went up; anyone in the business knows that. The model has recovered something a producer could have told me over the fence, which is mostly evidence that the model works.
The series nobody watches
Underneath the price series there are volume series, and one of them is doing something.
Replacement cattle are animals sold to go into a breeding herd rather than to be grown out or harvested — at Clay County, overwhelmingly bred cows. The distinction matters more than it sounds. A feeder steer is this year’s output. A bred cow is the machine. Producers buying them are expanding; producers selling them are liquidating, and once a cow leaves the herd the calf she would have had is not merely delayed, it does not exist.
regimes
| regime | months | mean head/sale-day | level | vs prior |
|---|---|---|---|---|
| 2019-05 — 2021-12 | 32 | 32.09 | 32.1 | — |
| 2022-01 — 2026-02 | 50 | 14.18 | 14.2 | −55.8% |
data table
| month | observed | fit | P(boundary) |
|---|---|---|---|
| 2019-05 | 50.00 | 32.09 | 0.000 |
| 2019-06 | 16.00 | 32.09 | 0.000 |
| 2019-07 | 24.00 | 32.09 | 0.000 |
| 2019-08 | 18.00 | 32.09 | 0.011 |
| 2019-09 | 7.00 | 32.09 | 0.011 |
| 2019-10 | 23.00 | 32.09 | 0.029 |
| 2019-11 | 94.00 | 32.09 | 0.047 |
| 2019-12 | 23.00 | 32.09 | 0.007 |
| 2020-01 | 15.00 | 32.09 | 0.008 |
| 2020-02 | 36.00 | 32.09 | 0.010 |
| 2020-03 | 121.00 | 32.09 | 0.009 |
| 2020-04 | 18.00 | 32.09 | 0.026 |
| 2020-05 | 24.00 | 32.09 | 0.014 |
| 2020-06 | 32.00 | 32.09 | 0.011 |
| 2020-07 | 47.00 | 32.09 | 0.011 |
| 2020-08 | 44.00 | 32.09 | 0.015 |
| 2020-09 | 43.00 | 32.09 | 0.022 |
| 2020-10 | 34.00 | 32.09 | 0.039 |
| 2020-11 | 24.00 | 32.09 | 0.049 |
| 2020-12 | 15.00 | 32.09 | 0.037 |
| 2021-01 | 31.00 | 32.09 | 0.019 |
| 2021-02 | 12.00 | 32.09 | 0.023 |
| 2021-03 | 18.00 | 32.09 | 0.013 |
| 2021-04 | 44.00 | 32.09 | 0.011 |
| 2021-05 | 25.00 | 32.09 | 0.018 |
| 2021-06 | 28.00 | 32.09 | 0.018 |
| 2021-07 | 16.00 | 32.09 | 0.020 |
| 2021-08 | 53.00 | 32.09 | 0.013 |
| 2021-09 | 23.00 | 32.09 | 0.118 |
| 2021-10 | 21.00 | 32.09 | 0.129 |
| 2021-11 | 16.00 | 32.09 | 0.117 |
| 2021-12 | 32.00 | 32.09 | 0.067 |
| 2022-01 | 13.00 | 14.18 | 0.215 |
| 2022-02 | 15.00 | 14.18 | 0.094 |
| 2022-03 | 13.00 | 14.18 | 0.055 |
| 2022-04 | 17.00 | 14.18 | 0.030 |
| 2022-05 | 22.00 | 14.18 | 0.025 |
| 2022-06 | 21.00 | 14.18 | 0.030 |
| 2022-07 | 18.00 | 14.18 | 0.036 |
| 2022-08 | 21.00 | 14.18 | 0.034 |
| 2022-09 | 14.00 | 14.18 | 0.043 |
| 2022-10 | 3.00 | 14.18 | 0.031 |
| 2022-11 | 26.00 | 14.18 | 0.012 |
| 2022-12 | 4.00 | 14.18 | 0.021 |
| 2023-01 | 14.00 | 14.18 | 0.011 |
| 2023-02 | 11.00 | 14.18 | 0.010 |
| 2023-03 | 8.00 | 14.18 | 0.008 |
| 2023-04 | 17.00 | 14.18 | 0.007 |
| 2023-05 | 11.00 | 14.18 | 0.007 |
| 2023-06 | 17.00 | 14.18 | 0.007 |
| 2023-07 | 15.00 | 14.18 | 0.007 |
| 2023-08 | 30.00 | 14.18 | 0.006 |
| 2023-09 | 22.00 | 14.18 | 0.009 |
| 2023-10 | 8.00 | 14.18 | 0.012 |
| 2023-11 | 4.00 | 14.18 | 0.009 |
| 2023-12 | 19.00 | 14.18 | 0.006 |
| 2024-01 | 15.00 | 14.18 | 0.007 |
| 2024-02 | 12.00 | 14.18 | 0.007 |
| 2024-03 | 16.00 | 14.18 | 0.007 |
| 2024-04 | 19.00 | 14.18 | 0.007 |
| 2024-05 | 10.00 | 14.18 | 0.008 |
| 2024-06 | 30.00 | 14.18 | 0.007 |
| 2024-07 | 17.00 | 14.18 | 0.013 |
| 2024-08 | 8.00 | 14.18 | 0.016 |
| 2024-09 | 5.00 | 14.18 | 0.011 |
| 2024-10 | 17.00 | 14.18 | 0.008 |
| 2024-11 | 13.00 | 14.18 | 0.009 |
| 2024-12 | 17.00 | 14.18 | 0.009 |
| 2025-01 | 2.00 | 14.18 | 0.011 |
| 2025-02 | 28.00 | 14.18 | 0.007 |
| 2025-03 | 4.00 | 14.18 | 0.014 |
| 2025-04 | 5.00 | 14.18 | 0.008 |
| 2025-05 | 6.00 | 14.18 | 0.007 |
| 2025-06 | 21.00 | 14.18 | 0.008 |
| 2025-07 | 13.00 | 14.18 | 0.007 |
| 2025-08 | 8.00 | 14.18 | 0.007 |
| 2025-09 | 33.00 | 14.18 | 0.007 |
| 2025-10 | 10.00 | 14.18 | 0.018 |
| 2025-11 | 13.00 | 14.18 | 0.017 |
| 2025-12 | 9.00 | 14.18 | 0.022 |
| 2026-01 | 6.00 | 14.18 | 0.000 |
| 2026-02 | 9.00 | 14.18 | 0.000 |
One break, at 2022-01. Volume falls from 32.1 head per sale-day to 14.2 — a −55.8% level drop — and in four subsequent years it does not recover.
Steer prices broke out at 2022-12.
That is eleven months between the breeding herd leaving this barn and the calf price taking off, in the right order, with the right sign, at exactly the lag the biology implies: a cow bred today produces a calf in about nine months and a feeder animal several months after that. Fewer cows sold into herds in early 2022 means fewer calves reaching the ring from late 2022 onward, and a market short of calves pays more for them.
It is the national cattle cycle — the herd contraction that has been the whole story of the American beef market this decade — visible in one county’s weekly PDF, with the supply signal legible almost a year before the price signal.
Why I do not get to call this a leading indicator
Three reasons, and I would rather state them than let the graph do the arguing.
The model cannot date the volume break. The boundary at 2022-01 is stable — it is there at every prior setting, with an identical −55.8% — but no single month carries more than P = 0.215. The evidence is spread: 0.825 of the posterior mass falls somewhere in the eight months from September 2021 to April 2022. So the model is fairly sure something broke in that window and genuinely unsure which month it was. “Eleven months of lead” is really “somewhere between about eight and fifteen months of lead”, and I should write it that way.
Two dates are not a relationship. I have one break in one volume series and one break in one price series, and I have arranged them in an order that flatters a mechanism I already believed. That is not a fitted lead–lag. It is an anecdote with error bars on it. To claim the link I would need to model the two series jointly, and to test it I would need other barns — the same lead ought to show up in Tennessee and Missouri, and if it doesn’t, I have found a fact about Clay County rather than about cattle.
One barn is one barn. 15,583 rows sounds like a lot and is roughly 300 Tuesday afternoons in a single Alabama county. Clay County’s replacement volume falling by half is consistent with a national herd contraction and equally consistent with a nearby barn opening, one large seller retiring, or the sale barn changing which day it runs its cow sale.
The thing that never moved
Here is the series I expected to be boring, which turned out to be the best argument in the post.
regimes
| regime | months | mean head/sale-day | level | vs prior |
|---|---|---|---|---|
| 2019-05 — 2026-02 | 82 | 164.16 | 164.2 | — |
data table
| month | observed | fit | P(boundary) |
|---|---|---|---|
| 2019-05 | 112.00 | 164.16 | 0.000 |
| 2019-06 | 102.00 | 164.16 | 0.000 |
| 2019-07 | 109.00 | 164.16 | 0.000 |
| 2019-08 | 121.00 | 164.16 | 0.050 |
| 2019-09 | 154.00 | 164.16 | 0.085 |
| 2019-10 | 148.00 | 164.16 | 0.042 |
| 2019-11 | 201.00 | 164.16 | 0.035 |
| 2019-12 | 115.00 | 164.16 | 0.009 |
| 2020-01 | 112.00 | 164.16 | 0.019 |
| 2020-02 | 134.00 | 164.16 | 0.065 |
| 2020-03 | 211.00 | 164.16 | 0.139 |
| 2020-04 | 126.00 | 164.16 | 0.024 |
| 2020-05 | 157.00 | 164.16 | 0.079 |
| 2020-06 | 220.00 | 164.16 | 0.123 |
| 2020-07 | 238.00 | 164.16 | 0.025 |
| 2020-08 | 266.00 | 164.16 | 0.006 |
| 2020-09 | 246.00 | 164.16 | 0.008 |
| 2020-10 | 210.00 | 164.16 | 0.019 |
| 2020-11 | 200.00 | 164.16 | 0.025 |
| 2020-12 | 189.00 | 164.16 | 0.027 |
| 2021-01 | 198.00 | 164.16 | 0.025 |
| 2021-02 | 97.00 | 164.16 | 0.029 |
| 2021-03 | 172.00 | 164.16 | 0.006 |
| 2021-04 | 156.00 | 164.16 | 0.006 |
| 2021-05 | 181.00 | 164.16 | 0.005 |
| 2021-06 | 157.00 | 164.16 | 0.005 |
| 2021-07 | 209.00 | 164.16 | 0.005 |
| 2021-08 | 246.00 | 164.16 | 0.005 |
| 2021-09 | 218.00 | 164.16 | 0.010 |
| 2021-10 | 194.00 | 164.16 | 0.018 |
| 2021-11 | 196.00 | 164.16 | 0.024 |
| 2021-12 | 196.00 | 164.16 | 0.035 |
| 2022-01 | 171.00 | 164.16 | 0.051 |
| 2022-02 | 156.00 | 164.16 | 0.048 |
| 2022-03 | 105.00 | 164.16 | 0.034 |
| 2022-04 | 137.00 | 164.16 | 0.011 |
| 2022-05 | 141.00 | 164.16 | 0.008 |
| 2022-06 | 162.00 | 164.16 | 0.006 |
| 2022-07 | 172.00 | 164.16 | 0.006 |
| 2022-08 | 185.00 | 164.16 | 0.005 |
| 2022-09 | 190.00 | 164.16 | 0.006 |
| 2022-10 | 80.00 | 164.16 | 0.007 |
| 2022-11 | 197.00 | 164.16 | 0.004 |
| 2022-12 | 138.00 | 164.16 | 0.004 |
| 2023-01 | 191.00 | 164.16 | 0.004 |
| 2023-02 | 158.00 | 164.16 | 0.004 |
| 2023-03 | 119.00 | 164.16 | 0.004 |
| 2023-04 | 146.00 | 164.16 | 0.003 |
| 2023-05 | 121.00 | 164.16 | 0.003 |
| 2023-06 | 164.00 | 164.16 | 0.004 |
| 2023-07 | 184.00 | 164.16 | 0.004 |
| 2023-08 | 214.00 | 164.16 | 0.004 |
| 2023-09 | 234.00 | 164.16 | 0.003 |
| 2023-10 | 133.00 | 164.16 | 0.005 |
| 2023-11 | 171.00 | 164.16 | 0.004 |
| 2023-12 | 202.00 | 164.16 | 0.004 |
| 2024-01 | 212.00 | 164.16 | 0.005 |
| 2024-02 | 216.00 | 164.16 | 0.009 |
| 2024-03 | 107.00 | 164.16 | 0.020 |
| 2024-04 | 143.00 | 164.16 | 0.009 |
| 2024-05 | 128.00 | 164.16 | 0.007 |
| 2024-06 | 168.00 | 164.16 | 0.005 |
| 2024-07 | 177.00 | 164.16 | 0.006 |
| 2024-08 | 162.00 | 164.16 | 0.007 |
| 2024-09 | 138.00 | 164.16 | 0.007 |
| 2024-10 | 170.00 | 164.16 | 0.006 |
| 2024-11 | 200.00 | 164.16 | 0.007 |
| 2024-12 | 229.00 | 164.16 | 0.011 |
| 2025-01 | 146.00 | 164.16 | 0.057 |
| 2025-02 | 138.00 | 164.16 | 0.057 |
| 2025-03 | 78.00 | 164.16 | 0.054 |
| 2025-04 | 108.00 | 164.16 | 0.009 |
| 2025-05 | 100.00 | 164.16 | 0.006 |
| 2025-06 | 114.00 | 164.16 | 0.016 |
| 2025-07 | 145.00 | 164.16 | 0.027 |
| 2025-08 | 151.00 | 164.16 | 0.015 |
| 2025-09 | 201.00 | 164.16 | 0.009 |
| 2025-10 | 117.00 | 164.16 | 0.004 |
| 2025-11 | 183.00 | 164.16 | 0.006 |
| 2025-12 | 192.00 | 164.16 | 0.005 |
| 2026-01 | 150.00 | 164.16 | 0.000 |
| 2026-02 | 126.00 | 164.16 | 0.000 |
One regime. Eighty-two months. No boundary anywhere.
Total throughput at Clay County has been flat — 164.2 head per sale-day, drifting at −0.19 a month, which over seven years is nothing — across the entire period in which the price of a steer tripled.
Underneath that flat total, the composition churned completely:
| series | break | level change |
|---|---|---|
| feeder | 2020-05 | +44.4% |
| replacement | 2022-01 | −55.8% |
| slaughter | 2025-01 | −51.0% |
| all cattle | — | none |
Three components with breaks in three different years and two different directions, summing to a total with no break at all. Had I only looked at headline volume — the number the barn itself would quote you — I would have concluded that nothing whatsoever happened here since 2019, during the largest cattle price move in living memory.
Aggregates are where signals go to cancel.
The corrections that made any of this legible
Four, and all of them changed the answer rather than tidying it.
Volume is head per sale-day, never head per month. Clay County does not hold a fixed number of sales a month — the median is four, the range is one to six. March 2026 had a single sale day, and on raw monthly counts the model dutifully reported a −76% market collapse that was nothing but a short month. Divide by sale-days, drop trailing partial months, and every spurious tail changepoint disappears at once.
Regimes have slopes. A model where each regime gets only a level treats a sustained climb as a staircase: it cut the steer series into ten regimes, several of them three months long. Letting each regime carry its own drift won on marginal likelihood for all five price series — up to Δ log-evidence +13.3 — and roughly halved the regime count. “Prices rose steadily for 43 months” is one regime, not eight.
A regime has to last three months. Overdispersion alone was not enough. A single freak month still claimed its own regime at P = 0.985 until a minimum length was imposed; the floor dropped it to 0.176 and removed every one-month artefact across all nine series simultaneously. A regime that lasts one month is an event, not a regime.
One tempting number is worthless and had to be thrown out. Online changepoint
detection offers P(run length = 0) as a natural alarm: has the regime just
ended? Under a constant hazard the recursion sets the numerator to H·Σ(R·π)
against a normaliser of Σ(R·π), so the whole thing collapses algebraically to
exactly H — the prior hazard — for any model and any data. It was observed
returning 0.081 against a fitted hazard of 0.0810. It looks like a result, it
updates every week, and it contains precisely zero information about the data.
The one-cell disaster
Which brings me to the month I could not explain, and now can.
August 2019 showed 496 head per sale-day against a series mean of 169, and in the slaughter category alone 384 head per sale-day against a neighbouring regime mean of 9.6 — about forty times. It was the only month in seven years that the model ever wanted to make into a regime of its own, and the sole reason the tightest prior setting put any boundary at all in the total-volume series.
I went back to the source PDF for 21 August 2019. In the COWS - Boner 80-85%
block:
Head Wt Range Avg Wt Price Range Avg Price Dressing
2 1250-1400 1325 55.00-57.00 56.06 Average
1 1175 1175 1.00 1.00 Average Muddy
1125 1125 1125 45.00 45.00 Low
One lot of 1,125 head of boner cows, at an average weight of 1,125 lb.
The head count and the average weight are the same number, which is the tell. And the header of that very same report declares the day’s receipts:
Total Receipts: 127
Slaughter Cattle: 10(7.9%)
Ten head of slaughter cattle. On a line claiming 1,125 of them.
My first assumption was that my own parser had smeared two columns together. It
had not. Pulling the word positions off the page: on a normal single-head row the
head-count token 1 occupies x 34.9–40.0, and on this row the token 1125 spans
x 27.3–47.5 — a four-digit number typeset into the head-count column, with the
weight column holding its own separate 1125 at x 91.7. There is no 1 anywhere
on the line. The error is in USDA’s published report, not in my extraction of
it, and the document contradicts itself four inches further up the same page.
The damage is one cell. Dropping that single lot:
| as published | row rejected | |
|---|---|---|
| all cattle, 2019-08 | 496.0/sale-day | 121.0 |
| slaughter, 2019-08 | 384.0/sale-day | 9.0 |
At 9.0 the month sits essentially on the level either side of it. Which means the slaughter series’ entire first regime — May to August 2019, a level of 106 head per sale-day and a spectacular +112.3/month drift — existed because of one mistyped cell in one PDF from 2019. It was never a liquidation event. It was never anything. With the row gone that series drops from four regimes to three, and the stretch becomes an unremarkable 2019-05 → 2020-04 sitting at 10.6.
I did not hard-code a fix to that row, because a patch to one cell is a lie of a different kind — the next such cell will not announce itself. What went in instead is a validation rule: no lot’s head count may exceed the receipts its own report declares for that day. Across all 300 reports it rejects exactly one row out of 15,584, with no false positives, and what it rejects is quarantined to a file rather than silently dropped. The looser version of the same idea — checking the day’s summed head count against receipts — additionally flags six days at 1.01–1.06×, all of them legitimate, so the per-lot form is the one worth having. It would have caught this in 2019 and will catch the next one without my help.
What I actually learned
The model dated the price breaks, and it dated them robustly, and that was the part I had expected to be hard. It was not. What was hard was everything around it: knowing that volume had to be divided by sale-days, that regimes needed slopes, that a tempting alarm statistic was algebraically empty, and that one cell in one 2019 PDF was quietly manufacturing a market event.
The interesting finding was in the series I nearly did not plot. Replacement volume is small, noisy, and the one series where the model cannot tell me the month. It also broke first, by the better part of a year, in the direction the biology predicts. That is either the cattle cycle showing up in a small Alabama barn about eleven months early, or a coincidence between two dates I lined up myself.
I do not yet get to say which. What I can say is that the record was sitting there, in weekly PDFs, the whole time — and that the barn changed its name from Ashland to Lineville somewhere in the middle without anybody’s series noticing.
The dashboard is a marimo notebook exported to WASM, so it runs entirely in the browser and every fit is precomputed: Pyodide has no jax, numpyro, torch or pymc, which is a constraint worth designing around rather than fighting. 54 fits, zero divergences, worst r-hat 1.0054, 108 KB of posterior shipped as JSON.