实验背景与意义
bitstamp = pd.read_csv("bitcoin-historical-data/bitstampUSD_1-min_data_2012-01-01_to_2020-09-14.csv")
bitstamp['Timestamp'] = [datetime.fromtimestamp(x) for x in bitstamp['Timestamp']]
bitstamp.set_index("Timestamp").Weighted_Price.plot(figsize=(14,7), title="Bitcoin Weighted Price")
比特币是一种热门的虚拟货币。它的价格波动情况比较大。影响其价格的因素也较为复杂。要是能够精准地预测它的价格,就能给投资者提供做决策的依据,这样就能降低投资的风险。在本次进行的实验里,我们运用了多种方法和模型,其目的是找出更精准的比特币价格预测方案。
数据处理与初步分析
def fill_missing(df):
### function to impute missing values using interpolation ###
df['Open'] = df['Open'].interpolate()
df['Close'] = df['Close'].interpolate()
df['Weighted_Price'] = df['Weighted_Price'].interpolate()
df['Volume_(BTC)'] = df['Volume_(BTC)'].interpolate()
df['Volume_(Currency)'] = df['Volume_(Currency)'].interpolate()
df['High'] = df['High'].interpolate()
df['Low'] = df['Low'].interpolate()
print(df.head())
print(df.isnull().sum())
拿到比特币数据之后,第一步是了解数据情况。因为数据可能缺失,所以采用线性插值法处理。此方法的前提是数据点线性相关,通过用相邻非缺失值计算缺失值。对处理后的数据进行可视化,就能直观呈现价格走势。同时,可以依据 2017 年这个时间节点来划分时间段,接着运用统计测试去评估数据的平稳性。
时间重采样操作
ax = bitstamp['Weighted_Price'].plot(title='Bitcoin Prices', grid=True, figsize=(14,7))
ax.set_xlabel('Year')
ax.set_ylabel('Weighted Price')
ax.axvspan('2018-12-01','2019-01-31',color='red', alpha=0.3)
ax.axhspan(17500,20000, color='green',alpha=0.3)
时间重采样具备把时间序列数据从一个频率转换为另一个频率的能力。比如,以“1H”当作偏移值来对数据进行重新采样操作,如此便能提供更高级别的数据概要,让机构可以更优地理解市场的长期变化情况。借助这种方式,能够对不同时间尺度下的比特币数据进行分析。
plt.figure(figsize=(15,12))
plt.suptitle('Lag Plots', fontsize=22)
plt.subplot(3,3,1)
pd.plotting.lag_plot(bitstamp['Weighted_Price'], lag=1) #minute lag
plt.title('1-Minute Lag')
plt.legend()
plt.show()
时间序列分解与平稳性检验
根据前面的数据特征,把时间序列进行分解。分解后得到趋势、季节性和剩余成分。可以看出序列的均值、方差和协方差不稳定。由此推测该序列不是平稳的。通过 KPSS 和 ADF 等统计测试来确定这一判断。如果 p 值小于显著水平,那么该序列就是非平稳的。
模型相关操作
hourly_data = bitstamp.resample('1H').mean()
hourly_data = hourly_data.reset_index()
在模型构建时,包含的滞后数量越多,就越适合该数据集,不过也可能会引发过度拟合。经分析得知,除了部分峰值外,滞后大于 5 的系数值对模型的影响不大。滚动平均值或移动平均值能减少数据中的噪声,还可以依据特定函数对数据进行拆分与聚合。另外,能够进行交叉验证。把数据划分成训练期和验证期,通过这种方式来对模型的性能进行衡量。
plt.figure(figsize=(15,12))
series = bitstamp_daily.Weighted_Price
result = seasonal_decompose(series, model='additive',period=1)
result.plot()
模型对比与选择
使用多种模型去预测比特币价格,接着对这些模型的性能进行比较。用 R² 分数来评判预测的成效,若 R² 分数接近 1,就意味着拟合程度高;若 R² 分数接近 0,就意味着拟合效果不好。从综合实验的结果方面来看,LSTM 模型的成效更突出,故而选择它来预测未来 30 天的加权价格。你认为用 LSTM 模型来预测比特币价格是否足够精准且可靠?能够在评论区留下你对此的观点,并且也别忘记给本文点赞以及进行分享。
暂无评论
发表评论