#!/usr/bin/env python # Requires python 2.5 or higher from __future__ import with_statement class Price(object) : def __init__(self, row) : open, high, low, close, volume = row self.open, self.high, self.low, self.close, self.volume = float(open), float(high), float(low), float(close), float(volume.replace(",","")) def runningTotal(series) : result, s = [0], 0 for ss in series : s += ss result.append(s) return result def summedSeries (series, length) : s = runningTotal(series) for i in xrange(len(s) - length) : yield s[i + length] - s[i] def mfi(prices, length) : typ = [ (p.high + p.low + p.close) / 3 for p in prices ] vol = [ p.volume for p in prices ] returns = [ (typ[i] - typ[i-1]) / typ[i-1] for i in range(1, len(typ)) ] mf = [ typi * voli for typi, voli in zip(typ[1:], vol[1:]) ] pmf = [ (mfi if reti > 0 else 0) for mfi, reti in zip(mf, returns) ] return [ (100.0 * p/a) for p, a in zip(summedSeries(pmf, length), summedSeries(mf, length)) ] def loadQuotes(fileName) : import csv with open(fileName) as f : return [ Price(row) for row in csv.reader(f) ] if __name__ == "__main__" : data = loadQuotes("msft.csv") print mfi(data, 5)