Programming performance/hay.steve Python

From HaskellWiki
< Programming performance
Revision as of 23:25, 11 July 2021 by Atravers (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
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)