Difference between revisions of "Programming performance/hay.steve Python"

From HaskellWiki
Jump to: navigation, search
m
 
(3 intermediate revisions by 3 users not shown)
Line 5: Line 5:
 
=== Code ===
 
=== Code ===
   
<code-python>
 
  +
<pre>
 
from heapq import heappush, heappop, nsmallest
 
from heapq import heappush, heappop, nsmallest
   
Line 57: Line 57:
 
print "Ending balance:", cash
 
print "Ending balance:", cash
 
print "Percent Gain:", (cash-beginningBalance)/beginningBalance*100, "%."
 
print "Percent Gain:", (cash-beginningBalance)/beginningBalance*100, "%."
</code-python>
 
  +
</pre>
  +
  +
=== Some later refinements ===
  +
<pre>
  +
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, "%."
  +
</pre>
   
 
--[[User:Hay.steve|Hay.steve]] 01:53, 8 March 2007 (UTC)
 
--[[User:Hay.steve|Hay.steve]] 01:53, 8 March 2007 (UTC)

Latest revision as of 23:25, 11 July 2021

  • 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)