主页 > imtoken苹果钱包 > 分析预测比特币走势

分析预测比特币走势

imtoken苹果钱包 2023-07-05 05:10:03

时间序列预测

关于时间序列,您可以将其视为按时间顺序排列的数字序列。事实上,在中国古代的农业社会中,人们总结了一年中不同时间点和天气的规律,形成了二十四节气,即观察天气和太阳的规律。时间序列(但没有时间序列模型和相应的工具),从而使农业快速发展。在现代社会,时间序列在金融、经济和商业领域有着广泛的应用。

在时间序列预测模型中,有一些经典的模型,包括AR、MA、ARMA、ARIMA。让我给你一个简单的介绍。

AR的英文全称是Auto Regressive,中文名称是Auto Regressive Model。这个算法的思路比较简单。它认为通过对过去的点添加白噪声,可以预测未来某个时间的点。

白噪声存在于我们的日常生活环境中。在数据挖掘的过程中,可以理解为一个期望为0、方差为常数的纯随机过程。AR模型还有一个阶数,称为AR(p)模型,也称为p阶自回归模型。是指通过该时间点的前p个点,通过线性组合加白噪声来预测当前时间点的值。

MA的英文全称叫做Moving Average比特币每天的走势,中文名字叫做移动平均模型。它类似于 AR 模型。AR模型是历史时间序列值的线性组合,MA是历史白噪声影响当前时间点的线性组合。AR模型中的历史白噪声通过影响历史时间序列值间接影响当前时间点的预测值。同样,MA模型也有阶数,称为MA(q)模型,也称为q阶移动平均模型。我们可以看到 AR 和 MA 模型都有订单。在AR模型中,我们用p来表示,而在MA模型中,我们用q来表示比特币每天的走势,这两个模型是相似的,

ARMA的英文全称是Auto Regressive Moving Average,中文称为Auto Regressive Moving Average,是AR模型和MA模型的混合体。与AR模型和MA模型相比,它具有更准确的估计。同理,ARMA模型有p和q两个阶,称为ARMA(p,q)模型

ARIMA的英文全称是Auto Regressive Integrated Moving Average模型,中文称为Differential Autoregressive Moving Average Model,也叫Summation Autoregressive Moving Average Model。与ARMA相比,ARIMA多了一个差分过程,用于稳定非平稳数据的差异,稳定后再对差异建模。ARIMA 的原理与 ARMA 模型相同。与 ARMA(p,q) 的两个阶相比,ARIMA 是 (p,d,q) 阶的三元组,称为 ARIMA(p,d,q) 模型。其中 d 是差阶。

创建时间预测模型 ARMA

通过ARMA(endog,order,exog=None)创建ARMA类,主要参数如下:


# coding:utf-8
# 用ARMA进行时间序列预测
import pandas as pd
import matplotlib.pyplot as plt
import statsmodels.api as sm
from statsmodels.tsa.arima_model import ARMA
from statsmodels.graphics.api import qqplot
# 创建数据
data = [5922, 5308, 5546, 5975, 2704, 1767, 4111, 5542, 4726, 5866, 6183, 3199, 1471, 1325, 6618, 6644, 5337, 7064, 2912, 1456, 4705, 4579, 4990, 4331, 4481, 1813, 1258, 4383, 5451, 5169, 5362, 6259, 3743, 2268, 5397, 5821, 6115, 6631, 6474, 4134, 2728, 5753, 7130, 7860, 6991, 7499, 5301, 2808, 6755, 6658, 7644, 6472, 8680, 6366, 5252, 8223, 8181, 10548, 11823, 14640, 9873, 6613, 14415, 13204, 14982, 9690, 10693, 8276, 4519, 7865, 8137, 10022, 7646, 8749, 5246, 4736, 9705, 7501, 9587, 10078, 9732, 6986, 4385, 8451, 9815, 10894, 10287, 9666, 6072, 5418]
data=pd.Series(data)
data_index = sm.tsa.datetools.dates_from_range('1901','1990')
# 绘制数据图
data.index = pd.Index(data_index)
data.plot(figsize=(12,8))
plt.show()
# 创建ARMA模型# 创建ARMA模型
arma = ARMA(data,(7,0)).fit()
print('AIC: %0.4lf' %arma.aic)
# 模型预测
predict_y = arma.predict('1990', '2000')
# 预测结果绘制
fig, ax = plt.subplots(figsize=(12, 8))
ax = data.ix['1901':].plot(ax=ax)
predict_y.plot(ax=ax)
plt.show()

