Programming performance/hay.steve Python
From HaskellWiki
- Implementation time: 1.5 hours.
- Experience: 3 days.
- Comments: I spent most of my time noodling on the syntax of Python and familiarizing myself with the documentation. I also spent some time getting the heap to work instead of taking multiple passes with that data. I originally said it took 2 hours, but I am bringing it down to 1.5 because I was eating dinner while and watching a movie while coding. Also, I came back later and spent a few minutes adding a verbosity feature as suggested in the problem statement.
1 Code
from heapq import heappush, heappop, nsmallest
verbose=False filename = "gspc.txt"
days = []
for f in open(filename):
if f[0] == '#':
continue
linelist = f.split(' ')
heappush( days, linelist )
cash = 10000.00 previousClose = -1.0 currentClose = 0.00
shares = []
beginningBalance = cash
print "Beginning Balance:", cash while days != []:
day = heappop( days )
i = day[0]
currentClose = float( day[4] )
if previousClose != -1.0:
percentGain = ( currentClose - previousClose ) / previousClose
if percentGain < -0.03:
numShares = 0.1 * cash / currentClose
heappush( shares, (currentClose, numShares) )
cash = 0.9 * cash
if verbose: print "On", i, ", bought" , numShares , "shares at" , currentClose , "."
else :
while shares != [] and nsmallest(1, shares)[0][0] <= currentClose / 1.06:
sell = heappop( shares )
cash += sell[1] * currentClose
if verbose: print "On", i, "sold" , sell[1] , "shares at" , currentClose , "."
previousClose = currentClose
while shares != []:
sell = heappop( shares )
cash += sell[1] * currentClose
if verbose: print "Sold" , sell[1] , "shares at" , currentClose , "."
print "Beginning balance:", beginningBalance print "Ending balance:", cash print "Percent Gain:", (cash-beginningBalance)/beginningBalance*100, "%."
2 Some later refinements
from heapq import heappush, heappop
- iterates through a heap while destroying it (side effect)
def heap_eater(heap):
while heap: yield heappop( heap )
- globals
verbose = True filename = "gspc.txt" days = [] positions = [] beginningBalance = 10000.00 cash = 10000.00 close = 0.00
- create the stock data heap
for f in open(filename):
if not f.startswith('#'):
date, open, high, low, close, volume, adjClose = f.split(' ')
day = ( date, float( close ) )
heappush( days, day )
print "Beginning Balance:", cash
- iterate through the days
startDate, oldClose = heappop( days ) for day, close in heap_eater( days ):
if close < 0.97 * oldClose:
numShares = 0.1 * cash / close
cash -= 0.1 * cash
position = (close, numShares )
heappush( positions, position )
if verbose:
print "On", day, ", bought" , numShares , "shares at" , close , "."
else:
for oldClose, numShares in heap_eater( positions ):
if close >= 1.06 * oldClose:
cash += numShares * close
if verbose:
print "On", day, "sold", numShares, "shares at", close, "."
else:
position = ( oldClose, numShares )
heappush( positions, position )
break
oldClose = close
- close out positions
for price,qty in positions:
cash += qty * close
if verbose:
print "Sold" , qty , "shares at" , close , "."
print "Beginning balance:", beginningBalance print "Ending balance:", cash print "Percent Gain:", (cash-beginningBalance)/beginningBalance*100, "%."
--Hay.steve 01:53, 8 March 2007 (UTC)
