2010-08-20 5 views
3

Je viens de copier ce code de la conférence vidéo du MIT mise en ligne: (Lec 23 | MIT 6.00 Introduction à l'informatique et à la programmation, automne 2008). Comme je devais le copier à partir d'une conférence vidéo, je ne suis pas sûr d'avoir obtenu le programme complet. Ça ne fonctionne pas comme ça, je pourrais utiliser quelques conseils.Python MIT Open Courseware Simulation du marché boursier Incomplet?

Merci.

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 
+0

Je vous donne +1 pour votre diligence et son penchant pour l'apprentissage, mais j'ai manqué de mon quota de votes pour la journée. –

+0

http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-00-introduction-to-computer-science-and-programming-fall-2008/lecture-videos/lec23.pdf contient le code. – plaes

Répondre

1

En plus de fausser la variable s et de manquer l'assignation moyenne, vous avez également un problème d'indentation. En l'état actuel des choses, vous avez défini unitTestStock() comme un attribut de la classe Stock. Ce n'est pas ce que vous voulez, d'autant plus que unitTestStock n'a pas de paramètre auto. Pour résoudre votre problème, incorporez les modifications ci-dessus, puis dérivez le corps entier de la fonction unitTestStock() et les 3 lignes qui la suivent.

Le code devrait ressembler à ceci:

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 
+0

Bonjour seggy, Merci l'homme, vous l'avez. A bientôt – banjanxed

+0

Content de pouvoir vous aider. – seggy

1

Vous semblez manquer mean = 0.0 et ont besoin de changer un a à un 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. Je pense que la plupart de ce code est en this pdf, qui peut être trouvé sur this page.

+0

Merci pour l'aide. J'ai manqué la tâche moyenne et j'ai eu la faute de frappe "a". Malheureusement, je suis toujours incapable de lancer le programme. Message d'erreur comme suit: stks1.append (Stock (100.0, d1)) NameError: nom global 'Stock' n'est pas défini >>> Toute aide supplémentaire serait génial. Merci encore. – banjanxed

+0

Je ne suis pas sûr pourquoi 'Stock' devrait être indéfini, puisque le code que vous avez posté a montré qu'il était défini au niveau global. Cela devrait fonctionner: http://paste.ubuntu.com/481383/ – unutbu

+0

Oui, comportement curieux en effet, mais seggy trouvé l'anomoly (ci-dessous). Merci encore pour votre aide. – banjanxed