Calculating the maximum drawdown of a set of returns
You are correct to point out that your implementation is terribly inefficient compared to most built-in Numpy operations of similar complexity.  100X speedup would be reasonable for large arrays once you eliminate the python loop.  It would be trivial to replace your python loop with some Numpy indexing or broadcasting if it weren't for the pesky draw_series[r-1] = -(1 - max_draw) line which operates on the next-to-be-computed item in the array.  This is analogous to Numpy's accumulate but obviously there's no implementation of it for your particular algorithm.  You have three options as I see it:


Study your problem hard and see if you decompose it into numpy-only
accumulate and regular operations. 
See if your algorithm can be expressed as a compiled numexpr
expression. 
Compile this function using Cython, f2py or ctypes


One minor improvement is to replace returns = returns + 1 with returns += 1 which will operate in-place and avoid re-allocating the returns array.

Hope this helps.  good luck.