AIC: 1619.6323

在这里插入图片描述

在这里插入图片描述

预测比特币走势

我们的目标是构建一个 ARMA 时间序列模型来预测比特币(平均)价格走势。选择多少个 p 和 q 参数?我们可以设置一个区间范围,选择 AIC 最低的 ARMA 模型

首先我们需要加载数据。

在这里插入图片描述

探索数据,使用数据可视化查看比特币的历史走势。可以根据不同的时间尺度(日、月、季度、年)对数据进行压缩,得到不同尺度的数据,然后进行可视化。在这四个时间尺度上,我们选择月份作为预测模型的时间尺度。相应地,我们选择Weighted_Price字段的值作为观察结果。在原始数据中,Weighted_Price 对应的是比特币的每日平均价格。以“月”为单位压缩时,对应的Weighted_Price得到比特币当月的平均价格:

df_month = df.resample('M').mean()

最后,在预测阶段创建了 ARMA 时间序列模型。我们不知道p和q取什么值,模型是最优的,所以我们可以给它们设置一个区间范围,比如range(0,3),然后计算不同的AIC值模型,并选择AIC值对应的最小的ARMA模型,最后用这个最优的ARMA模型预测比特币未来8个月的平均价格走势,并将结果可视化。

# 比特币走势预测,使用时间序列ARMA
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from statsmodels.tsa.arima_model import ARMA
import warnings
from itertools import product
from datetime import datetime
warnings.filterwarnings('ignore')
# 数据加载
df = pd.read_csv('./bitcoin_2012-01-01_to_2018-10-31.csv')
# 将时间作为df的索引
df.Timestamp = pd.to_datetime(df.Timestamp)
df.index = df.Timestamp
# 数据探索
print(df.head())
# 按照月,季度,年来统计
df_month = df.resample('M').mean()
df_Q = df.resample('Q-DEC').mean()
df_year = df.resample('A-DEC').mean()
# 按照天,月,季度,年来显示比特币的走势
fig = plt.figure(figsize=[15, 7])
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.suptitle('比特币金额(美金)', fontsize=20)
plt.subplot(221)
plt.plot(df.Weighted_Price, '-', label='按天')
plt.legend()
plt.subplot(222)
plt.plot(df_month.Weighted_Price, '-', label='按月')
plt.legend()
plt.subplot(223)
plt.plot(df_Q.Weighted_Price, '-', label='按季度')
plt.legend()
plt.subplot(224)
plt.plot(df_year.Weighted_Price, '-', label='按年')
plt.legend()
plt.show()
# 设置参数范围
ps = range(0, 3)
qs = range(0, 3)
parameters = product(ps, qs)
parameters_list = list(parameters)
# 寻找最优ARMA模型参数,即best_aic最小
results = []
best_aic = float("inf") # 正无穷
for param in parameters_list:
    try:
        model = ARMA(df_month.Weighted_Price,order=(param[0], param[1])).fit()
    except ValueError:
        print('参数错误:', param)
        continue
    aic = model.aic
    if aic < best_aic:
        best_model = model
        best_aic = aic
        best_param = param
    results.append([param, model.aic])
# 输出最优模型
result_table = pd.DataFrame(results)
result_table.columns = ['parameters', 'aic']
print('最优模型: ', best_model.summary())
# 比特币预测
df_month2 = df_month[['Weighted_Price']]
date_list = [datetime(2018, 11, 30), datetime(2018, 12, 31), datetime(2019, 1, 31), datetime(2019, 2, 28), datetime(2019, 3, 31), 
             datetime(2019, 4, 30), datetime(2019, 5, 31), datetime(2019, 6, 30)]
future = pd.DataFrame(index=date_list, columns= df_month.columns)
df_month2 = pd.concat([df_month2, future])
df_month2['forecast'] = best_model.predict(start=0, end=91)
# 比特币预测结果显示
plt.figure(figsize=(20,7))
df_month2.Weighted_Price.plot(label='实际金额')
df_month2.forecast.plot(color='r', ls='--', label='预测金额')
plt.legend()
plt.title('比特币金额(月)')
plt.xlabel('时间')
plt.ylabel('美金')
plt.show()

在这里插入图片描述

在这里插入图片描述