Python MIT Open Courseware Моделирование фондового рынка неполное? - PullRequest
3 голосов
/ 21 августа 2010

Я только что скопировал этот код из видеолекции MIT, которая размещена в Интернете: (Лек 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 голос
/ 21 августа 2010

Помимо неправильного ввода переменной s и пропуска среднего значения, у вас также есть проблема с отступом.

В настоящий момент вы определили unitTestStock () как атрибут класса Stock. Это не то, что вы хотите, тем более, что unitTestStock не имеет собственного параметра. Чтобы решить вашу проблему, включите вышеуказанные изменения, а затем выделите весь текст функции 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
1 голос
/ 21 августа 2010

Вы, похоже, отсутствует 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)

PS. Я думаю, что большая часть этого кода находится в этом pdf , который можно найти на этой странице .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...