attenuation of the central difference differentiator
Your filter forgets that in the discrete differences equation, you divide the difference in value by the difference in $x$; so, you'd need to multiply the result with ncycles*2*np.pi/nsamples to get the same.
Other than that, you're not compensating for the group delay of your FIR filter, either, so you want to shift the result by half the filter length, too.