Swansea City will end 2020 third in the Championship table as Steve Cooper’s side were unable to make the most of their chances in a goalless draw against Reading.
The Swans enjoyed by far the better of the contest, and carved out a number of clear opportunities, only to find Rafael Cabral in inspired form in the Royals’ goal.
The Brazilian saved from Andre Ayew on three separate occasions, and also denied Jake Bidwell and Joel Latibeaudiere, while Marc Guehi fired over the bar from close range.
Reading had chances of their own but could not get through Swansea’s defence as the home side kept a 13th clean sheet of the season.
In the end the Swans could not find the goal that would have moved them back up to second at the end of a calendar year where they have been among the Championship’s best performers.
The Swans showed one change from the win at Queens Park Rangers as Korey Smith came into midfield in place of Yan Dhanda.
The hosts had the better of the early possession and territory, without really threatening to test Rafael in the Reading goal.
They nearly worked Jamal Lowe away in the 12th minute, but Tom McIntyre covered strongly for the Royals to snuff out the opening.
The first big chance came in the 16th minute as concerted Swansea pressure ended with Ayew hitting an overhead kick over the bar from a Bidwell cross.
The Swans then needed a terrific save from Freddie Woodman to prevent Reading taking the lead.
Michael Olise swing in an excellent cross which was met by McIntyre on the volley, and the Swansea keeper reacted sharply to parry the strike away to safety.
Ayew fired straight at Rafael as Swansea got back on the front foot, but they were being largely kept at arm’s length by a well-organised Reading defence.
Swansea continued to press, Rafael pawing away an Ayew header from a superb cross by Connor Roberts.
The biggest chance yet came on 37 minutes as Guehi fired over from just outside the six-yard box, and Smith then saw a shot blocked after lovely link play as Swansea kept knocking on the door.
It was goalless at the break but the Swans were on the front foot again with Lowe whipping in a threatening ball.
The Swans then lost Ryan Bennett to injury, and his replacement Latibeaudiere went close with a header that forced Rafael into another save.
The Royals keeper then denied Bidwell’s header from Ayew’s cross, and he made yet another stop as the Ghanaian powerfully met a Roberts cross.
Still Swansea kept seeking the breakthrough as the game entered its final 20 minutes.
Woodman was the next keeper into action, denying McIntyre again with a fingertip save from a near-post header, and it proved the last meaningful opening as the game ended goalless.
Swansea City: Freddie Woodman; Ben Cabango, Ryan Bennett (Joel Latibeaudiere 53), Marc Guehi; Connor Roberts, Korey Smith (Kasey Palmer 73), Jay Fulton, Matt Grimes (captain), Jake Bidwell; Andre Ayew, Jamal Lowe (Viktor Gyokeres 87).
Unused Substitutes: Steven Benda, Ryan Manning, Wayne Routledge, Yan Dhanda, Oli Cooper, Jordon Garrick.
Reading: Rafael Cabral, Tomas Esteves, Tom Holmes, Michael Morrison (captain), Tom McIntyre; Andy Rinomhota, Josh Laurent; Michael Olise, Alfa Semedo (Sone Aluko 59), Ovie Ejaria (Omar Richards 73); Sam Baldock (John Swift 67).
Unused Substitutes: Luke Southwood, Nahum Melvin-Lambert, Tennai Watson, Ryan East, Jeriel Dorsett.
Referee: David Webb