Python MIT开放课程网股票市场模拟不完整?

3 投票
2 回答
3593 浏览
提问于 2025-04-16 03:06

我刚从网上的麻省理工学院视频讲座中复制了这段代码:(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

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里找到,链接在 这个页面

1

除了你把变量s打错了,没给mean赋值之外,你还有一个缩进的问题。

现在,你把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

撰写回答