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

时间:2014-04-29 00:47:27

标签: python artificial-intelligence neural-network

我正在使用Python编写的反向传播神经网络here。它与提供的简单XOR示例相得益彰。

但是,我想用它做一些更复杂的事情:试图预测股票价格。我知道神经网络不一定是最好的选择,可能根本就不准确,但我仍然想尝试。

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

在论文here中,他们提到使用过去d天内股票的最低,最高和平均值作为输入。这是3个输入(如果算上d则为4?),但为了预测第二天的价格,您将无法提供任何此类输入(除非d?)。

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

3 个答案:

答案 0 :(得分:3)

@ anana的评论帮助我点击神经网络应该如何工作。正如她所说,我可以提供最后一天(在我的情况下,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

答案 1 :(得分:0)

受监督的机器学习器是一种算法,它采用一系列与特征(一组数字,输入)和结果(输出)一致的情况。

您需要的是训练数据集,例如,您知道输出的几个月的时间序列。一旦您的网络经过培训,您就可以获取最近几天的股票价值(已知,因为它已经发生),以便预测明天会发生什么,所以您知道要买什么。

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

答案 2 :(得分:0)

使用滚动平均值可以消除大量信息。还有一些其他方法可以将时间序列数据呈现给NN,例如滑动窗户的方法。

假设您使用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] 

<强>测试

[day 5 price, day 6 price, day 7 price]