Does the position shift gradually while running or does it happen all at once?
If it happens all at once I'd look closely at your program for G92's, G52, G55, G56 etc... for some other type coordinate shift.
If it's a slow creep I'd look for a pulley or belt slipping-though I'd expect it would show up more often when cutting (usually a negative direction). Keep in mind that if it is shifting while cutting in the negative direction, it will show up as a shift in the positive direction. -Imaging commanding a 1" negative move against an immovable object located at Z0 so that the motor keeps turning but the belt or pulley slips so that the axis does not travel downward. When the move is complete the DRO will read -1.0000 and when you command a move to Z0, there is no resistance so the belt or pulley doesn't slip and Z0 is now 1" above the part instead of at the surface and commanding a move to the Z Machine zero (Z home) will now trip the limit.
An easy way to isolate the problem is to mark the motor shaft and the face of the motor while at MACHINE Z0. Run the machine for as long as you like -hours would be good- then command the axis back to machine 0 (not a coordinate 0). If the marks line up again, the problem is somewhere on the machine side of the motor shaft. If the marks don't line up the problem is either encoder or control related. No if's, and's or but's.
Unless it's something in your program, my money is on a gradual shift being caused by the pulley slipping. Even if you think it's happening all at once, it's likely that you only notice it when the limit trips. It could be a belt that's slipping but you can usually hear it.
Look at your program and do the motor mark test (mark the motor shaft and the motor face plate- nothing else) you'll find the problem.