I suppose K the least (endgame will up the ante for K, but not that many games will reach the endgame) and N the most (the knight is slow in regrouping) but I don't have access to a megabase. I expect the exact percentages to be dependent on which database you use (e.g. only GM games) but the general trend should stay. It seems to be a close call, as this sample shows:

German Youth Ch 2023 (3500 games), approx : B 40000 N 45000 R 40000 Q 35000 K 35000

  • 1
    This is interesting. Get the stats by opening such as sicilian and compare with other opening like ruy lopez. Another is to get the strong player's stats on sicilian and compare it with a weaker player's stats. I play french defense as black, how my average would compare with strong GM's who play those opening as black too. So now if I have 2 candidate moves available to choose, I will go for the average from strong players stats. This is fun. Idea: a chess GUI can be developed to show this stats.
    – ferdy
    Commented Aug 18, 2023 at 3:50
  • 1
    +1, but did you really mean 'most moves in an average game' (in this case, you'd need to define 'average game') rather than 'on average in a chess game'?
    – Hauptideal
    Commented Aug 18, 2023 at 10:17
  • @Hauptideal: After 50 years English still isn't my mother tongue :-) Indeed your version is better. I edit it. Commented Aug 18, 2023 at 17:55
  • Also do you mean for an individual piece starting on one home square or all moves of that piece type? An individual pawn can only move 7 squares but there are 8 pawns.
    – qwr
    Commented Aug 21, 2023 at 23:27

1 Answer 1


Database : Chess Compiled 2019-2022 2500+ ELO

Methodology :

  • I first passed it through kentdjb's pgn-extract to remove erroneous games from the db (you could restrict it by openings here) :
pgn-extract -o valid.pgn merged_2019_2022_25.pgn
  • I then wrote a python script (using Python chess) that extracts what piece moved and the move from a game and puts it into a pandas DataFrame and then to a CSV file
for move in game.mainline_moves():
    move_info = {
        'piece': board.piece_at(move.from_square).symbol().upper() if board.piece_at(move.from_square) is not None else None,  # noqa: E501
        'move': board.san(move).upper()
df = pd.DataFrame(moves)
  • Passing it back to a DF and counting it :
df = pd.read_csv("./moves_up.csv")


Whole database :

Piece N moves Average
P 2072118 23.058
R 1512889 16.835
N 1403186 15.615
B 1253473 13.949
K 1109101 12.342
Q 963072 10.717
Total 8313839
Number of Games 89864
Average number of half-moves in a game 92.52

Extracted are the move themselves (5731 distinct entries, multiple pieces (i.e. QF6F5), check/checkmate, and promotions are counted as their own entries):

Move Count
O-O 144493
NF6 101235
NF3 100404
D4 89831
D5 80752
E4 80105
NC3 77145
C4 72839
E5 72662
C5 71730

The most played in promotion is (A8=Q) the 931st move overall, having been played 783 times, and the most played under promotion is actually E8=N+ (2667th, played 13 times)

  • Average moves: Surely 92,52 are halfmoves? (Also, with longer games I expect more R - R vs R is the most prevalent endgame, AFAIK) Commented Aug 21, 2023 at 20:02
  • Yes, halfmoves @HaukeReddmann Commented Aug 21, 2023 at 20:16

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.