Python MIT Open Courseware Stock Market Simulation Incomplete?

I just copied this code from the MIT video lecture that is posted online: (Lec 23 | MIT 6.00 Introduction to Computer Science and Programming, Fall 2008). Since I had to copy it from a video lecture, I'm not sure I got the complete program. It is not working as is, I could use some guidance.

Thanks.

`import pylab, random class Stock(object): def __init__(self, price, distribution): self.price = price self.history = [price] self.distribution = distribution self.lastChange = 0 def setPrice(self, price): self.price = price self.history.append(price) def getPrice(self): return self.price def makeMove(self, mktBias, mo): oldPrice = self.price baseMove = self.distribution() + mktBias self.price = self.price * (1.0 + baseMove) if mo: self.price = self.price + random.gauss(.5, .5)*self.lastChange if self.price < 0.01: self.price = 0.0 self.history.append(self.price) self.lastChange = oldPrice - self.price def showHistory(self, figNum): pylab.figure(figNum) pylab.plot(self.history) pylab.title('Closing Price, Test ' + str(figNum)) pylab.xlabel('Day') pylab.ylabel('Price') def unitTestStock(): def runSim(stks, fig, mo): for a in stks: for d in range(numDays): s.makeMove(bias, mo) s.showHistory(fig) mean += s.getPrice() mean = mean/float(numStks) pylab.axhline(mean) numStks = 20 numDays = 200 stks1 = [] stks2 = [] bias = 0.0 mo = False for i in range(numStks): volatility = random.uniform(0,0.2) d1 = lambda: random.uniform(-volatility, volatility) d2 = lambda: random.gauss(0.0, volatility/2.0) stks1.append(Stock(100.0, d1)) stks2.append(Stock(100.0, d2)) runSim(stks1, 1, mo) runSim(stks2, 2, mo) unitTestStock() pylab.show() assert False class Market(object): def __init__(self): self.stks = [] self.bias = 0.0 `

In addition to mistyping the variable s and missing the mean assignment, you also have an indentation problem.

As it stands, you've currently defined unitTestStock() as an attribute of the Stock class. This is not what you want, especially as unitTestStock has no self parameter. To fix your problem, incorporate the above changes, and then dedent the entire body of the function unitTestStock() and the 3 lines following it.

The code should look like this:

```class Stock(object): <...>```

``` def showHistory(self, figNum): pylab.figure(figNum) pylab.plot(self.history) pylab.title('Closing Price, Test ' + str(figNum)) pylab.xlabel('Day') pylab.ylabel('Price') def unitTestStock(): def runSim(stks, fig, mo): mean = 0.0 for s in stks: for d in range(numDays): s.makeMove(bias, mo) s.showHistory(fig) mean += s.getPrice() mean = mean/float(numStks) pylab.axhline(mean) numStks = 20 numDays = 200 stks1 = [] stks2 = [] bias = 0.0 mo = False for i in range(numStks): volatility = random.uniform(0,0.2) d1 = lambda: random.uniform(-volatility, volatility) d2 = lambda: random.gauss(0.0, volatility/2.0) stks1.append(Stock(100.0, d1)) stks2.append(Stock(100.0, d2)) runSim(stks1, 1, mo) runSim(stks2, 2, mo) ```

```unitTestStock() pylab.show() assert False ```

You seem to be missing `mean = 0.0` and need to change an `a` to an `s`:

```def runSim(stks, fig, mo): mean = 0.0 for s in stks: for d in range(numDays): s.makeMove(bias, mo) s.showHistory(fig) mean += s.getPrice() mean = mean/float(numStks) pylab.axhline(mean) ```

PS. I think most of this code is in this pdf, which can be found on this page.

Category:python Views:2 Time:2010-08-20