65.9K
CodeProject 正在变化。 阅读更多。
Home

比特币实时价格上的 AI 预测和异常检测

starIconstarIconstarIconstarIconstarIcon

5.00/5 (2投票s)

2021年3月2日

CPOL

3分钟阅读

viewsIcon

8020

downloadIcon

214

在本文中,我们将结合预测和检测,应用于比特币价格数据的实时流。

引言

这一系列文章将指导您完成开发一个功能完善的时间序列预测器和异常检测器应用程序所需的步骤,该应用程序使用人工智能。 我们的预测器/检测器将处理加密货币数据,特别是 比特币。 但是,在跟随本系列文章之后,您将能够将您学到的概念和方法应用于任何类似性质的数据类型。

要充分受益于本系列文章,您应该具备一些 Python、机器学习和 Keras 技能。 整个项目都可以在我的 "GitHub 仓库中找到。 您也可以查看完全交互式的笔记本 这里这里

之前的文章 中,我们开发了用于处理时间序列数据的模型。 我们创建了一个比特币价格预测器以及一个异常检测器。 在本文中,我们将把这两个结合在一起。 这将使我们能够在未来检测异常。

从 Poloniex API 收集比特币数据

有什么比通过 API 获取当前数据进行预测更好的方法呢? 我们将使用 Poloniex API 来获取最近的过去数据。 我们想获取过去 24 小时的比特币价格,然后预测下一小时的价值。

让我们首先以 UTC 时区的 Unix 格式获取昨天和今天的日期

past = datetime.now(tz=timezone.utc) - timedelta(days=1) #yesterday's date
past = datetime.strftime(past, '%s') #reshaping to unix format
current = datetime.now(tz=timezone.utc).strftime('%s') #today's date

现在,让我们将这些日期传递给 Poloniex API,并将结果转换为 JSON 格式,以确保我们获得一个不错的 Pandas DataFrame

url = 'https://poloniex.com/public?command=returnChartData¤cyPair=USDT_BTC&start='+str(past)+'&end='+str(current)+'&period=300'
result = requests.get(url)
result = result.json()

要获取包含实际数据的 DataFrame,请运行

last_data = pd.DataFrame(result)

此数据收集包含一些我们不需要的列和格式,因此让我们稍微清理一下

last_data = last_data[['date','weightedAverage']]
last_data = last_data.resample('H', on='date')[['weightedAverage']].mean()
last_data = last_data[-24:]
unscaled = last_data.copy()

在使用这些数据进行预测之前,让我们使用之前训练过的 scaler 来获取与我们的两个模型兼容的值

last_data_scaled = scale_samples(last_data,last_data.columns[0],scaler)

预测和检测 Poloniex API 数据中的异常

现在我们已经整理了从 Poloniex 获取的数据,让我们预测和检测其中的异常

predictions = regressor.predict(last_data_scaled.values.reshape(1,24,1))
unscaled = unscaled.iloc[1:]
unscaled = unscaled.append(pd.DataFrame(scaler.inverse_transform(predictions)[0], index= [unscaled.index[len(unscaled)-1] + timedelta(hours=1)],columns =['weightedAverage']))
future_scaled = scale_samples(unscaled.copy(),unscaled.columns[0],scaler)
future_scaled_pred = detector.predict(future_scaled.values.reshape(1,24,1))
future_loss = np.mean(np.abs(future_scaled_pred - future_scaled.values.reshape(1,24,1)), axis=1)
unscaled['threshold'] = threshold
unscaled['loss'] = future_loss[0][0]
unscaled['anomaly'] = unscaled.loss > threshold
unscaled.head()

您应该得到一个看起来像这样的 DataFrame

最后,绘制结果

fig = go.Figure()
fig.add_trace(go.Scatter(x=unscaled.index, y=unscaled.weightedAverage.values,mode='lines',name='BTC Price'))
fig.add_trace(go.Scatter(x=unscaled.index, y=unscaled[unscaled['anomaly']==True]['weightedAverage'].values,mode='markers',marker_symbol='x',marker_size=10,name='Anomaly'))
fig.add_vrect(x0=unscaled.index[-2], x1=unscaled.index[-1],fillcolor="LightSalmon", opacity=1,layer="below", line_width=0)
fig.update_layout(showlegend=True,title="BTC price predictions and anomalies",xaxis_title="Time (UTC)",yaxis_title="Prices",font=dict(family="Courier New, monospace"))
 
fig.show()

作为输出,我们应该得到类似这样的散点图

结论

正如您所看到的,预测值与之前的值相比非常低。 如果您检查历史数据,您将看不到如此高值的序列。 这是因为当前的比特币价格是以前从未发生过的异常,而实际模型还没有看到这样的数据。 即使异常检测器可以将观测结果识别为异常,预测器也无法准确执行。 对于以前见过的数据值,它应该是准确的。 为了缓解这个问题,您需要收集一些包含最新价格值的当前数据。

要在随着时间推移不断流式传输的数据上执行准确的预测,一个好的方法是在一个每小时刷新一次的循环中运行最后几个代码块。 这样,您将始终获得下一小时的比特币价格并检测当前模式中的任何异常。 如果您想更进一步,我们建议为上述任务实施一个框架,例如 Streamlit。 您还将获得一个友好的用户界面。

祝您预测和检测愉快!

© . All rights reserved.