Most of the exchanges provide aggressor side property of trades (e.g. Tag=5797 AggressorSide on CME) in their raw data. But many data providers do not provide this information via their datafeed API's. I need an algorithm to estimate with high precision the trade's aggressor side.

Suppose, I receive depth data updates and trades updates. The simplest algorithm is (in Java code):

public static int get_aggressor(int bid, int ask, int trade_price){
    int aggr = Tags.UNKNOWN_SIDE;
    if (bid < ask){ // i.e. no cross
        if (trade_price >= ask){
            aggr = Tags.BUY_SIDE;
        } else if (trade_price <= bid){
            aggr = Tags.SELL_SIDE;
    return aggr;

where bid and ask are best bid/ask prices at a time when the trade was received. This algorithm may fail to detect the aggressor when the trade in the question affects the best bid/ask.

Question: Suppose I have the history of recent price updates. How to improve the precision of the aggressor detection algorithm? Also, consider two types of data feed:

  1. The trades always arrive before the resulted price updates
  2. The order of updates arrival in #1 is not guaranteed.

Please let me know if there are published researches on this topic.


3 Answers 3


The most commonly-known approach to this is described in Inferring trade direction from intraday data (1991) by Lee and Ready. You will find that the non-trivial part has to do with classifying trades that are reported inside the spread. I believe you will find that the Lee-Ready algorithm will outperform the naive midpoint reference approach suggested by @Svisstack, but nevertheless you will not be able to fully mitigate misclassification.

A more modern exposition of the criticisms of the Lee-Ready algorithm is given by Chakrabarty et al (2012), which should give you a starting point for other readings.

  • $\begingroup$ does this article provide an algorithm to determine aggressor side for each trade? (please note, i'm not looking for statistical estimation of daily percentage, etc.) $\endgroup$
    – Serg
    Aug 27, 2014 at 15:16
  • $\begingroup$ @Serg: Yes, that is what I understand you're looking for. $\endgroup$
    – madilyn
    Aug 27, 2014 at 15:55

Most of these classifications of aggressive trades are not so relevant anymore, due to smart order routers which execute aggressive parent orders using passive child orders, as Maureen O'Hara points out in http://www2.warwick.ac.uk/fac/soc/wbs/subjects/finance/fof2014/programme/maureen_ohara.pdf

I am not sure what I would do if I wanted this information, but I suspect one will have to model the order book in order to get a real sense of whether liquidity is actually entering or leaving the market.

EDIT: Also, be very careful if you are trying to do this for equities using SIP data, since very often the quote feed and the trade feed are lagged with respect to each other, which will throw off any of the above classifications.

  • $\begingroup$ I'm only interested in futures, and only CME and Eurex. Note, that I subscribe also to the full order book data (as much as provider allows). I just thought that maybe if I use several recent changes in the best bid/ask (e.g. bid up, ask up, bid down, etc.), it could improve the precision of estimation. $\endgroup$
    – Serg
    Aug 28, 2014 at 20:17
  • $\begingroup$ Do you have a working link for the PDF you are referring? $\endgroup$ Sep 26, 2018 at 9:57

I think spread midpoint will be more safe reference, after that if transaction price is higher from midpoint its buy, otherwise sell, if equal then not specified.


Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.