主页 > 最新版官网imtoken钱包下载 > 时间序列预测:比特币趋势预测

时间序列预测:比特币趋势预测

如果您被要求对比特币趋势进行预测,哪种方法更合适?

有很多监督学习算法可以做回归预测,比如逻辑回归、决策树、gbdt、xgboost等。

事实上,基于时间序列的预测方法在财务分析中非常常见。监督算法通过训练集找到特征与因变量之间的关系,然后将测试集中的输入特征带入训练好的模型中,得到输出结果。时间序列与监督学习最大的区别在于时间序列寻找因变量与时间的关系,分析目标变量的趋势、周期、时间、不稳定因素。这些趋势和周期都是我们要在时间维度上观察到的重要特征。

列举一个时间序列分析的典型案例比特币走势分析,增加对时间序列的感性认识:

气候学家通过时间序列数据预测全球气候变化

需要公司时间序列分析来预测产品需求和未来销售

地震学家根据时间序列数据预测地震

时间序列模型

在时间序列预测模型中,有一些经典的模型,包括AR、MA、ARMA、ARIMA。

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

白噪声:期望为 0 且方差恒定的随机数

比特币走势分析_比特币汇率走势_比特币走势英雄

AR 模型还有一个阶,称为 AR(p) 模型,也称为 p 阶自回归模型。是指通过当前节点之前的p个点加上白噪声的线性组合来预测当前点的值。

MA的英文全称是Moving Average,中文名是Moving Average模型。 AR模型通过过去点的线性组合来预测当前点,白噪声影响过去几个点间接影响当前预测值。 MA模型通过历史白噪声的线性组合影响当前点。

MA 模型也有一个顺序,即 MA(q) 模型。也称为 q 阶移动平均模型。

ARMA的英文全称是Auto Regressive Integrated Moving Average Model;中文称为Auto Regressive Moving Average Model,是AR模型和MA模型的结合。自然,ARMA也有两个阶,ARMA(p,q)。

ARIMA的英文全称是Auto Regressive Integrated Moving Average模型。移动平均模型。

ARIMA有一个额外的差分过程,用于在建模之前对非平稳数据进行差分平稳处理。

ARIMA 是三元组 (p,d,q) 的阶,其中 d 是差的阶。

建模工具

在使用ARMA工具之前,需要参考相关的工具包:

from statsmodels.tsa.arima_model import 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.6326

我们需要引入 AIC 标准,也称为 Akaike 消息标准,以评估模型的拟合程度。 AIC 越小越好。

创建了1901年到1990年的时间序列数据data,创建了ARMA(7, 0)模型,传入数据数据,用fit函数拟合,predict函数预测1991年到1990年之间的值2000.

在实践中,你可以给p和q一个范围,让它们运行一段时间,然后选择小的AIC作为最终的Model。

比特币趋势预测

比特币走势预测,除了历史数据外,还受到很多外部环境的影响,比如行业周期、汇率波动、政策,与用户对比特币的关注度高度相关。(这些都可以作为模型特征,但这不在本文讨论范围内)

本文仅考虑比特币趋势的历史数据

比特币走势英雄_比特币走势分析_比特币汇率走势

所需的历史数据可以从这里下载:github.com/cystanford/bitcoin

数据集的字段如下:

@ >

我们的目标是构建一个 ARMA 时间序列模型来预测未来 8 个月内比特币的(平均)价格。 (很明显,我的数据集正好适合这个模型,实际需要做很多工作尽量确定)。

首先我们需要加载数据。

1、我们可以先把大势可视化。

2、@ >我们根据需要选择时间粒度:天(数据集本身)、周、月、季度、年,本文选择月作为最小时间粒度。

压缩代码如下:

df_month = df.resample('M').mean()#by day

df_Q = df.resample('Q-DEC').mean()#按季度

df_year = df.resample('A-DEC').mean()#按年份

比特币走势英雄_比特币汇率走势_比特币走势分析

在原始数据中,Weighted_Price 为比特币每日价格,如果将时间维度压缩为月粒度,则 Weighted_Price 为比特币月均价。

然后,开始选择型号

1、我们选择ARMA模型,p和q的选择,我们取range(0,3),选择AIC最小的参数

2、@>最终结果是比特币未来8个月的平均价格。

最后我们给出了代码:

# -*- coding: utf-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(r'C:\Users\baihua\Desktop\bitcoin_2012-01-01_to_2018-10-31.csv',encoding='gbk')
# 将时间作为 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()

代码测试通过,结果如下

比特币走势分析_比特币汇率走势_比特币走势英雄

值得注意的是:我们选择月而不是天作为最小时间粒度,这样可以节省训练时间。我们这样做的依据是:

1、需求是未来8个月的价格; (训练可以将拟合数据压缩到月维度中(比如以当月30天的平均价格作为训练集,然后模型跑得非常快,如本文所示),或者天可以作为最小粒度,最终预测结果是未来8个月(n天)比特币走势分析,然后按时间节点平均月均价)

2、@>观察趋势图(2, 2, 1) and (2, 2, 2)可以发现,日粒度的成交价格与成交高度一致月粒度价格走势。

总结一下:

多元回归、统计学习模型、时间序列的区别:

多元回归:多个自变量单因变量;自变量之间不存在线性关系(否则为多重共线性,需要通过岭回归来修正),自变量与因变量之间存在高度相关性(这是选择特征的依据)。

多元回归选择特征的依据:方差法:以方差大的单一特征作为意图特征;相关系数法:将特征与因变量相关系数较大的特征作为意图特征。

多元回归参数法:最小二乘法(误差函数可以线性推导出,随机误差满足正态性,总之满足线性回归的四个假设)。

统计学习模型:统计学习模型又称为机器学习模型、监督学习和无监督学习;监督学习包括判别模型和非判别模型;参数学习法;划分依据不同)。

二元分类问题:多个输入特征和一个输出特征。更多关注如何解决模型过拟合,交叉验证和正则化思维贯穿其中。

时间序列分析:本文介绍的AR自回归、MA移动平均模型及其导数ARMIA都是时间序列的经典方法。使用历史数据来预测未来数据,而不考虑特征。