Balsam Research
2 min read

Unemployment Rate: Hard to Believe?

Economics

Jeffrey Gundlach was recently quoted as saying he the found recent unemployment data hard to believe, suggesting that the national unemployment rate didn’t reflect underlying moves in state trends. Certainly Gundlach’s home state of California has experienced a material uptick in unemployment, with the rate up 1.3% over the past 18 months, so I can see why he might think something is off.

California unemployment rate showing 1.3% increase over 18 months

Let’s create a population weighted unemployment indicator using state unemployment data to see if there are any discrepancies that might support Gundlach’s theory. I pulled 2023 population estimates from Stats America and state unemployment data from the St. Louis Fed’s excellent FRED site. State unemployment data goes back to 1976. In the chart below you can see our custom population-weighted state unemployment composite in red tracks the national unemployment rate quite closely despite using a static population estimate. The blue columns in the second chart pane show the difference between the two series.

Population-weighted state unemployment composite vs national rate since 1976

Zooming in on more recent data, we can see the state composite has indeed moved above the official national unemployment rate, but the difference is minor and well within historical norms.

Close-up of state composite vs national rate showing minor divergence

Even revisions to the national unemployment rate itself have been remarkably tame. Using the St. Louis Fed’s ALFRED site, which allows for point-in-time economic data retrieval, we can plot the difference between the initial unemployment release and subsequent revisions. Again, nothing much to see here. Granted the Bureau of Labor Statistics is the source for both the national and state level data, but I’d say the unemployment data looks pretty reasonable overall.

Chart showing minimal revisions between initial and revised unemployment releases

Code
internal class StateUnemployment
{
private static FREDServer _fred = new FREDServer("YOUR_API_KEY_HERE");
public static void Run()
{
var states = new[]
{
new { State="AR", Pop=0.00915973593828964 },
new { State="AK", Pop=0.0021898279561439 },
new { State="AL", Pop=0.0152530331623501 },
new { State="AZ", Pop=0.0221887533547888 },
new { State="CA", Pop=0.116343565430257 },
new { State="CO", Pop=0.0175495628523778 },
new { State="CT", Pop=0.0108002840542521 },
new { State="DC", Pop=0.00202729711379364 },
new { State="DE", Pop=0.0030810513817249 },
new { State="FL", Pop=0.0675118555118309 },
new { State="GA", Pop=0.0329314317298429 },
new { State="HI", Pop=0.00428508263270883 },
new { State="IA", Pop=0.00957557889445317 },
new { State="ID", Pop=0.00586634404540294 },
new { State="IL", Pop=0.0374712775912818 },
new { State="IN", Pop=0.0204893813396983 },
new { State="KS", Pop=0.00877997976172424 },
new { State="KY", Pop=0.0135143407103467 },
new { State="LA", Pop=0.0136564514397008 },
new { State="MA", Pop=0.0209050093158741 },
new { State="MD", Pop=0.0184532043580803 },
new { State="ME", Pop=0.00416739303278823 },
new { State="MI", Pop=0.029969586751285 },
new { State="MN", Pop=0.0171324568887866 },
new { State="MT", Pop=0.00338238763611872 },
new { State="MO", Pop=0.0185006880628585 },
new { State="MS", Pop=0.00877742388853741 },
new { State="NC", Pop=0.0323529683563342 },
new { State="ND", Pop=0.00234067224749738 },
new { State="NE", Pop=0.00590710962556622 },
new { State="NH", Pop=0.00418629932837117 },
new { State="NJ", Pop=0.0277409011623684 },
new { State="NM", Pop=0.0063131590489578 },
new { State="NV", Pop=0.00953727662664869 },
new { State="NY", Pop=0.0584363857570443 },
new { State="OH", Pop=0.035190835570332 },
new { State="OK", Pop=0.0121040421328529 },
new { State="OR", Pop=0.0126401007037922 },
new { State="PA", Pop=0.0387014229391022 },
new { State="RI", Pop=0.00327235968409228 },
new { State="SC", Pop=0.0160445387178137 },
new { State="SD", Pop=0.00274493017099165 },
new { State="TN", Pop=0.0212785071861316 },
new { State="TX", Pop=0.0910777676818465 },
new { State="UT", Pop=0.01020478351672 },
new { State="VA", Pop=0.0260236201199711 },
new { State="VT", Pop=0.00193321948251958 },
new { State="WA", Pop=0.0233279561961554 },
new { State="WI", Pop=0.0176491254591708 },
new { State="WV", Pop=0.00528513669121823 },
new { State="WY", Pop=0.00174389675920505 }
};
foreach (var state in states)
{
var data = _fred.LoadSymbol(state.State + "UR");
data.Save($@"c:\data\temp\{data.Symbol}.csv");
Task.Delay(1000).Wait();
}
AsciiBarServer server = new AsciiBarServer(@"c:\data\temp", AsciiBarServer.DC);
var stateData = server.LoadAll();
var composite = Indicators.Sum(SyncOption.CarryoverPreviousValue, states.Select(x => x.Pop).ToArray(), states.Select(x => stateData[x.State + "UR"].Close).ToArray());
composite.Name = "State composite";
var unRate = _fred.LoadSymbol("UNRATE", new DateTime(1976, 1, 1)).Close;
unRate.Name = "Unemployment rate";
var cht = new Chart2();
cht.Plot(new PlotInstruction { Series = unRate },
new PlotInstruction { Series = composite, Color = Color.Red },
new PlotInstruction { Series = composite - unRate, Pane = 1, PaneSize = 50f, Color = Color.Blue, ChartType = "Column" });
new ChartForm(cht).ShowDialog();
}
public static void Revisions()
{
var data = _fred.GetPointInTimeHistory("UNRATE");
data.Save(@"c:\data\temp\unrate_pit.txt");
var pit = PointInTime.Build(data);
var initial = pit.Initial.ToTimeSeries().Subset(new DateTime(1976, 1, 1));
initial.Name = "Unemployment Initial Release";
var revised = pit.Revised.ToTimeSeries().Subset(initial.FirstDate);
revised.Name = "Unemployment Revised";
new ISeries[] { initial, revised }.Chart();
}
}