RotoValue now showing player news from

RotoValue is now partnering with for player news. Starting this month, we will now be showing RotoBaller player news for both NBA and MLB. This will give better fantasy focused news items for players throughout the site.

The main place to see player news on RotoValue is the News pages, which can show news on all players in a league’s player pool, free agents only, or only those players on a given fantasy team.

The LeagueHome page will also display recent news headlines. If you’re logged in and a member of a league, it shows only headlines for your fantasy team in that league. Otherwise it shows headlines for the entire player pool.

The Lineup page will show a *News* link if there is news on the player within the past 24 hours. You can either click on that link to read the whole story, or simply hover your mouse over it to see  just the headline, like this:

Lineup Screen ExampleFinally, if you’re receiving a DailyBoxscore e-mail about your fantasy team(s), you’ll get news on any of your players in the past day each morning.

RotoValue is proud to collaborate with to deliver excellent player news directly to fantasy owners!

Posted in Major League Baseball, NBA Basketball, RotoValue | Comments Off on RotoValue now showing player news from

MLB Crystal Ball 2021

Today is opening day, the start of the new season. How will it end up?

Using RotoValue player projections for each team, I’ve estimated win totals based on projected runs scored and runs allowed. Here are the standings:

AL East Won Lost Pct RS RA
Yankees 87.1 74.9 0.538 665 617
Blue Jays 82.1 79.9 0.507 655 646
Rays 81.3 80.7 0.502 551 549
Red Sox 79.0 83.0 0.488 641 657
Orioles 72.9 89.1 0.450 556 619
AL Central Won Lost Pct RS RA
Indians 88.3 73.7 0.545 658 601
White Sox 87.1 74.9 0.538 645 598
Twins 84.4 77.6 0.521 621 594
Royals 73.5 88.5 0.454 675 734
Tigers 68.4 93.6 0.422 586 686
AL West Won Lost Pct RS RA
Astros 91.6 70.4 0.565 663 580
Athletics 82.0 80.0 0.506 613 605
Angels 80.2 81.8 0.495 679 685
Mariners 79.8 82.2 0.493 600 610
Rangers 76.9 85.1 0.475 614 646
NL East Won Lost Pct RS RA
Braves 88.6 73.4 0.547 739 680
Mets 87.0 75.0 0.537 623 576
Phillies 81.5 80.5 0.503 618 614
Nationals 80.3 81.7 0.496 656 662
Marlins 75.6 86.4 0.467 638 680
NL Central Won Lost Pct RS RA
Cardinals 85.9 76.1 0.530 644 606
Brewers 82.7 79.3 0.510 664 651
Reds 76.5 85.5 0.472 605 640
Cubs 76.1 85.9 0.470 668 706
Pirates 71.3 90.7 0.440 605 681
NL West Won Lost Pct RS RA
Dodgers 96.7 65.3 0.597 758 635
Padres 84.6 77.4 0.522 561 533
Rockies 78.1 83.9 0.482 660 683
Diamondbacks 76.0 86.0 0.469 628 667
Giants 74.6 87.4 0.460 555 605

Not surprisingly the defending World Champion Dodgers are projected with the highest win total in MLB at 96.7. Continue reading

Posted in Major League Baseball, Projections, Sabermetrics | Comments Off on MLB Crystal Ball 2021

2021 NBA Projections on RotoValue

I’ve released RotoValue 2021 NBA individual projections. RotoValue projections take into account a player’s NBA statistics, age, position, and their depth chart position (if any) to predict statistics totals. The model regresses all players to a per-position league average, so centers will tend to have more blocks, and point guards more assists, than other players. For players with no NBA stats, the league averages greatly impact their per-minute projection data, but playing time ranges are set by where they are on the team’s depth chart. So a rookie projected to start may get about 25 minutes per game of roughly league average performance (I also will use what preseason data exists, although this year’s is especially short, with just 2-4 games per team).

In addition, I have another variant, Adjusted projections (called AdjRotoValue) that uses the same per-minute projections as RotoValue, but adjusts playing time to ensure a team’s total aggregate minutes are neither too high nor too low. The adjustment will either add playing time to players (tending to give better ones more time, until their per-game minutes reach a cap based on their depth chart position), or remove playing time from players (starting with poorer performing ones) until the team’s total minutes are reasonable.

