问题描述:
比特币价格预测器是一项极具前瞻性和实用性的项目。在这个数字化时代,区块链技术的不断发展 推动着加密货币市场的蓬勃发展。随着越来越多的数字货币涌现,并且市场波动性增加,对比特币价格 的准确预测变得至关重要。
预期解决方案:
通过参考英特尔的类似实现方案,预测比特币价格趋势的可靠性和准确性,以及预测模型的推理速 度,可以为全球数字货币市场的安全性和可持续性提供有力支持。这里,我们将分类准确度和推理时间 作为评估比特币价格预测器的主要依据。
数据集:
你可以在此处下载数据集要求。
需求:
需要使用 英特尔® ONEAPI AI分析工具包。
1.AI Tools: Deep Learning安装
针对预测比特币价格趋势的可靠性和准确性,英特尔® ONEAPI AI 分析工具包中的 Deep Learning 组件可以为您提供强大的功能来构建和训练适用于时间序列预测的 LSTM 模型。首先进入官网安装相关 依赖。
Install with conda*
conda install -c intel -c conda-forge --override-channels intel-extension-for- tensorflow=2.14 tensorflow=2.14 intel-optimization-for-horovod=0.28.1.1 intel- extension-for-pytorch=2.0.100 pytorch=2.0.1 oneccl_bind_pt=2.0.0
torchvision=0.15.2 python=3.10
2.数据分析
在本小节将使用Python及其流行的数据分析库如pandas、 matplotlib和numpy来分析比特币的价 格走势。分析这些价格趋势对投资者和交易者做出明智决策至关重要。在技术分析中常用的一种技术是 计算移动平均线,它有助于平滑价格数据并识别潜在的趋势。
2.1首先,我们需要导入必要的Python库:
import pandas as pd import matplotlib.pyplot as plt import numpy as np |
2.2接下来,我们将从CSV文件中读取比特币价格数据,并快速查看数据:
data = pd.read_csv("./data/bitcoin_price_Training - Training.csv") display(data.head()) |
输出:
Date | Open | High | Low | Close | Volume | Market Cap |
Jul 31, 2017 | 2763.24 | 2889.62 | 2720.61 | 2875.34 | 860,575,000 | 45,535,800,000 |
Jul 30, 2017 | 2724.39 | 2758.53 | 2644.85 | 2757.18 | 705,943,000 | 44,890,700,000 |
Jul 29, 2017 | 2807.02 | 2808.76 | 2692.80 | 2726.45 | 803,746,000 | 46,246,700,000 |
Jul 28, 2017 | 2679.73 | 2897.45 | 2679.73 | 2809.01 | 1,380,100,000 | 44,144,400,000 |
Jul 27, 2017 | 2538.71 | 2693.32 | 2529.34 | 2671.78 | 789,104,000 | 41,816,500,000 |
2.3探索数据的基本信息和摘要统计信息。
data['Date'] = pd.to_datetime(data['Date']) print("数据信息:") print(data.info()) |
输出:
Data Info:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1556 entries, 0 to 1555
Data columns (total 7 columns):
# Column Non-Null Count Dtype
0 Date 1556 non-null datetime64[ns]
1 Open 1556 non-null float64
2 High 1556 non-null float64
3 Low 1556 non-null float64
4 Close 1556 non-null float64
5 Volume 1556 non-null object
6 Market Cap 1556 non-null object
dtypes: datetime64[ns](1), float64(4), object(2)
memory usage: 85.2+ KB
None
print("\n数据摘要:") print(data.describe()) |
输出: | |||||
Data Summary: | |||||
Date | Open | High | Low | Close | |
count | 1556 | 1556.000000 | 1556.000000 | 1556.000000 | 1556.000000 |
mean 2015-06-14 | 12:00:00 | 582.625328 | 597.992847 | 567.851446 | 584.239396 |
min 2013-04-28 | 00:00:00 | 68.500000 | 74.560000 | 65.530000 | 68.430000 |
25% 2014-05-21 | 18:00:00 | 254.287500 | 260.327500 | 248.835000 | 254.320000 |
50% 2015-06-14 | 12:00:00 | 438.600000 | 447.560000 | 430.570000 | 438.855000 |
75% 2016-07-07 | 06:00:00 | 662.437500 | 674.525000 | 646.735000 | 663.402500 |
max 2017-07-31 | 00:00:00 | 2953.220000 | 2999.910000 | 2840.530000 | 2958.110000 |
std | NaN | 523.137312 | 542.992855 | 505.877401 | 525.904442 |
2.4绘制价格走势和移动平均线
data['MA_50'] = data['Close'].rolling(window=50).mean()
data['MA_200'] = data['Close'].rolling(window=200).mean()
plt.figure(figsize=(14, 7))
plt.plot(data['Date'], data['Close'], label='收盘价格 ', color='blue')
plt.plot(data['Date'], data['MA_50'], label='50日移动平均线 ', color='red')
plt.plot(data['Date'], data['MA_200'], label='200日移动平均线 ', color='green')
plt.title('比特币价格和移动平均线 ')
plt.xlabel('日期 ')
plt.ylabel('价格 ')
plt.legend()
plt.grid(True)
plt.show()
3.数据预处理
首先,我们需要读取比特币价格的历史数据,包括开盘价(Open)、最高价(High)、最低价
(Low)、收盘价(Close)、交易量(Volume)和市值(Market Cap)等信息。通过Pandas库读取 CSV文件,并对数据进行初步的处理。
import pandas as pd import matplotlib.pyplot as plt import numpy as np # 读取数据集 train_data = pd.read_csv("./data/bitcoin_price_Training - Training.csv") test_data = pd.read_csv("./data/bitcoin_price_1week_Test - Test.csv") # 将日期转换为日期时间格式 train_data['Date'] = pd.to_datetime(train_data['Date']) test_data['Date'] = pd.to_datetime(test_data['Date']) # 反转训练集和测试集的数据 train_data = train_data.iloc[::-1].reset_index(drop=True) test_data = test_data.iloc[::-1].reset_index(drop=True) # 将 Date 列设置为 DataFrame 的索引 train_data.set_index('Date', inplace=True) test_data.set_index('Date', inplace=True) |
接下来,我们使用MinMaxScaler对比特币的收盘价进行归一化处理,将其缩放到[0, 1]的范围内。
from sklearn.preprocessing import MinMaxScaler # 创建MinMaxScaler对象 scaler = MinMaxScaler() # 使用训练数据中的"Close"列拟合归一化器 scaler.fit(train_data[['Close']]) # 对训练数据中的"Close"列进行归一化处理 train_data_normalized = scaler.transform(train_data[['Close']]) # 对测试数据中的"Close"列进行归一化处理 test_data_normalized = scaler.transform(test_data[['Close']]) |
4.创建数据集
我们定义一个函数 create_dataset来创建LSTM模型所需的训练集和测试集。该函数通过设置
look_back参数,将时间序列数据转换成监督学习问题,其中每个样本包含过去若干天的比特币收盘价 作为输入特征,下一天的收盘价作为输出标签。
def create_dataset(dataset, look_back=1):
dataX, dataY = [], []
for i in range(len(dataset) - look_back):
a = dataset[i:(i + look_back), 0] # 直接从 NumPy 数组中提取特定列
dataX.append(a)
dataY.append(dataset[i + look_back, 0])
return np.array(dataX), np.array(dataY)
# 使用 create_dataset 函数创建训练集和测试集
look_back = 1
trainX, trainY = create_dataset(train_data_normalized, look_back)
testX, testY = create_dataset(test_data_normalized, look_back)
5.构建LSTM模型
接下来,我们使用Keras库构建一个简单的LSTM模型。该模型包含一个LSTM隐藏层和一个全连接 输出层。我们选择使用均方误差(MAE)作为损失函数,并使用Adam优化器进行模型训练。
from keras.models import Sequential
from keras.layers import LSTM, Dense
from keras.optimizers import Adam
# 将数据重塑为LSTM模型所需的输入格式 [样本数 , 时间步 , 特征数]
trainX = np.reshape(trainX, (trainX.shape[0], 1, trainX.shape[1])) testX = np.reshape(testX, (testX.shape[0], 1, testX.shape[1]))
# 创建 LSTM 模型
model = Sequential()
model.add(LSTM(100, input_shape=(trainX.shape[1], trainX.shape[2]))) model.add(Dense(1))
model.compile(loss='mae', optimizer='adam')
6.模型训练
history = model.fit(trainX, trainY, epochs=300, batch_size=100, validation_data= (testX, testY), verbose=1, shuffle=False) |
Epoch 1/300 2024-02-22 10:59:33.834991: I tensorflow/core/grappler/optimizers/custom_graph_optimizer_registry.cc:117] Plugin optimizer for device_type CPU is enabled. 16/16 [==============================] - 2s 38ms/step - loss: 0.1393 - val_loss: 0.8837 Epoch 2/300 16/16 [==============================] - 0s 11ms/step - loss: 0.0987 - val_loss: 0.7925 Epoch 3/300 16/16 [==============================] - 0s 18ms/step - loss: 0.0924 - val_loss: 0.7368 ....... Epoch 298/300 16/16 [==============================] - 0s 18ms/step - loss: 0.0113 - val_loss: 0.0393 Epoch 299/300 16/16 [==============================] - 0s 18ms/step - loss: 0.0096 - val_loss: 0.0360 Epoch 300/300 16/16 [==============================] - 0s 15ms/step - loss: 0.0063 - val_loss: 0.0452 |
7.模型评估
我们可以通过绘制训练过程中的损失曲线来评估模型的性能。
plt.plot(history.history['loss'], label='train') plt.plot(history.history['val_loss'], label='test') plt.legend() plt.show() |
8.模型推理
最后,我们使用训练好的模型进行推理,并将预测结果与实际值进行对比。
import time # 记录开始时间 start_time = time.time() # 在这里执行您的模型预测代码 predicted_normalized = model.predict(testX) # 记录结束时间 end_time = time.time() # 计算推理时间 inference_time = end_time - start_time print("推理时间:", inference_time, "秒") |
1/1 [==============================] - 0s 304ms/step 推理时间: 0.33905482292175293 秒 |
# 反归一化预测结果
predicted_close = scaler.inverse_transform(predicted_normalized)
actual_close = test_data['Close'].values
date_index = test_data.index
# 绘制预测结果和实际值的折线图
plt.plot(test_data.index,predicted_close, label='Predicted Values', color='blue')
plt.plot(test_data.index,actual_close, label='Actual Values', color='green')
# 添加图例和标签
plt.legend()
plt.xlabel('Date')
plt.ylabel('Bitcoin Price')
# 旋转 x 轴标签以提高可读性
plt.xticks(rotation=45)
# 显示图形
plt.show()
9.总结
在这个比特币价格预测的实验中,我们利用了英特尔® ONEAPI AI 分析工具包中的 Deep Learning 组件来构建预测模型,并对模型进行了训练和评估。以下是我们得出的一些实验结论:
1. 模型训练过程: 我们观察了模型在训练集和测试集上的损失曲线。通过使用英特尔® ONEAPI AI 分析工具包提供的 Deep Learning 组件,我们能够高效地训练模型并监控其收敛情况。损 失曲线的分析有助于我们了解模型在训练过程中的表现和优化空间。
2. 推理时间: 我们记录了模型进行推理的时间。利用英特尔® ONEAPI AI 分析工具包,我们能 够评估模型的推理性能,并在需要时进行优化。通过有效利用硬件加速功能,我们可以缩短推 理时间,提高模型的实时性和响应能力。
3. 预测结果对比: 我们将模型预测的比特币价格与实际价格进行了对比。借助英特尔® ONEAPI AI 分析工具包中的 Deep Learning 组件,我们能够快速训练和部署模型,并对其预测结果进 行验证。与实际价格较为接近的预测结果表明模型具有较高的准确性和预测能力。
综合以上观察,我们得出结论并指导实际应用中的模型优化和部署。利用英特尔® ONEAPI AI 分析 工具包提供的深度学习功能,我们能够构建高效、准确的预测模型,为比特币价格预测等应用领域提供 可靠的解决方案。