Sign in

CJ Turtoro

@cjtdevil.bsky.social
2K followers 161 following 318 posts

Devils and Data

PostsRepliesMedia
CJ Turtoro @cjtdevil.bsky.social · 13h
xGs As of right now, most public models do not include blocked shots in xG models. Which is a defensible decision in some but not all situations. And you lose some important info, like how many xGs a Dman prevented by blocking those shots.
110
CJ Turtoro @cjtdevil.bsky.social · 14h
I started writing for SB Nation 14 years ago. Which I think makes me 189 years old.
010
CJ Turtoro @cjtdevil.bsky.social · 14h
But I'm not convinced yet. It's decent but I keep tweaking it and the weirdness just keeps moving to different things. Plus I certainly haven't addressed the sampling bias in only using goal replay XYs.
000
CJ Turtoro @cjtdevil.bsky.social · 14h
FWIW, I used ~600 NHL EDGE tracking pairs and built a two-component log-normal mixture in depth along the net-to-block ray (a stick-on-stick spike whose weight is logistic in distance, plus a lane term), with Gaussian lateral spread growing with depth. Value = calibrated E[xG] over the density.
100
CJ Turtoro @cjtdevil.bsky.social · 17h
Yeah I wanted to do something that didn't involve using private data to validate and then after seeing Matt's animations I realized that there's PROBABLY enough in there to at least get started. Sampling bias and all, but still pretty good. And the bias is bit removed from the thing we're measuring.
010
CJ Turtoro @cjtdevil.bsky.social · 18h
Ooh fun I either didn't know it forgot you had attempted this too! Yeah the positional adjustment was one of the most impactful pieces. I have a few models with various different ideas running rn so we'll see which one tests out best..
100
CJ Turtoro @cjtdevil.bsky.social · 19h
HT to @thebucketless.bsky.social for the groundwork on blocked shot location estimation, and @mattdonders.com for code on XY scraping.
000
CJ Turtoro @cjtdevil.bsky.social · 19h
I used EDGE tracking data from the NHL gamecenter animations to find the location of blocked shots preceding goals in order to train a model to determine what the likely location of a blocked shot would be. You can see the model's results here: claude.ai/artifact/6Jr...
claude.ai
Claude Artifact
Try out Artifacts created by Claude users
331
CJ Turtoro @cjtdevil.bsky.social · 28/09/2026
Edvinsson is a pretty rare case of a shot blocking enforcer that is actually a very good player due to his complete D game which extends to protecting the blueline and playing competent offense. I'm sure a ton of teams would love a 23yo like this.
031
CJ Turtoro @cjtdevil.bsky.social · 26/09/2026
It's all just NHL pbp, Corey's A3Z, and my models. Working on getting access to some other stuff but I'm not optimistic lol
001
CJ Turtoro @cjtdevil.bsky.social · 26/09/2026
Coming this season....
2111
CJ Turtoro @cjtdevil.bsky.social · 08/01/2026
I agree. But if we're just talking goalie, a couple of those shots weren't actually tough. Like the Barzal CHANCE was great, but the GOAL was on the totally wrong side of the net and Markstrom was so out of position it didn't matter.
000
CJ Turtoro @cjtdevil.bsky.social · 07/01/2026
Did it LOOK like it? IMO, yes. Did it FEEL like it? Definitely no. And I suspect most people would disagree with my answer to the first because of my answer to the second.
110
CJ Turtoro @cjtdevil.bsky.social · 07/01/2026
Good lord. I say that in response to the results of this game. Not your non-zero-indexed, asymmetrically saturated color formatting.
150
CJ Turtoro @cjtdevil.bsky.social · 07/01/2026
Moneypuck had it as the largest by a pretty comfortable margin lol (they could only check games w/o a goalie change tho)
231
CJ Turtoro @cjtdevil.bsky.social · 07/01/2026
We wanted to hurt him
010
CJ Turtoro @cjtdevil.bsky.social · 07/01/2026
I think it's a little that he's Luke HUGHES and the understanding was that $9M may have been a bit of an overpay but it was a wink wink that we'd end up with Quinn so, fine. Now it's a MASSIVE overpay, and Quinn is in Minnesota.
110
CJ Turtoro @cjtdevil.bsky.social · 07/01/2026
@evolvingwild.evolving-hockey.com can you run a query for me real quick? What is the largest gap in GSAx between teams in one game on record. Where does tonight's NJD-NYI match land?
040
CJ Turtoro @cjtdevil.bsky.social · 06/01/2026
This graph of yours went a bit viral over on the other place because it's objectively hilarious. x.com/CJTDevil/sta...
1252
CJ Turtoro @cjtdevil.bsky.social · 05/01/2026
Like this movement of shots to right up on the doorstep seems VERY likely to inflate xGs somewhat dramatically. And yes intuitive to me. Human trackers generally had a bias towards the middle of the OZ it seems. bsky.app/profile/cjtd...
100
CJ Turtoro @cjtdevil.bsky.social · 05/01/2026
I think weighting shot types in general to historic averages is a worthy enterprise for estimating impact of automating shot type classification (some may push xGs lower, after all). But we're talking a 10%+ overprediction on the twins' xG model this season. That's why I think warping is bigger.
100
CJ Turtoro @cjtdevil.bsky.social · 05/01/2026
I think ALL shot types definitely need a look, but based on those shooting percentages I'm not sure I think this is as big of a deal as the coordinate warping is.
100
CJ Turtoro @cjtdevil.bsky.social · 04/01/2026
A reasonable philosophical assumption, but my entry point to this issue was more empirical. I first noticed it in 2023 relative to the previous year so I never really considered that something could've changed BEFORE that. I suppose that may have just been lucky. x.com/CJTDevil/sta...
000
CJ Turtoro @cjtdevil.bsky.social · 04/01/2026
How fundamentally differently does yours work? Ik the other models use like 3-4 different algorithms, but all use most of the same "training" data until now (except for Micah).
000
CJ Turtoro @cjtdevil.bsky.social · 04/01/2026
Oh oops, I thought it was from 2023-24 one. Oh well, apologies for mischaracterizing it in that thread. But regardless, yeah I think that that probably fixes MOST of the problem. This year seems to be not insubstantially worse than previous years too, and now your model has a few years headstart.
200
CJ Turtoro @cjtdevil.bsky.social · 04/01/2026
All good. I don't either, so it's been an education ~48 hours or so lol.
000
CJ Turtoro @cjtdevil.bsky.social · 04/01/2026
I agree. This is my full thoughts as it exists rn. I also give you your flowers as been the only site with which I'm familiar that correctly identified the warping and new shotdesignations as the principal issues with the overestimation. threadreaderapp.com/thread/20078...
threadreaderapp.com
Thread by @CJTDevil on Thread Reader App
@CJTDevil: Okay so I've talked to several of the modelers about this and I want to just give a sort of public report for posterity on the state of the public xG models and the NHL shot...
100
CJ Turtoro @cjtdevil.bsky.social · 04/01/2026
If someone more present on this site than me wants to recreate the thread. You have my permission lol. Just tag me in it.
000
CJ Turtoro @cjtdevil.bsky.social · 04/01/2026
Are you talking about the new shot designations now? That's kinda a different issue from the xG warping.
100
CJ Turtoro @cjtdevil.bsky.social · 04/01/2026
Apologies for everyone who is not on the other site, but I'm not rewriting the whole thread. Here are my thoughts on the state of the public NHL xG models. threadreaderapp.com/thread/20078...
threadreaderapp.com
Thread by @CJTDevil on Thread Reader App
@CJTDevil: Okay so I've talked to several of the modelers about this and I want to just give a sort of public report for posterity on the state of the public xG models and the NHL shot...
175
CJ Turtoro @cjtdevil.bsky.social · 04/01/2026
Certain shot locations were systematically over-recorded by humans and now that chips are doing it, there's been a drift. The drift has made some locations more/less dangerous than they seemed before. I'm describing this as "warping of xG fabric".
100
CJ Turtoro @cjtdevil.bsky.social · 04/01/2026
This is perhaps more illustrative. The low-slot shots were likely being incorrectly recorded by human trackers and the chips have correctly placed them as right in the crease. Small movement, hugh xG impact.
220
CJ Turtoro @cjtdevil.bsky.social · 04/01/2026
I just chose an arbitrary pre-tracking season as a control though, and it looks the way you'd expect. Interestingly their model always seems to underestimate the slot a bit, but it's definitely worse now.
100
CJ Turtoro @cjtdevil.bsky.social · 04/01/2026
Yes
100
CJ Turtoro @cjtdevil.bsky.social · 04/01/2026
I'm less convinced that those are of particular importance. It doesn't seem to offer any marginal improvement on the topic.
010
CJ Turtoro @cjtdevil.bsky.social · 04/01/2026
Decided to look more at this and these graphs are using @evolving-hockey.com's xG (because they have an excellent query tool that makes it easy). So, while new shot designations are relevant, I think this graph screams that the true culprit was the warped xG fabric of the chip tracking.
483
CJ Turtoro @cjtdevil.bsky.social · 02/01/2026
Props to @hockeyanalysis.com for spotting that issue basically immediately and not letting his model drift into nonsensicality
020
CJ Turtoro @cjtdevil.bsky.social · 02/01/2026
Yeah so this says to me that, at minimum, we should think of these shot attempts fundamentally differently than other shot attempts. It's not unprecedented -- we already don't count blocks in xGs -- so we may as well bin these as something else. This is why private companies have several models.
220
CJ Turtoro @cjtdevil.bsky.social · 02/01/2026
Bah lol yup bsky.app/profile/cjtd... How many xGs was that bad boy
100
CJ Turtoro @cjtdevil.bsky.social · 02/01/2026
Shots that don't make it to the net?
000
CJ Turtoro @cjtdevil.bsky.social · 02/01/2026
So on EH's model were under counting by 200/year from 2018-2022 and are overcounting by ~400/year since then with this year already being at 500. So those new shots are big (bigger than I thought tbh) but definitely still a lot of impact from warping.
000
CJ Turtoro @cjtdevil.bsky.social · 02/01/2026
Talked with someone in the league office btw and they said this was "largely correct" in determining the changes. So that's nice to know lol
140
CJ Turtoro @cjtdevil.bsky.social · 02/01/2026
There*
100
CJ Turtoro @cjtdevil.bsky.social · 02/01/2026
How many total xGs league-wide are their from these new shot definitions?
200
CJ Turtoro @cjtdevil.bsky.social · 02/01/2026
I would say that's very likely to be relevant, though I'm not sure that gets us there. How many more of these types of shots are recorded than before, and how high are their xGs? Cuz almost all of the xG overestimation is from high-xG attempts.
000
CJ Turtoro @cjtdevil.bsky.social · 02/01/2026
I was gonna say, I don't think the low-xG noise explains the problem because most of the inflation is 0.2+ bsky.app/profile/dbom...
120
CJ Turtoro @cjtdevil.bsky.social · 02/01/2026
Yeah I think it's that your philosophical approach drops old data more readily than the other models and, since the tracking changes began 3 years ago, yours has caught up better than most of the rest of the public sites which are still trained on basically all the data we have.
110
Reposted by CJ Turtoro
Aaron K @ladyotreesyrup.bsky.social · 02/01/2026
Most pbp derived rush timing is several seconds longer than actual rush timing, more evidence some kind of continuous variable stretching 10 seconds or so might be a better proxy for rush chances. Not sure how to deal with the relatively large number of rush chances that are 21+ seconds by pbp
heat map of 5-on-5 goals scored by since zone entry derived from the play by play versus seconds since zone entry derived from edge animationsbar chart of number of edge rush goals by play-by-play derived seconds since entry
001
CJ Turtoro @cjtdevil.bsky.social · 02/01/2026
Top 3*
100
CJ Turtoro @cjtdevil.bsky.social · 02/01/2026
Yup. I'm sure I'm not the only one. And it's not like these guys didn't notice. But I think many underestimated the potential impact for down the line since xG models seemed to be mostly holding up that year.
010