This year I dealt with an additional complication: the NBA schedule has not been fully released, which impacts displaying projections. By default, Search pages showing projections prorate the projections to the team’s remaining schedule, which normally is the full season. But this year, the NBA has only released the schedule until the All-Star break, and, making matters worse, the schedule is not evenly balanced: most teams have 37 games on the schedule, but the Cavaliers, Celtics, Clippers, Hornets, Kings, and Pacers are scheduled for 38. To address this, I’ve now added a “Raw Projection” choice to the Show dropdown. When that is chosen, the page will not adjust projections based on schedule games.

Image showing Raw Projection dropdown

So instead of showing data prorated to the 37/38 game schedule, clicking that option will show the projections assuming this year’s full 72 game schedule. Unfortunately the same code which does prorating for schedule also handles prorating players with known injuries, so this will tend to overrate players who will miss the first few weeks of the season. But that’s still overall probably the better choice, as injured players who come back (and remain healthy) are probably better approximated by their raw full season projection than by having them miss many games in basically just half a season.

I will rerun the model once more after today’s preseason games (the last on the schedule) are over. While that shouldn’t change things much, it would have the largest impact on rookies who have no other NBA statistics.

Posted in NBA Basketball, Projections, RotoValue | Comments Off on 2021 NBA Projections on RotoValue

Customizing Projections on RotoValue with RotoValue Analyst

Projections are central to fantasy sports, and RotoValue integrates projections into the site. Pages like Search or Projected Standings have a Source selection, where you can choose which set of statistics to display: the current or past seasons, preseason data where available, and of course projections.

But with RotoValue Analyst, you not only can see projections like Steamer, Marcel, or RotoValue’s own, but you can upload and edit your own projections, too. How do you do this? RotoValue Analyst customers can see links to custom projections under the Settings menu. From a PlayerDetail page, there is a link to edit projections for that particular player:
MyProjection link

Click on this page to go to a page that lets you set custom projections for the player:
Custom projection page for Vladimir Guerrero Jr.

If you haven’t set any projections at all, this defaults to use RotoValue’s projections for the player, but here you can save whatever values you like for the player’s statistics. You can also multiply all projected values by a constant, so if you expect a player to play 50% more than the current projections, you’d enter 1.5 in the “Multiply all values by” field.

Once you save, the player’s projections will now appear on their PlayerDetail page as My Projection:Projections part of Vladimir Guerrero Jr.'s PlayerDetail page

The “My Projection” text links back to the page to update projections for the player, so you can easily change them.

You can also update projections in bulk. When you’re not on a PlayerDetail page, Settings has a link to MyProjections, which lets you update defaults for your projections.

Picture of page showing My Projections link

Click on that link, and you come to the MyProjections page. This page lets you download your current projections to a spreadsheet, upload a spreadsheet to change projections at once, remove all projections, or change the default projection source to use for players whom you don’t project:

General My Projection page

Here you can click “Download” to download a .csv file of your projections, upload a new file of projections, remove all custom projections, or change the default source for projections. The default source is used for players for whom you have not set a projection.

While on the PlayerDetail page, your projections will always appear exactly as entered, on other pages they may be prorated up or down based on injury data. When a player appears on an injury report and has a target return date, then his projections will be scaled down to reflect the games missed prior to that target return date, so you shouldn’t have to manually change projections to reflect known injuries. Injury-adjusted projections are used in player Search pages, Projected Standings, and also the Auction and Draft applications. You can even change your projections during your draft: either edit a particular player’s projections, or upload a new projections file, and then reload the Draft (or Auction) page to see your most recent projections reflected in the application.

RotoValue Analyst doesn’t just compute prices customized to your league’s settings from some set of statistics. It also lets you create your own projections, and/or modify projections from any of the sources the site displays.

Posted in Auction, Draft, Fantasy Strategy, Projections | Comments Off on Customizing Projections on RotoValue with RotoValue Analyst

Expanded Filtering in Search

RotoValue Search pages used to support filtering by a single pro team or fantasy team, but now that has been extended to support searches filtering on multiple values of these types.

