Not sure I'm accurately getting what you asked accomplished here, but see below code.
If you do not mind this generating extra keyframes in your animation you can copy paste into text editor & run script.
#######################################################################
# be sure to save blend file before running script #
# understand that this creates new keyframes every fstep of animation #
# it is recommended to test this on a dummy file before use #
#######################################################################
import bpy
list_of_all_scenes = bpy.data.scenes
fstep=5
if bpy.data.is_saved:
for y in list_of_all_scenes:
bpy.context.screen.scene = y
########## add custom properties to objects ############
for obj in bpy.data.objects:
obj["XVel"]=0.0
obj["YVel"]=0.0
obj["ZVel"]=0.0
########################################################
for f in range(y.frame_start, y.frame_end+fstep,fstep):
y.frame_set(f)
for obj in bpy.data.objects:
currentx=obj.location.x
currenty=obj.location.y
currentz=obj.location.z
y.frame_set(f-fstep)
oldx=obj.location.x
oldy=obj.location.y
oldz=obj.location.z
y.frame_set(f+fstep)
obj['XVel']=(currentx - oldx)/fstep
obj['YVel']=(currenty - oldy)/fstep
obj['ZVel']=(currentz - oldz)/fstep
obj.keyframe_insert(data_path='["XVel"]', frame=bpy.context.scene.frame_current)
obj.keyframe_insert(data_path='["YVel"]', frame=bpy.context.scene.frame_current)
obj.keyframe_insert(data_path='["ZVel"]', frame=bpy.context.scene.frame_current)