Paper trading with IEX streamed data

This is my setup:

  • alpaca-py SDK
  • A Python application running locally
  • A paper trading account
  • Free tier

I use stream data to check quotes and trigger stop-loss orders. Based on the logs of my application, I see that the bid price and the fill price for the triggered stop-loss sell order are different:

2025-03-10 12:01:13,304 [INFO] [STOP-LOSS] SMCI bid=35.50 <= 35.95. Attempting to sell.
2025-03-10 12:01:13,380 [INFO] SELL partial fill => SMCI, qty=7429.0, fill_price=36.02

The fill price is indeed higher than the bid price, which convinces me that the stop-loss was incorrectly triggered.

My question: Is this difference because the streamed data for the free tier is only from IEX, making it different from the actual market price of the asset? Will switching to the paid tier and using SIP remove this discrepancy?

The data shows that bid price suddenly drops to a certain value (in the above image 37.5) for some times and then gets back to the normal. I don’t see such changes in the SIP data. It seems to be a bug as it always drops to a specific number.