Difference between revisions of "Programming performance/hay.steve Python"
Jump to navigation
Jump to search
m (Just some layout tweaks.) |
m |
||
(4 intermediate revisions by 3 users not shown) | |||
Line 1: | Line 1: | ||
− | * '''Implementation time''': |
+ | * '''Implementation time''': 1.5 hours. |
* '''Experience''': 3 days. |
* '''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 === |
=== Code === |
||
+ | <pre> |
||
− | <code-python> |
||
from heapq import heappush, heappop, nsmallest |
from heapq import heappush, heappop, nsmallest |
||
+ | verbose=False |
||
− | print "Implementation time: 2 hours. Python experience: 3 days." |
||
− | |||
filename = "gspc.txt" |
filename = "gspc.txt" |
||
Line 19: | Line 19: | ||
heappush( days, linelist ) |
heappush( days, linelist ) |
||
− | cash = 10000 |
+ | cash = 10000.00 |
− | |||
previousClose = -1.0 |
previousClose = -1.0 |
||
⚫ | |||
− | |||
⚫ | |||
shares = [] |
shares = [] |
||
Line 41: | Line 39: | ||
heappush( shares, (currentClose, numShares) ) |
heappush( shares, (currentClose, numShares) ) |
||
cash = 0.9 * cash |
cash = 0.9 * cash |
||
− | print "On", i, ", bought" , numShares , "shares at" , currentClose , "." |
+ | if verbose: print "On", i, ", bought" , numShares , "shares at" , currentClose , "." |
else : |
else : |
||
Line 47: | Line 45: | ||
sell = heappop( shares ) |
sell = heappop( shares ) |
||
cash += sell[1] * currentClose |
cash += sell[1] * currentClose |
||
− | print "On", i, "sold" , sell[1] , "shares at" , currentClose , "." |
+ | if verbose: print "On", i, "sold" , sell[1] , "shares at" , currentClose , "." |
previousClose = currentClose |
previousClose = currentClose |
||
Line 54: | Line 52: | ||
sell = heappop( shares ) |
sell = heappop( shares ) |
||
cash += sell[1] * currentClose |
cash += sell[1] * currentClose |
||
− | print "Sold" , sell[1] , "shares at" , currentClose , "." |
+ | if verbose: print "Sold" , sell[1] , "shares at" , currentClose , "." |
print "Beginning balance:", beginningBalance |
print "Beginning balance:", beginningBalance |
||
− | |||
print "Ending balance:", cash |
print "Ending balance:", cash |
||
+ | print "Percent Gain:", (cash-beginningBalance)/beginningBalance*100, "%." |
||
+ | </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, "%." |
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)