Previously you’d need two different windows or browser tabs to see a search matching only players on two different teams, but now these can be combined in a single search.

Where before the RotoTeam and ProTeam filters were a single selection dropdown, now there are checkboxes to hide or show the selections. By default the team choices are hidden, but they will appear when you check the relevant box.

Team Filter Search ScreenThe team filters take effect whether they’re currently visible or not, so you can hide the team lines.

So if you want to look at players on your team and those of a potential trading partner in a single tab, you can filter on those two teams. Or, you can search for players who are either on your team or are free agents, which is helpful when considering whom to pick up from the waiver wire.

Like other filters, these are cumulative, so you can add filters on name, position, and/or pro team, and (where appropriate) minimum statistics values (e.g. AB, IP, FGA). If you have RotoValue Analyst, you can also add filters for arbitrary values in statistics, by checking the “Other Statistics” box. This shows a row where you can add statistics and limit values (either >= or <=), and the Search will only show players who match the additional limits.

So this page shows NBA players on one of four teams (Spurs, Suns, Thunder, and Timberwolves) who have 200 or more rebounds and 100 or more assists in the 2018-9 season:

Stats Filtering


These filters take effect whether the lines where you select them are visible or not, with the corresponding checkbox in the top line toggling which additional filter criteria to display.

Posted in RotoValue, Uncategorized | Comments Off on Expanded Filtering in Search

Reviewing the FiveThirtyEight 2018 Election Forecasts

Nate Silver’s published forecasts of the 2018 mid-term elections, predicting the outcome of races for House, Senate, and Governor. The site also made it easy to download their projection data, and so I’d like to look at their forecasts and see how their models did. Silver made three variants of his model, dubbed “Lite”, “Classic”, and “Deluxe”. Lite basically uses only polling (and, where polling is scarce or non-existent, comparisons to similar districts which have polling). Classic adds in other fundamental data, like candidate fund raising and historical voting patterns. Finally, Deluxe factors in expert ratings from the Cook Political Report, Inside Elections, and University of Virginia political scientist Larry Sabato’s Crystal Ball. Silver’s expectation is that while all three models should be good, adding additional complexity to the models should improve their accuracy.

The top line results are quite good, as all three models came very close to the number of seats won in each case:

Office   Party    Lite  Deluxe Classic Party    Lite  Deluxe Classic Party    Lite  Deluxe Classic
Governor R  20    18.3    18.8    19.0 D  16    17.7    17.2    17.0
House    R 203   202.1   203.6   200.6 D 232   232.8   231.4   234.3
Senate   R  11     9.7     9.5     9.5 D  22    23.3    23.5    23.5 I   2     2.0     2.0     2.0

This table allocates the 9 uncalled races to the current vote total leader, and so counts the Mississippi Senate special election which is headed for a run-off as a Republican seat. To compute the expected number of seats for a party, I added the chance the model gave that party’s candidate of winning the race.

The models gave probabilistic forecasts for each race, showing not only a chance of each candidate winning, but also expected vote share, as well as 10th and 90th percentile vote shares, to give a sense of the possible range of outcomes. So next I thought
I’d check how well the model did at setting these percentiles:

Model  Total    < 10%      < 50%     > 90%   
Lite    1233  100 8.1%  639 51.8%  102 8.3%
Classic 1233   77 6.2%  634 51.4%   74 6.0%
Deluxe  1233   84 6.8%  641 52.0%   81 6.6%

So for the 1233 candidates for whom they made projections, just over half of them in each model had a vote share under their projection, about what I’d expect. Interestingly, the results tended not to contain as many surprises as the model expected. Just over 8% of the Lite projections fell above or below the 80% confidence interval, and for Deluxe and Classic those totals fell below 7%. So the models were projecting more uncertainty than we actually saw this year.

Another way to look at this is to count how often the model’s favorite did not win, and compare that with the model’s expected number of upsets. Expected upsets is the sum of the odds of the non-favorite candidate winning each race. If the model were perfectly calibrated, and results normally distributed around expectations, we should see expected upsets match actual upsets.

Model     Upsets   Expected Total 
Lite     25  4.9% 40.5  8.0% 506 
Deluxe   17  3.4% 29.9  5.9% 506 
Classic  20  4.0% 34.6  6.8% 506 

