Python MIT开放课程库存市场模拟不完整?

3

我刚刚从在线发布的MIT视频讲座(Lec 23 | MIT 6.00计算机科学和编程导论,2008年秋季)中复制了这段代码。由于我不确定是否完整地复制了视频讲座中的程序,所以它不能正常工作。我需要一些指导。

谢谢。

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

我本想给你+1,因为你勤奋好学,但是我今天的投票配额已经用完了。 - user201788
http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-00-introduction-to-computer-science-and-programming-fall-2008/lecture-videos/lec23.pdf 包含代码。 - plaes
2个回答

1

你似乎缺少了 mean = 0.0 并且需要将一个 a 改为 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)

附注:我认为大部分代码都在这个PDF文件中,可以在这个页面上找到。


感谢您的帮助。我确实错过了平均分配并且有一个"a"的拼写错误。不幸的是,我仍然无法运行程序。错误信息如下: stks1.append(Stock(100.0, d1)) NameError: 全局名称 'Stock' 未定义
如果您能再提供一些帮助,那将非常棒。再次感谢。
- banjanxed
我不确定为什么 Stock 应该是未定义的,因为您发布的代码显示它在全局级别上已定义。这应该可以工作:http://paste.ubuntu.com/481383/ - unutbu
是的,确实是一种奇怪的行为,但seggy发现了异常(如下)。再次感谢您的帮助。 - banjanxed

1

除了变量s的拼写错误和平均分配的遗漏之外,您还存在缩进问题。

目前,您已将unitTestStock()定义为Stock类的属性。这不是您想要的,特别是因为unitTestStock没有self参数。要解决问题,请合并上述更改,然后取消函数unitTestStock()及其后面的3行代码的整个缩进。

代码应该像这样:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接