我正在使用Python编写的反向传播神经网络here。它与提供的简单XOR示例相得益彰。
但是,我想用它做一些更复杂的事情:试图预测股票价格。我知道神经网络不一定是最好的选择,可能根本就不准确,但我仍然想尝试。
我的第一次尝试是获得指定股票(例如,GOOG)过去10天的收盘价。然后我希望用这些数据训练神经网络然后预测第二天的收盘价,但后来我意识到:我只有1个输入值,并且在尝试获得预测时没有任何输入。这是我所有困惑的根源,即输入/隐藏/输出节点的数量。
在论文here中,他们提到使用过去d
天内股票的最低,最高和平均值作为输入。这是3个输入(如果算上d
则为4?),但为了预测第二天的价格,您将无法提供任何此类输入(除非d
?)。
在使用神经网络进行训练和预测时,您如何解释输入数量的这种变化?我错过了NN的一些基本部分以及如何使用它们?谢谢!
答案 0 :(得分:3)
这意味着我的培训输入格式为:
过去五天 [[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®ularsession=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]