All three models predicted more upsets than we actually saw, which is consistent with the model being not confident enough. As Silver expected, the frequency of both projected and actual upsets for each model decreases as the complexity increases. In simpler English, adding more to a model makes it better at prediction: Lite had the most upsets, Deluxe the fewest, and Classic was in the middle.

I also broke down the above table into the four categories the site was showing on election night: Toss Up (no candidate has a 60% or better chance to win), Lean (favorite is 60-75% likely), Likely (favorite is 75-95% to win), and Solid (favorite expected to win more than 95%):

                 Toss Up                      Lean  
Model     Upsets   Expected Total   Upsets   Expected Total 
Lite     16 53.3% 13.6 45.3%  30    5 13.2% 11.9 31.4%  38 
Deluxe    6 40.0%  6.8 45.0%  15    7 21.2% 11.1 33.6%  33 
Classic   9 36.0% 11.1 44.4%  25    7 23.3%  9.8 32.6%  30 
                  Likely                     Solid  
Model     Upsets   Expected Total   Upsets   Expected Total 
Lite      4  4.1% 12.7 12.9%  98    0  0.0%  2.3  0.7% 340 
Deluxe    4  5.0% 10.5 13.2%  80    0  0.0%  1.5  0.4% 378 
Classic   4  4.7% 12.0 14.1%  85    0  0.0%  1.7  0.5% 366 

None of the solid favorites lost in any of the models, although with well over 300 races, the probabilities given would have suggested 1-2 longshot upsets. Toss Up races were good, with the favorite expected to lose about 45% of the time, and, albeit in small sample sizes, they did lose about that often, or sometimes more. It’s the Lean and especially Likely categories where we see the big gap in upset races. Rather than winning about 1 in 7 or 1 in 8 Likely races, the underdog won only about 1 in 20, only a third as often. For Lean races we’d expect about 1 in 3 to be an upset, but the favorites won 3 in 4 or better.

So in terms of both extremity of vote share, and frequency of updates, I found that the models predicted much more uncertainty than election results showed.

Does that mean they were poorly calibrated? You can’t really tell from a single election. Often polling in retrospect underestimates one party or the other across the board (which one it favors is basically a coin flip), and in such environments you’d see more upsets. Before the election Silver talked about the downside risk for Republicans being much larger than for Democrats – that is, more GOP-held seats were Likely or Lean, and so if results proved more Blue, we would have seen many more seat gains for the Democrats, but if results were more Red, Democrats were still likely to gain House seats, just not so many.

I tweaked my analysis code to allow a parallel shift in vote share – that is I take the actual results, and then take, say, 2 points from the Democrat and give it to the Republican. So this is an effective 4 point swing towards Republicans. Here’s what would have happened in that scenario:

Model     Upsets   Expected Total 
Lite     29  5.7% 40.5  8.0% 506 
Deluxe   31  6.1% 29.9  5.9% 506 
Classic  30  5.9% 34.6  6.8% 506 
Office   Party    Lite  Deluxe Classic Party    Lite  Deluxe Classic Party    Lite  Deluxe Classic
Governor R  22    18.3    18.8    19.0 D  14    17.7    17.2    17.0
House    R 220   202.1   203.6   200.6 D 215   232.8   231.4   234.3
Senate   R  14     9.7     9.5     9.5 D  19    23.3    23.5    23.5 I   2     2.0     2.0     2.0
Model  Total    < 10%      < 50%     > 90%   
Lite    1233  157 12.7%  644 52.2%  153 12.4%
Deluxe  1233  144 11.7%  643 52.1%  136 11.0%
Classic 1233  139 11.3%  643 52.1%  142 11.5%

Now the Deluxe model almost exactly nails the number of upsets, while Classic is close, and only Lite is markedly low. In this more red environment, the GOP narrowly holds the House, with 220 seats, and it wins 14 Senate seats, for a 4 seat gain there. For all three models, the number of candidates with vote shares outside the 80% range is a little more than you’d expect in each direction.

If the error were in the opposite direction, and we saw Democrats do 2 points better across the board and Republicans 2 points worse, this is what I get:

