UA firms up about 3 months out last I looked.
edit: Still does. Looking at flights in the month of September 2017. Using the schedule released 2017-9-1 as 'truth'. Schedule column is the date the schedule came out. Percentages are how many flights are the same as the 'truth' schedule.
Taking a very literal definition: change to any of flight number, origin, destination, departure time, and arrival time counts as different.
Code:
schedule | mainline | express
------------+----------+---------
2016-10-01 | 5% | 1%
2016-11-01 | 5% | 1%
2016-12-01 | 5% | 1%
2017-01-01 | 5% | 1%
2017-02-01 | 11% | 1%
2017-03-01 | 12% | 1%
2017-04-01 | 13% | 1%
2017-05-01 | 14% | 2%
2017-06-01 | 26% | 16%
2017-07-01 | 86% | 85%
2017-08-01 | 98% | 97%
2017-09-01 | 100% | 100%
Looks like express has a little more literal churn later, probably due to flight number changes or trivial departure/arrival time changes.
Taking a looser definition: change to origin, destination, or departure time by more than 10 min counts as a change.
Code:
schedule | mainline | express
------------+----------+---------
2016-10-01 | 41% | 38%
2016-11-01 | 41% | 39%
2016-12-01 | 42% | 39%
2017-01-01 | 42% | 39%
2017-02-01 | 44% | 39%
2017-03-01 | 45% | 39%
2017-04-01 | 49% | 43%
2017-05-01 | 51% | 45%
2017-06-01 | 71% | 70%
2017-07-01 | 96% | 97%
2017-08-01 | 99% | 99%
2017-09-01 | 100% | 100%
At 4 months out you're a 50%/50% chance of a schedule change using the loose criteria.