Programming performance/hay.steve Python
Jump to navigation
Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
- 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.
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, "%."
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)