Model     Upsets   Expected Total 
Lite     33  6.5% 40.5  8.0% 506 
Deluxe   27  5.3% 29.9  5.9% 506 
Classic  32  6.3% 34.6  6.8% 506 
Office   Party    Lite  Deluxe Classic Party    Lite  Deluxe Classic Party    Lite  Deluxe Classic
Governor R  16    18.3    18.8    19.0 D  20    17.7    17.2    17.0
House    R 184   202.1   203.6   200.6 D 251   232.8   231.4   234.3
Senate   R   8     9.7     9.5     9.5 D  25    23.3    23.5    23.5 I   2     2.0     2.0     2.0
Model  Total    < 10%      < 50%     > 90%   
Lite    1233   86 7.0%  643 52.1%   89 7.2%
Deluxe  1233   80 6.5%  651 52.8%   89 7.2%
Classic 1233   75 6.1%  648 52.6%   76 6.2%

This environment also produces more upsets, although each of the models still expected a few more upsets than occurred in this scenario.

Now instead of Republicans narrowly holding the House, Democrats flip more than 50 House seats, and also barely take control of the Senate by 1 seat. Interestingly, I still see fewer than 10% of candidates getting above the 90th percentile or below the 10th percentile expected vote share.

These scenarios also show how seat total projections would be impacted by a systematic error. Instead of virtually nailing the number of House seats, the models would be off by 15-20 or so, and they would do worse at calling Governor and Senate races.

This year was quite good overall for polling accuracy, and so the models overstated the uncertainty for this year’s election. Even in a different environment, the models only get to about the number of upsets predicted. In order start to see more upsets than the models predicted, I need to shift each race at least 3-4 points towards one party of the other, and that would be a *very* large polling miss. So while the models did quite well in projecting the actual outcome, I think they were likely overstating uncertainty.

Posted in Politics, Projections | Comments Off on Reviewing the FiveThirtyEight 2018 Election Forecasts

Reverse Platoon Splits – Before and After

Tom Tango asked someone to see what players with at least a 30-point wOBA reverse platoon split in their first 2500 plate appearances did for the rest of their careers, and Sean Foreman kindly provided split data from his database.

So I hacked together a Perl script to read his data and analyze it. The script lets you tweak filters, setting a minimum reverse split over some minimum number of plate appearances versus both left and right handed pitchers. Taking Tango’s suggested criteria, I found just 7 matching players, with an aggregate 40 point negative wOBA split:

                             Before                                   After
                        vs LHP     vs RHP                      vs LHP       vs RHP
Player     years     wOBA    PA  wOBA   PA  Split   years    wOBA   PA    wOBA   PA  Split
glanvdo01 1996-2000 0.313   710 0.346  2005 0.033 2001-2004 0.321   431 0.280  1136 -0.041
batisto01 1996-2002 0.316   872 0.351  2454 0.035 2003-2007 0.291   462 0.310  1171  0.019
bergewa01 1930-1935 0.365   538 0.407  2101 0.041 1936-1940 0.385   289 0.370  1335 -0.015
jonesad01 2006-2012 0.316   870 0.358  2246 0.043 2013-2018 0.334  1021 0.344  2851  0.010
samueju01 1983-1987 0.320   840 0.351  2036 0.030 1988-1998 0.344  1556 0.310  2232 -0.034
leeca01   1999-2003 0.329   642 0.367  2347 0.038 2004-2012 0.373  1396 0.357  4402 -0.015
jacksra01 1950-1956 0.311   599 0.359  2174 0.048 1957-1959 0.277    74 0.276   326 -0.002
Total               0.322  5071 0.362 15363 0.040           0.345  5229 0.336 13453 -0.009

Tango expected the group would be neutral, and in aggregate they showed a 9-point “normal” split in wOBA. Only two of the 7 still showed a reverse platoon split, and in both cases it was much narrower than their start of career split.

But just 7 batters making his cutoff seems a little small of a sample size. So I reran, this time allowing batters with at least a 20 point wOBA reverse split, and now I get 25 players whose aggregate split is 30 points:

                             Before                                   After
                        vs LHP     vs RHP                      vs LHP       vs RHP
