I ran your code and made a magnitude response plot:
import numpy
import scipy.signal
from matplotlib import pyplot
try:
import seaborn
except:
pass #graphs won't be as pretty *shrug*
fs = 2500000 # Sample rate, Hz
band = [95000, 105000] # Desired pass band, Hz
trans_width = 5000 # Width of transition from pass band to stop band, Hz
numtaps = 200 # Size of the FIR filter.
edges = [0, band[0] - trans_width,
band[0], band[1],
band[1] + trans_width, 0.5*fs]
taps = scipy.signal.remez(numtaps, edges, [0, 1, 0], Hz=fs)
def plotme(taps, filename):
pyplot.figure(figsize=(10,5), dpi=90)
omega, h = scipy.signal.freqz(taps)
pyplot.plot(omega, numpy.abs(h))
pyplot.xlim( ( 0, numpy.pi ) )
pyplot.ylim( ( 0, max(numpy.abs(h)) ) )
pyplot.tight_layout()
pyplot.savefig(filename)
plotme(taps, "/tmp/freq.png")

As you can see, at DC ($f=0$), your filter has a suppression of but 0.2 – that is but -14dB (power)!
Now, I noticed that these first and last taps look strange. So what happens when we modify your taps
vector to exclude these?
plotme(taps[1:-1], "/tmp/freq2.png")

Now the overall frequency response looks much better, but the DC component got worse. However, you might solve that by cascading with a very relaxed high-pass filter with a cut-off somewhere between DC and your passband.
Hm, what about we set the zeroth tap to - the last tap?

Things look slightly more benign for the DC component, but we see the overall suppression has greatly decreased! My impression here is that Remez tries to find a minimum for overall attenuation error, and the DC leakage is the price you pay for acceptable overall attenuation.
My advice here is not to use the specific Remez algorithm; a "normal" windowing FIR designer usually can produce single-passband bandpasses just as well by designing an equivalen low-pass first and then applying spectral shift magic.
Let's do a rough analysis of how much headroom you have for proper attenuation in you 200 taps:
So, Belanger says:
$$N\approx \frac 23 \log_{10} \left[\frac1{10 \delta_1\delta_2}\right]\,\frac{f_s}{\Delta f}\tag{*}$$
with
$$\begin{align}
f_s &\text{ the sampling rate}\\
\Delta f& \text{ the transition width,}\\
\delta_1 &\text{ the ripple in passband,}\\
&\text{ ie. "how much of the original amplitude can you afford to vary"}\\
\delta_2 &\text{ the suppresion in the stop band}.
\end{align}$$
Let's find $\delta_2$. $(*)$ implies that, assuming $\delta_1=\delta_2$ is appropriate,
$$\begin{align}
10\cdot 10^{\frac 32 N\frac{\Delta f}{f_s}} &\approx \delta_2^{-2}\\
&\text{plugging in your numbers}\\
\delta_2^{-2} &\approx 10\cdot10^{\frac 32 200\frac{5\cdot10^3}{2.5\cdot 10^6}}\\
&=10\cdot 10^{0.6}\\
&\approx 40\\
&\implies
\delta_2 \approx 0.15
\end{align}$$
So, your real limiting factor is really just that your filter is too short to get something with a $\frac{f_s}{500}$ transition width done with nice attenuation.
The for that is probably a decimating stage before you do your bandpassing – if the highes frequency you're interested in is much much lower than half your sampling rate, you should just use a low pass filter to "roughly" cut out a lower bandwidth first, decimate in the process (decimate by $N$: throw away $N-1$ samples of every $N$ samples; filtering is necessary, because that would usually imply aliasing), and then design your band pass on the resulting lower sampling rate.