There are several factors to consider, especially if the number of displayed bids will dynamically change. I assume that 1000 updates / sec come from a thread other than the user interface thread.
First, you will need to configure updates for the user interface stream made for you, for updates to an existing ViewModel, but not for you for new / deleted ViewModels. With 1000 updates per second, you probably want to control the granularity of the marshalling in the user interface stream and the context switching that this entails. Ian Griffiths wrote a great blog series about it.
Secondly, if you want your UI to remain responsive, you probably want to avoid as many Gen 2 garbage collectors as possible, which means minimizing pressure on the GC. This may be a problem in your case when creating a new update of the Rate object for each update.
Once you start having several screens that do the same, you need to find a way to abstract this update into a common component. In other words, you will be scattering stream code through your ViewModels, which are error prone.
I created an open source project, ReactiveTables , which addresses these three issues and adds several other features, such as the ability to filter, sort, join model collections. There are also demos showing how to use it with virtual grids to get better performance. Perhaps this can help you / inspire you.
Slugart
source share