Player     years     wOBA    PA  wOBA   PA  Split   years    wOBA   PA    wOBA   PA  Split
glanvdo01 1996-2000 0.313   710 0.346  2005 0.033 2001-2004 0.321   431 0.280  1136 -0.041
casege01  1937-1945 0.313   705 0.339  2216 0.027 1946-1947 0.298   129 0.270   348 -0.028
heganji01 1941-1952 0.286  1076 0.306  2123 0.020 1953-1960 0.291   876 0.296  1146  0.005
batisto01 1996-2002 0.316   872 0.351  2454 0.035 2003-2007 0.291   462 0.310  1171  0.019
spencda01 1952-1959 0.304   662 0.326  2088 0.022 1960-1963 0.366   449 0.337   913 -0.029
perezto01 1964-1970 0.352  1071 0.377  2261 0.026 1971-1986 0.388  2358 0.334  5166 -0.054
bressed01 1956-1964 0.316   827 0.342  2378 0.026 1965-1967 0.308   294 0.294   574 -0.015
mondera01 1993-1998 0.349   719 0.376  2366 0.027 1999-2005 0.383   740 0.338  2544 -0.045
wilsopr01 1998-2003 0.343   791 0.367  2242 0.023 2004-2007 0.375   367 0.320  1036 -0.054
disarga01 1990-1997 0.275   846 0.299  2251 0.024 1998-2000 0.311   213 0.310   722 -0.001
jonesad01 2006-2012 0.316   870 0.358  2246 0.043 2013-2018 0.334  1021 0.344  2851  0.010
zimmedo01 1954-1962 0.284   566 0.305  2053 0.021 1963-1965 0.294   300 0.316   674  0.022
hemslro01 1928-1939 0.296   721 0.323  2068 0.027 1940-1947 0.322   434 0.288  1108 -0.034
cimolgi01 1956-1963 0.307  1008 0.327  2258 0.020 1964-1965 0.141    53 0.287    23  0.146
ugglada01 2006-2009 0.340   645 0.370  2053 0.030 2010-2015 0.332   760 0.333  2051  0.001
suzukku01 2007-2012 0.292   780 0.321  2171 0.029 2013-2018 0.343   640 0.309  1728 -0.034
samueju01 1983-1987 0.320   840 0.351  2036 0.030 1988-1998 0.344  1556 0.310  2232 -0.034
fiskca01  1969-1977 0.358   778 0.380  2047 0.021 1978-1993 0.349  2292 0.341  4736 -0.008
jacksra01 1950-1956 0.311   599 0.359  2174 0.048 1957-1959 0.277    74 0.276   326 -0.002
bergewa01 1930-1935 0.365   538 0.407  2101 0.041 1936-1940 0.385   289 0.370  1335 -0.015
ludwiry01 2002-2011 0.328   947 0.356  2027 0.027 2012-2014 0.376   267 0.323   745 -0.053
boonebo01 1972-1978 0.301   820 0.325  2090 0.024 1979-1990 0.293  1629 0.295  3609  0.001
hollima01 2004-2008 0.388   660 0.415  2308 0.027 2009-2018 0.391  1309 0.373  3704 -0.018
hornebo01 1978-1983 0.365   638 0.389  2078 0.024 1984-1988 0.392   479 0.347  1018 -0.045
leeca01   1999-2003 0.329   642 0.367  2347 0.038 2004-2012 0.373  1396 0.357  4402 -0.015
Total               0.321 19331 0.352 54441 0.030           0.347 18818 0.331 45298 -0.017

Now we finally find a player, Don Zimmer (yes, the former Red Sox manager and Yankees coach!) who showed a greater reverse split over the rest of his career than the start, but again just barely, increasing to 22 points from 21. Just 6 other players showed any reverse split at all over the rest of their careers, and two just by a single wOBA point.

When I set the filter back at 30 wOBA points, but require fewer PA (250 against LHP, and 1000 against RHP),  I find a total of 57 players, with this aggregate:

Total               0.308 25543 0.348 67831 0.040           0.349 37399 0.331 93823 -0.018

Interestingly, this group in aggregate shows an 18-point normal platoon split over the rest of their careers, after a 40 point reverse split from the start of their careers.

So overall, it seems that even players who show a pronounced reverse platoon split tend to show a more normal platoon split over the rest of their careers.

