Programming performance/TimN Python

From HaskellWiki
< Programming performance
Revision as of 03:45, 7 March 2007 by Newsham (talk | contribs) (initial import)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search
  • Language: Python
  • Skill: Advanced. I've been coding in Python for several years and use it on a regular basis for work and fun. I've written several large programs in Python.
  • Time: Less than 30 minutes. I did not keep track of time well and this is just an estimate.
  • Notes: The noisy flag can be used to adjust the amount of output.

Code

<code-python>

  1. !/usr/bin/python

noisy = True

def lines(fn) :

   return (l.strip() for l in file(fn))

def fields(fn) :

   return (l.split(' ') for l in lines(fn) if l[0] != '#')

def closes(fn) :

   return ((fs[0],float(fs[-1])) for fs in fields(fn))

def delta(p, oldp) :

   return (p - oldp) / oldp

def strategy(ps) :

   cash = 10000.0
   held = 0.0
   queue = []
   p = 0.0
   lastp = 1.0
   for n,(date,p) in enumerate(ps) :
       if delta(p, lastp) < -0.03 :    # down 3%, buy 10%
           cost = 0.10 * cash
           quant = cost / p
           queue.append((quant, p, n))
           cash -= cost
           held += quant
           if noisy : print date, "buy %.2f at $%.2f ($%.2f)" % (quant, p, cost)
       while len(queue) > 0 :          # check triggers
           quant, buyp, n2 = queue[-1]
           if delta(p, buyp) > 0.06 :  # up 6%, sell
               queue.pop()
               cost = quant * p
               cash += cost
               held -= quant
               if noisy : print date, "sell %.2f at $%.2f ($%.2f)" % (quant, p, cost)
           else :
               break
       lastp = p
   if noisy : print queue
   cash += held * p
   return cash
   
  1. data is stored in reverse order.

series = list(closes('gspc')) series.reverse() val = strategy(series) print '$%.2f' % val </code-python>