I'm attempting to prepare data in the same manner as section 2 of this paper.

I'm finding it a bit of a struggle. Could someone check (/improve upon) my interpretation regarding the 2 sections I have highlighted (below)?

In the first section (highlighted in yellow):

We note that price momentum is a cross-sectional phenomenon with winners having high past returns and losers having low past returns relative to other stocks. Thus we normalize each of the cumulative returns by calculating the z-score relative to the cross-section of all stocks for each month or day.

... I'm struggling to understand exactly what is being described.

As far as I can see, the process would be:

  • For each day ...
    • for each stock ...
      • Assemble a trailing length-33 vector of past prices
      • Use this to compute stock's mean & standard deviation
      • Use today's price $x$ to compute stock's z-value: $z = \frac{x-\mu}{\sigma}$ (If I understand correctly, $z$ is a basic indication of momentum).
    • Now we have a z-vector over all stocks for this day. Normalize it! (?)
    • Now we have a vector indicating relative momentum for each stock for this day.

And the section (highlighted in green):

Finally we use returns over the subsequent month, t + 1, to label the examples with returns below the median as belonging to class 1 and those with returns above the median to class 2.

... I think translates as:

  • get monthly returns for months t-13 through t+1 & compute median
  • class = 1 if return for month t+1 < median else 2

So it looks as though class 2 stocks follow their normalised $z$ momentum-indicator, whereas class 1 don't.

Does this look correct?

enter image description here

PS No tag for 'data-processing'

  • 1
    $\begingroup$ First off, I think your interpretation of the first section is wrong. You need to take the month returns of all the stocks in the sample, and then each stock's z score is its relative position in that distribution. $\endgroup$
    – will
    Oct 10, 2016 at 6:25
  • 1
    $\begingroup$ The use of the word cross-sectional in the first paragraph (in 2 places) is crucial: momentum is being measured by comparing the cumret of one stock x to those of all the other stocks being considered. So $\mu,\sigma$ in the z calculation refer to the the average and std dev of cumret across all stocks. $\endgroup$
    – nbbo2
    Oct 10, 2016 at 13:34

2 Answers 2


To be fair, their description is awful but you're making this way more complicated than it is.

The author is assessing two signals, one short-term and another medium-term. He has a sample universe he's pulling return time-series for and calculating a ST (short-term) and MT (medium-term) indicator for each security, which, to short-hand, represents the security's cumulative return over the reference period. In short, he's calculating cumulative 1-year return based on monthly data and cumulative 1-month return based on daily data.

The t-2, t-3, t-1 portion is a bit of a formality. Jegadeesh and Titman established there's a near-term mean-reversion for longer term momentum indicators in the early 90s and the N-1 months (ie, for a 12 month indciator, use the last 12 months minus the 1 most recent) has become a standard, but it's mostly window dressing.

Once you have cumulative returns for your universe of stocks for each period, you normalize them since a 10% return in 2008 meant something different than it did in 2009. You use those the Z-scores to identify the top performers.

Beyond those calculations, it looks like they make a special allowance for reference dates in January (likely due to the January effect).

And then from the set up, they likely use the two indicators referenced to attempt to predict next month returns, though that's not included in the portion of the paper you included.


Tentatively, thanks to the comments and people on IRC (braverock, bluelou), I think this is the basic stratagem:

  • pick a point in time t
  • for each k of our N stocks get prices p(k,:) i.e. p(k, 1) thru p(k, 12) for the 12 months t-13 to t-2
  • perform cumulative sum: s = cumsum(p, 2);
  • for each of these 12 datapoints,
    • calculate mean $\mu$ and Standard Deviation $\sigma$ for each of our N stocks and hence calculate $z$ for each stock. i.e. 'the number of sd-s $s$ is above the average stock $s$.'
    • normalize the vector $z$. so we scale everything so that e.g. If the whole market inflates by 10% say, our vector remains unchanged.

(...and then we do the same process for the last 20 days).

So I think it is just trying to 'normalise' the position of each stock within the market at each datapoint, i.e. reduce it to a number roughly between say -3 and +3.

I learned that it is important to get your input data having a mean of 0.

I'm still not quite sure why they don't simply use for their output indicator:

  • class 1 if the stock falls in the next month
  • class 2 if the stock rises in the next month

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.