If you want to tinker with different filters, you can download the raw data Sean Foreman made available, and pass it to my Perl script with different arguments.

Posted in Major League Baseball, Sabermetrics | Comments Off on Reverse Platoon Splits – Before and After

Professional Standings Now Available on RotoValue

RotoValue now also shows professional standings for both MLB and NBA. And, like the fantasy standings pages, you can customize them to any date range you like. So if you want to see how your team has done since a particular date, or over the past month, or since they called up Gleyber Torres or Ronald Acuna, RotoValue’s ProStandings page can show you. The Braves were two games behind the Nationals between Acuna’s call-up and his going on the DL on May 28th, while the Yankees have gained 7 games on the Red Sox since Torres was recalled through yesterday, June 9th.

Like the rest of RotoValue, this page is advertising-free, but it also adds some data that may be useful to fantasy sports players. In addition to wins, losses, and percentage, the page also shows runs (points for the NBA) scored and allowed per game. It’s a nice quick way to see how teams are doing, and if your pitcher is facing a tough offense next week, or your player is going up against harder defenses.

In addition, I show the “Pythagorean” records for each team, computing the winning percentages estimated from scored and allowed data. The basic model is:
RSX/(RSX + RAX), where X varies depending on the sport. When Bill James first proposed the concept, he used X=2 for MLB, but subsequent research has found a better fit with a somewhat smaller exponent. I’m using 1.83 for MLB, and 13.91 for NBA as proposed by Daryl Morey. Teams whose records are much better (or worse) than their expected records have typically been (un)lucky, and are more likely to revert closer to their expected winning percentage. That can give you insight on which teams may be more (or less) likely to contend for a playoff spot or (often more important for single-league fantasy purposes) trade away talent.

A link to this standings page now appears on the toolbar under the, uh, Standings menu:

Image of ProStandings page

In addition to ProStandings, there is also a Scoreboard page, which shows games, and, where appropriate, scores, for a given date.

Posted in Major League Baseball, NBA Basketball | Comments Off on Professional Standings Now Available on RotoValue

One Player, Two Kinds of Stats: Handling Shohei Ohtani

This year the Angels signed Shohei Ohtani, the young Japanese star who played both as a pitcher and outfielder for the Hokkaido Nippon Ham Fighters of the Japanese Pacific League. As in Japan, Ohtani is expected to continue to play extensively both as a pitcher and hitter.

Some players have played significantly at the major league level in both capacities in different seasons (most recently Rick Ankiel, and more famously Babe Ruth), but in the modern game it is unheard of for one person to contribute both as a batter and a pitcher in the same season. Until, probably, 2018, when Ohtani seems poised to do so.

This raises the question of how to handle Ohtani for fantasy purposes.

Yahoo! is handling Ohtani by turning him into two different players, a batter and a pitcher, and they’re allowing different fantasy teams to own the different stats of Ohtani. While I can see how that might be an easier technical fix in some platforms, it’s ugly, and it loses the benefit of flexibility a two-way player gives a real MLB team. Allowing different fantasy teams to own Ohtani’s batting and pitching stats is simply wrong, and making a team use two roster spots to be able to get all of Ohtani’s stats does’t match the true flexibility the Angels will have by having a single player capable of contributing both in the batters’ box and on the pitching mound.

CBS and ESPN are a little better: they let you put Ohtani either at P or in a batting slot, but they only count the pitching stats when he is in your lineup as a pitcher, and just the batting stats when he’s in your lineup as a batter. While that’s not terrible for a daily transaction league (you can swtich Ohtani in your lineup based on where he’ll play for the Angels to get most of his stats), you’ll still lose out on Ohtani’s offensive stats on days he’s pitching in an NL park and has to bat for himself. If you’re in a league with weekly transactions, though, this solution forces you to decide whether you want Ohtani’s batting or pitching numbers for an entire week.

RotoValue lets you have the best of both worlds: by default, it will count all Ohtani’s stats, no matter where you play him.

