Fantasy Baseball

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.

head2head
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 ….