Python神经网络与股票价格:输入用什么?

2024-04-18 15:23:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在研究用Python编写的反向传播神经网络here。它与所提供的简单XOR示例配合得很好。在

然而,我想用它来做一些更复杂的事情:尝试预测股票价格。我知道神经网络不一定是最好的选择,可能一点也不准确,但我还是想试试。在

我的第一次尝试是获得某一特定股票(例如GOOG)过去10天的收盘价。然后我希望用这些数据训练神经网络,然后预测第二天的收盘价,但后来我意识到了一点:我只有1个输入值,在试图得到预测值时,没有任何输入可以提供。这是我所有困惑的根源,输入/隐藏/输出节点的数量。在

在一篇论文here中,他们提到使用最近d天股票的最低、最高和平均值作为输入。这是3个输入(或4个?如果你计算d),但是为了预测第二天的价格,你将不能提供任何这些作为输入(除了d?)。在

当用神经网络进行训练和预测时,你如何解释输入数量的这种变化?我是否遗漏了NN的一些基本部分以及它们是如何使用的?谢谢!在


Tags: 数据示例数量节点here神经网络事情股票
3条回答

你用滚动平均法消除了很多信息。将时间序列数据表示为神经网络的方法还有很多,例如滑动窗口法。在

假设您使用3天的数据作为输入,以便预测第4天。代替之前3天的平均值,您可以将每一天都呈现给一个输入节点。在前半部分数据上滚动这个3天的窗口来训练你的模型。要进行测试,请在您希望预测的前一天提供价值3天的价格。E、 g

训练集

[[day 1 price, day 2 price, day 3 price], day 4 price]
[[day 2 price, day 3 price, day 4 price], day 5 price]
[[day 3 price, day 4 price, day 5 price], day 6 price]
[[day 4 price, day 5 price, day 6 price], day 7 price] 

测试

^{pr2}$

@anana的评论帮助我点击了神经网络应该如何工作。正如她所说,我可以提供一只股票在过去d天(在我的例子中,是5天)的平均值作为输入,试图得到一个预测。在

这意味着我的培训输入格式为:

[[rollingAverage, rollingMinimum, rollingMaximum], normalizedClosePrice]过去五天(由于滚动窗口,总共分析了9天)。在

当我想在培训后获得预测时,我只提供以下格式的输入节点:

[rollingAverage, rollingMinimum, rollingMaximum]最近5天。在

以下是所有相关逻辑,结合我在原题中链接的神经网络:

## ================================================================

def normalizePrice(price, minimum, maximum):
    return ((2*price - (maximum + minimum)) / (maximum - minimum))

def denormalizePrice(price, minimum, maximum):
    return (((price*(maximum-minimum))/2) + (maximum + minimum))/2

## ================================================================

def rollingWindow(seq, windowSize):
    it = iter(seq)
    win = [it.next() for cnt in xrange(windowSize)] # First window
    yield win
    for e in it: # Subsequent windows
        win[:-1] = win[1:]
        win[-1] = e
        yield win

def getMovingAverage(values, windowSize):
    movingAverages = []

    for w in rollingWindow(values, windowSize):
        movingAverages.append(sum(w)/len(w))

    return movingAverages

def getMinimums(values, windowSize):
    minimums = []

    for w in rollingWindow(values, windowSize):
        minimums.append(min(w))

    return minimums

def getMaximums(values, windowSize):
    maximums = []

    for w in rollingWindow(values, windowSize):
        maximums.append(max(w))

    return maximums

## ================================================================

def getTimeSeriesValues(values, window):
    movingAverages = getMovingAverage(values, window)
    minimums = getMinimums(values, window)
    maximums = getMaximums(values, window)

    returnData = []

    # build items of the form [[average, minimum, maximum], normalized price]
    for i in range(0, len(movingAverages)):
        inputNode = [movingAverages[i], minimums[i], maximums[i]]
        price = normalizePrice(values[len(movingAverages) - (i + 1)], minimums[i], maximums[i])
        outputNode = [price]
        tempItem = [inputNode, outputNode]
        returnData.append(tempItem)

    return returnData

## ================================================================

def getHistoricalData(stockSymbol):
    historicalPrices = []

    # login to API
    urllib2.urlopen("http://api.kibot.com/?action=login&user=guest&password=guest")

    # get 14 days of data from API (business days only, could be < 10)
    url = "http://api.kibot.com/?action=history&symbol=" + stockSymbol + "&interval=daily&period=14&unadjusted=1&regularsession=1"
    apiData = urllib2.urlopen(url).read().split("\n")
    for line in apiData:
        if(len(line) > 0):
            tempLine = line.split(',')
            price = float(tempLine[1])
            historicalPrices.append(price)

    return historicalPrices

## ================================================================

def getTrainingData(stockSymbol):
    historicalData = getHistoricalData(stockSymbol)

    # reverse it so we're using the most recent data first, ensure we only have 9 data points
    historicalData.reverse()
    del historicalData[9:]

    # get five 5-day moving averages, 5-day lows, and 5-day highs, associated with the closing price
    trainingData = getTimeSeriesValues(historicalData, 5)

    return trainingData

有监督的机器学习者是一种算法,它采用一组特征(一组数字、输入)和一个结果(输出)相一致的案例。在

您需要的是一个训练数据集,例如,几个月的时间序列,您知道它的输出。一旦你的人际网络得到训练,你就要计算最近几天的股票价值(因为它已经发生了),以便预测明天会发生什么,这样你就知道该买什么了。在

最后,d不是一个输入,而是一个常量。输入/输出的数量是独立的(好吧,只要你有足够的输入特性)。理论上,拥有更多的特征可以提高预测的准确性,但是需要更长的处理时间,需要更大的训练集,并且可能容易过度拟合。在

相关问题 更多 >