Because RotoValue already supports an option to count pitcher’s batting stats (and/or batters’ pitching stats), it was actually quite easy to enhance it to support counting both types of statistics for a player who qualifies at both an offensive and pitching position, while only counting the primary statistics for players who just qualify at one type. So by default, RotoValue will count both batting and pitching stats for Ohtani whenever he plays, but will ignore other pitchers’ batting statistics and other batters’ pitching statistics. Strictly speaking, this is not special treatment for Ohtani, but would apply to any player who qualifies both as a pitcher and a batter. It’s just that for now, Ohtani is likely to be the only one to do so: for now RotoValue is listing him as SP/DH, although it’s possible we may give him OF eligibility instead (or in addition to) DH eligibility.

Suppose you really want Ohtani to count only as a pitcher. You can simply set his custom position to be SP only, and his batting statistics will no longer count. Or you could make him eligible at DH or OF only, and then only his batting statistics would count. Such changes would take effect immediately and retroactively: reload a standings or team stats page after changing the setting, and the full season totals will reflect the new settings.

So – how do you change a player’s position?

If you have administrator rights for your league, on the Player Detail page there’s a menu item under Settings: “Set custom position for…”.

PlayerDetail for Shohei Ohtani

That menu option gives you a page where you can override the position for a player:

Custom Position for Shohei Ohtani

If you simply want all of Ohtani’s stats to count, you won’t have to make any of these changes, but if you want him to be a pitcher only (or, less likely, a batter only), you’d need to override his default position. So RotoValue gives you the choice to handle Ohtani how you think it makes better sense for your league.

Alternatively, if you want to count all pitchers’ batting (and/or batters’ pitching) stats, you can choose those options directly from the bottom of the main league Settings page:

Update League settings

Posted in Fantasy Strategy, Major League Baseball | Comments Off on One Player, Two Kinds of Stats: Handling Shohei Ohtani

Fighting the Last War

This week’s Riddler at FiveThirtyEight reruns a puzzle initially run back in February. The game is a “war” between two warlords fighting over 10 castles. Each warlord has 100 soldiers, and the 10 castles are worth from 1 to 10 points each. If you send more soldiers to a given castle than your opponent, you win it and its point value; if you both send exactly the same number of soldiers, the point value for the castle is shared between the two. The winner of the war is the one with more total points, and so ties are possible overall only if you’ve shared at least one castle with an odd point value. The goal of the first Riddler challenge was to have the most success against all other entries in the contest.

They’ve made the entries from the first contest public, and so that gives one a chance to see not only the winners, but all the entrants, and to play around with the data. I quickly hacked up a perl script to take their data and compute the results of the first contest. That ran pretty slowly (doing head-to-head battles for all the nearly 1400 entrants took about 12 seconds on my laptop), but accurately. I then rewrote the code in C, and saw the same thing run in about a tenth of a second, two orders of magnitude faster.

This made me wonder whether brute force might be useful to attack the problem, so first I wrote a C program to count all the possible allocations of the 100 armies across 10 castles. This took, uh, a while to run – about 8 hours – but I got my answer – a little over 4.25 trillion combinations.

That didn’t sound too good, but I quickly modified code so I could start trying combinations in order against the prior entries, and print out any one that did as well or better than the best combination I now tried. Last Sunday night I kicked that program off on my laptop. A week later, the program is still running, and has only gone through about 6 billion combinations, but it did find a few which did better than the best performing entry last time, so I’m entering the best of those today.

I wanted to see if I could speed things up, and one way to do that was to test, not against nearly 1400 entries, but a subset. I figured that people might look at which ones did well last time, and try to do something similar, so my subset was the 179 entries that, by my calculations, won 70% or more of their head-to-head matchups in the prior contest. I found many combinations that beat all 179 of those, so I then tried to compare lots of those against the larger dataset. So far, that has not given me a better result against the whole set from the last contest, but I’m entering one of those also, on the theory that this week’s entries will tend to look more like the very good ones from the last time than the whole set.

So my first entry is:

0 0 2 2 11 21 3 31 26 4

I’ll update this post later with links to the code used to generate these.

Update Wenesday 31 May 2017:

I’ve created a github repository for the code I was using here:

Also, I realized that when I first built the C programs, I did not add any optimization switches. The count.c program which took several hours to run before runs in under 10 minutes on my laptop now that I’ve added -O2 optimization with gcc. So if I’d done this in the first place, I’d have been able to search a lot further!

Posted in Riddler, Software | Comments Off on Fighting the Last War