Although fantasy baseball has been around for decades it has exploded with the advent of easy access to the Internet and emergence of sites like Draft Kings. What makes a player excel on a fantasy baseball team does not necessarily mean they excel on their real team.
It was brought to my attention that perhaps modeling and ranking players in fantasy leagues might be a useful exercise and it only took around 700 lines of code to make it happen. This post will show the top players in each position based upon 2019 numbers. For this exercise we’ll only look at the head to head leagues where points are tabulated as followed. This table was published on the CBS sports page.
Looks like runs and rbis aren’t very important for hitters and neither are earned runs for pitchers. Whatever. This is supposed to be fun, not an actual valuation of these players. Let’s look at the top players in each position.
Unlike in this model where we rank pitchers and hitters together, in Fantasy pitchers have a separate ranking. Pitchers can be ranked with hitters in this data model because for every run a hitter scores is a run a pitcher gives up making it exactly symmetrical. We also rank pitchers with hitters with WAR only for comparison.
In WAR hitters make up 60% of total value, pitchers 40%. It’s close enough to rank them together. In Fantasy hitting total points is almost 2x pitchers meaning hitters make up 2/3 or 66% of total value.
In 2019 hitters accumulated 182,837 points at a rate of 0.980 points per plate appearance. Not sure if that was by design to be close to 1/pa or just how it happened. In 2018 it was 0.933 and 0.952/pa in 2017. The ball bounces differently each season.
Pitchers accumulated a total of 89,349 points in 2019 for an average of 0.686/out. This model uses outs as a measure of time for pitchers, plate appearances for hitters. A starter who pitches 6 complete innings should accumulate around 12 points. This is an average across both starters and relievers. Relievers pitch less innings but accumulate points at a faster rate. In the tables below we lump them all together.
Points above average which uses a similar methodology to how Wins above average was calculated for each player but won’t be shown as it might confuse. Due to the disparity in how points are distributed between players PAA should not be used for ranking purposes. KISS requires ranking on total points accumulated per season.
The WAA and WAR columns show ranks for each value system covered here to provide context. Fantasy league values are points in a game for fun and do not necessarily reflect a player’s contribution to their real team winning. For example, wins and losses are meaningless for pitchers and a legacy stat carried over from old school baseball when starting pitchers used to pitch an entire game. Nowadays a reliever can come in, give up a bunch of runs to tie the game and receive a W for a bad outing. In modern baseball the W and L stat are often randomly allocated. Randomness is part of the fun in a game like Fantasy baseball however.
The below tables will cover top 15 point players for each position player and top 35 pitchers in 2019. Since hitter ranks do not include pitchers and vice versa you kind of have to double the rank number to get an apples to apples comparison with the WAA and WAR columns.
Fantasy Position 1B
Rank | Points | Name | Pos | WAA | WAR |
---|---|---|---|---|---|
+002+ | 849 | Pete_Alonso | 1B | +031+ | +038+ |
+008+ | 791 | Freddie_Freeman | 1B | +013+ | +055+ |
+022+ | 732 | Rhys_Hoskins | 1B | XXXXX | XXXXX |
+023+ | 730 | Jose_Abreu | 1B | +086+ | +166+ |
+024+ | 729 | Paul_Goldschmidt | 1B | +129+ | +134+ |
+027+ | 725 | Carlos_Santana | 1B | +091+ | +049+ |
+031+ | 706 | Josh_Bell | 1B | +019+ | +124+ |
+053+ | 654 | Christian_Walker | 1B | XXXXX | +134+ |
+056+ | 641 | Anthony_Rizzo | 1B | +092+ | +073+ |
+058+ | 637 | Eric_Hosmer | 1B | XXXXX | XXXXX |
+060+ | 633 | Danny_Santana | 1B-CF | +069+ | +176+ |
+064+ | 628 | Matt_Olson | 1B | +098+ | +035+ |
+069+ | 608 | Yuli_Gurriel | 1B-3B | +052+ | +108+ |
+093+ | 563 | Brandon_Belt | 1B-LF | -123- | XXXXX |
+100+ | 555 | Joey_Votto | 1B | -071- | XXXXX |
Fantasy Position 2B
Rank | Points | Name | Pos | WAA | WAR |
---|---|---|---|---|---|
+010+ | 787 | Jonathan_Villar | 2B-SS | XXXXX | +066+ |
+032+ | 704 | Ozzie_Albies | 2B | +192+ | +041+ |
+033+ | 704 | Max_Muncy | 2B-1B | +029+ | +023+ |
+035+ | 700 | Whit_Merrifield | 2B-RF | XXXXX | +066+ |
+047+ | 669 | DJ_LeMahieu | 2B-3B | +035+ | +019+ |
+054+ | 647 | Rougned_Odor | 2B | +119+ | XXXXX |
+078+ | 595 | Ryan_McMahon | 2B-3B | +159+ | XXXXX |
+084+ | 575 | Starlin_Castro | 2B-3B | -160- | XXXXX |
+089+ | 571 | Jose_Altuve | 2B | +089+ | +085+ |
+091+ | 565 | Cesar_Hernandez | 2B | -197- | +158+ |
+094+ | 561 | Freddy_Galvis | 2B | XXXXX | XXXXX |
+120+ | 528 | Asdrubal_Cabrera | 2B | +078+ | XXXXX |
+127+ | 509 | Kolten_Wong | 2B | -174- | +043+ |
+136+ | 490 | Cavan_Biggio | 2B | XXXXX | +134+ |
+137+ | 490 | Adam_Frazier | 2B | -128- | +141+ |
Fantasy Position 3B
Rank | Points | Name | Pos | WAA | WAR |
---|---|---|---|---|---|
+007+ | 793 | Eugenio_Suarez | 3B | +139+ | +049+ |
+013+ | 782 | Alex_Bregman | 3B-SS | +011+ | +002+ |
+014+ | 782 | Rafael_Devers | 3B | +006+ | +033+ |
+018+ | 756 | Anthony_Rendon | 3B | +005+ | +015+ |
+019+ | 745 | Josh_Donaldson | 3B | +102+ | +018+ |
+025+ | 729 | Eduardo_Escobar | 3B-2B | +051+ | +059+ |
+026+ | 726 | Nolan_Arenado | 3B | +022+ | +023+ |
+028+ | 720 | Matt_Chapman | 3B | +106+ | +013+ |
+029+ | 710 | Kris_Bryant | 3B-RF | +109+ | +092+ |
+050+ | 657 | Yoan_Moncada | 3B | +171+ | +047+ |
+055+ | 643 | Manny_Machado | 3B-SS | XXXXX | +112+ |
+057+ | 640 | Hunter_Dozier | 3B-RF | XXXXX | XXXXX |
+072+ | 600 | Mike_Moustakas | 3B-2B | +125+ | +108+ |
+080+ | 590 | Miguel_Sano | 3B | +038+ | +112+ |
+104+ | 554 | Jose_Ramirez | 3B | XXXXX | +102+ |
Fantasy Position Catcher
Rank | Points | Name | Pos | WAA | WAR |
---|---|---|---|---|---|
+049+ | 658 | Yasmani_Grandal | CR-1B | XXXXX | +158+ |
+066+ | 626 | J.T._Realmuto | CR | +100+ | +055+ |
+123+ | 520 | Gary_Sanchez | CR | +104+ | +112+ |
+128+ | 508 | Christian_Vazquez | CR | XXXXX | +187+ |
+129+ | 504 | James_McCann | CR | XXXXX | +077+ |
+150+ | 474 | Jorge_Alfaro | CR | -167- | XXXXX |
+157+ | 466 | Robinson_Chirinos | CR | XXXXX | +077+ |
+158+ | 466 | Mitch_Garver | CR | +033+ | +066+ |
+159+ | 462 | Willson_Contreras | CR | +177+ | +112+ |
+160+ | 461 | Roberto_Perez | CR | XXXXX | +073+ |
+164+ | 458 | Omar_Narvaez | CR | XXXXX | XXXXX |
+171+ | 441 | Wilson_Ramos | CR | XXXXX | XXXXX |
+202+ | 391 | Travis_d’Arnaud | CR-1B | +130+ | XXXXX |
+208+ | 372 | Carson_Kelly | CR | XXXXX | XXXXX |
+213+ | 367 | Yadier_Molina | CR | XXXXX | XXXXX |
Fantasy Position LF
Rank | Points | Name | Pos | WAA | WAR |
---|---|---|---|---|---|
+012+ | 783 | Juan_Soto | LF | +020+ | +043+ |
+037+ | 687 | Kyle_Schwarber | LF | +146+ | +176+ |
+051+ | 655 | Tommy_Pham | LF | XXXXX | +085+ |
+074+ | 598 | Marcell_Ozuna | LF | +084+ | XXXXX |
+075+ | 596 | Andrew_Benintendi | LF-CF | XXXXX | XXXXX |
+076+ | 595 | Michael_Brantley | LF | +124+ | +047+ |
+079+ | 594 | Eddie_Rosario | LF-RF | +024+ | XXXXX |
+085+ | 575 | Bryan_Reynolds | LF-RF | +200+ | +073+ |
+087+ | 573 | Joc_Pederson | LF-RF | +090+ | +102+ |
+092+ | 564 | Jeff_McNeil | LF-RF | +175+ | +038+ |
+095+ | 560 | Domingo_Santana | LF-RF | XXXXX | XXXXX |
+098+ | 556 | Eloy_Jimenez | LF | +174+ | XXXXX |
+107+ | 550 | Alex_Gordon | LF | XXXXX | XXXXX |
+113+ | 545 | Ryan_Braun | LF | +160+ | XXXXX |
+117+ | 539 | Wil_Myers | LF-CF | XXXXX | XXXXX |
Fantasy Position CF
Rank | Points | Name | Pos | WAA | WAR |
---|---|---|---|---|---|
+001+ | 890 | Ronald_Acuna_Jr. | CF-LF | +030+ | +031+ |
+011+ | 783 | Mike_Trout | CF | +012+ | +003+ |
+036+ | 687 | Ketel_Marte | CF-2B | +065+ | +010+ |
+043+ | 671 | George_Springer | CF-RF | +023+ | +017+ |
+062+ | 629 | Starling_Marte | CF | +075+ | +124+ |
+065+ | 627 | Victor_Robles | CF-RF | XXXXX | +064+ |
+081+ | 589 | Brett_Gardner | CF-LF | +126+ | +066+ |
+086+ | 574 | Kevin_Pillar | CF-RF | XXXXX | XXXXX |
+088+ | 572 | Jackie_Bradley_Jr. | CF | XXXXX | XXXXX |
+096+ | 557 | Ramon_Laureano | CF-RF | +108+ | +077+ |
+102+ | 555 | Mallex_Smith | CF-RF | -039- | XXXXX |
+109+ | 548 | Scott_Kingery | CF-3B | XXXXX | +121+ |
+112+ | 546 | Mark_Canha | CF-RF | XXXXX | +049+ |
+114+ | 542 | Leury_Garcia | CF-RF | -089- | XXXXX |
+119+ | 528 | Teoscar_Hernandez | CF-LF | XXXXX | XXXXX |
Fantasy Position RF
Rank | Points | Name | Pos | WAA | WAR |
---|---|---|---|---|---|
+003+ | 818 | Cody_Bellinger | RF-1B | +008+ | +001+ |
+004+ | 814 | Bryce_Harper | RF | +045+ | +059+ |
+009+ | 789 | Christian_Yelich | RF | +027+ | +009+ |
+017+ | 758 | Mookie_Betts | RF-CF | +039+ | +012+ |
+020+ | 742 | Trey_Mancini | RF-1B | +074+ | +102+ |
+030+ | 708 | Michael_Conforto | RF-CF | +134+ | +095+ |
+038+ | 687 | Nicholas_Castellanos | RF-LF | XXXXX | +141+ |
+039+ | 684 | Charlie_Blackmon | RF | +049+ | +176+ |
+040+ | 677 | Austin_Meadows | RF | +111+ | +077+ |
+046+ | 670 | Kole_Calhoun | RF | XXXXX | +176+ |
+061+ | 630 | Yasiel_Puig | RF | XXXXX | XXXXX |
+063+ | 629 | Randal_Grichuk | RF-CF | XXXXX | XXXXX |
+067+ | 624 | Max_Kepler | RF-CF | +046+ | +066+ |
+071+ | 605 | Adam_Eaton | RF | XXXXX | XXXXX |
+090+ | 570 | Dexter_Fowler | RF-CF | XXXXX | XXXXX |
Fantasy Position DH
Rank | Points | Name | Pos | WAA | WAR |
---|---|---|---|---|---|
+005+ | 813 | Jorge_Soler | DH-RF | +054+ | +085+ |
+021+ | 741 | J.D._Martinez | DH-RF | +041+ | +102+ |
+034+ | 700 | Shin-Soo_Choo | DH-RF | XXXXX | XXXXX |
+042+ | 672 | Nelson_Cruz | DH | +014+ | +058+ |
+068+ | 609 | Renato_Nunez | DH-1B | XXXXX | XXXXX |
+070+ | 606 | Franmil_Reyes | DH | XXXXX | XXXXX |
+077+ | 595 | Daniel_Vogelbach | DH-1B | XXXXX | XXXXX |
+097+ | 556 | Edwin_Encarnacion | DH-1B | +043+ | +141+ |
+125+ | 516 | Khris_Davis | DH | XXXXX | XXXXX |
+138+ | 489 | Yordan_Alvarez | DH-LF | +042+ | +085+ |
+151+ | 473 | Shohei_Ohtani | DH | XXXXX | +158+ |
+165+ | 455 | Miguel_Cabrera | DH-1B | -020- | XXXXX |
+206+ | 378 | Hunter_Pence | DH-LF | +076+ | XXXXX |
+393+ | 145 | Nick_Solak | DH-3B | XXXXX | XXXXX |
+413+ | 127 | Kendrys_Morales | DH | -107- | -065- |
Fantasy Pitchers
Rank | Points | Name | Pos | WAA | WAR |
---|---|---|---|---|---|
+001+ | 771 | Justin_Verlander | PITCH | +001+ | +005+ |
+002+ | 750 | Gerrit_Cole | PITCH | +002+ | +010+ |
+003+ | 628 | Zack_Greinke | PITCH | +009+ | +028+ |
+004+ | 623 | Stephen_Strasburg | PITCH | +028+ | +015+ |
+005+ | 603 | Shane_Bieber | PITCH | +018+ | +038+ |
+006+ | 592 | Jacob_deGrom | PITCH | +003+ | +008+ |
+007+ | 560 | Charlie_Morton | PITCH | +021+ | +035+ |
+008+ | 548 | Jack_Flaherty | PITCH | +007+ | +021+ |
+009+ | 547 | Clayton_Kershaw | PITCH | +025+ | +095+ |
+010+ | 545 | Patrick_Corbin | PITCH | +026+ | +023+ |
+011+ | 534 | Hyun-Jin_Ryu | PITCH | +004+ | +035+ |
+012+ | 533 | Lance_Lynn | PITCH | +057+ | +007+ |
+013+ | 524 | Walker_Buehler | PITCH | +036+ | +187+ |
+014+ | 520 | Eduardo_Rodriguez | PITCH | +114+ | +019+ |
+015+ | 519 | Luis_Castillo | PITCH | +040+ | +043+ |
+016+ | 504 | Max_Scherzer | PITCH | +017+ | +022+ |
+017+ | 495 | Lucas_Giolito | PITCH | +044+ | +028+ |
+018+ | 490 | Jose_Berrios | PITCH | +077+ | +102+ |
+019+ | 488 | Mike_Minor | PITCH | +050+ | +005+ |
+020+ | 487 | Madison_Bumgarner | PITCH | +133+ | +158+ |
+021+ | 480 | Aaron_Nola | PITCH | +117+ | +085+ |
+022+ | 473 | Mike_Soroka | PITCH | +010+ | +023+ |
+023+ | 464 | Josh_Hader | PITCH | +096+ | +147+ |
+024+ | 464 | Sonny_Gray | PITCH | +015+ | +028+ |
+025+ | 456 | Zack_Wheeler | PITCH | +168+ | +095+ |
+026+ | 456 | Trevor_Bauer | PITCH | XXXXX | XXXXX |
+027+ | 454 | Mike_Fiers | PITCH | +156+ | +124+ |
+028+ | 440 | Noah_Syndergaard | PITCH | XXXXX | +176+ |
+029+ | 437 | Will_Smith | PITCH | +135+ | +197+ |
+030+ | 433 | Roberto_Osuna | PITCH | +121+ | XXXXX |
+031+ | 428 | Marco_Gonzales | PITCH | +141+ | +108+ |
+032+ | 426 | Kirby_Yates | PITCH | +047+ | +134+ |
+033+ | 421 | Yu_Darvish | PITCH | +169+ | +102+ |
+034+ | 420 | German_Marquez | PITCH | XXXXX | +095+ |
+035+ | 418 | Domingo_German | PITCH | XXXXX | XXXXX |
Head to head fantasy leagues are simplest to model as they merely require adding up points. Rotisserie leagues are far more complicated where player compositions depend upon a seasonal strategy for doing well in certain categories. Since this baseball season is delayed maybe I’ll give it a try but not sure.
More simulation changes coming soon. It the season doesn’t start until May then we can’t start ranking players, simulating. and handicapping games until June and possibly beyond More on this later. Until then ….