Here is my cross-section mean reversion strategy from my most recent blog post. It uses an algorithm outlined in Ernie Chan's "Algorithmic Trading: Winning Strategies and Their Rationale." For more information see my blog post. Let me know if you have any suggestions:
```
class CrossSectionalMR(bt.Strategy):
def prenext(self):
self.next()
def next(self):
# only look at data that existed yesterday
available = list(filter(lambda d: len(d), self.datas))
rets = np.zeros(len(available))
for i, d in enumerate(available):
# calculate individual daily returns
rets[i] = (d.close[0]- d.close[-1]) / d.close[-1]
# calculate weights using formula
market_ret = np.mean(rets)
weights = -(rets - market_ret)
weights = weights / np.sum(np.abs(weights))
for i, d in enumerate(available):
self.order_target_percent(d, target=weights[i])
```

]]>