41丨数据挖掘实战(3):如何对比特币走势进行预测?
陈旸
该思维导图由 AI 生成,仅供参考
今天我带你用数据挖掘对比特币的走势进行预测和分析。
我们之前介绍了数据挖掘算法中的分类、聚类、回归和关联分析算法,那么对于比特币走势的预测,采用哪种方法比较好呢?
可能有些人会认为采用回归分析会好一些,因为预测的结果是连续的数值类型。实际上,数据挖掘算法还有一种叫时间序列分析的算法,时间序列分析模型建立了观察结果与时间变化的关系,能帮我们预测未来一段时间内的结果变化情况。
那么时间序列分析和回归分析有哪些区别呢?
首先,在选择模型前,我们需要确定结果与变量之间的关系。回归分析训练得到的是目标变量 y 与自变量 x(一个或多个)的相关性,然后通过新的自变量 x 来预测目标变量 y。而时间序列分析得到的是目标变量 y 与时间的相关性。
另外,回归分析擅长的是多变量与目标结果之间的分析,即便是单一变量,也往往与时间无关。而时间序列分析建立在时间变化的基础上,它会分析目标变量的趋势、周期、时期和不稳定因素等。这些趋势和周期都是在时间维度的基础上,我们要观察的重要特征。
那么针对今天要进行的预测比特币走势的项目,我们都需要掌握哪些目标呢?
了解时间序列预测的概念,以及常用的模型算法,包括 AR、MA、ARMA、ARIMA 模型等;
掌握并使用 ARMA 模型工具,对一个时间序列数据进行建模和预测;
对比特币的历史数据进行时间序列建模,并预测未来 6 个月的走势。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
本文介绍了如何使用时间序列分析方法来预测比特币的走势,主要使用了ARMA模型。文章首先介绍了时间序列预测的概念和常用模型算法,包括AR、MA、ARMA、ARIMA模型。然后详细介绍了ARMA模型的工具使用方法,包括如何创建ARMA类、拟合模型和进行预测。通过对比特币历史数据的分析和可视化,选择了月作为预测模型的时间尺度,并使用ARMA模型对比特币未来8个月的走势进行了预测。最终,通过对比实际走势和预测结果的对比,验证了ARMA模型的有效性。总的来说,本文通过实战项目展示了时间序列分析在比特币走势预测中的应用方法,为读者提供了清晰的操作流程和代码示例。文章内容简洁清晰,适合读者快速了解时间序列分析在比特币预测中的应用方法。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《数据分析实战 45 讲》,新⼈⾸单¥59
《数据分析实战 45 讲》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(32)
- 最新
- 精选
- Geek_2a6093老师能不能讲一下LSTM
作者回复: LSTM也是不错的方式,不过LSTM就像是炼金术,需要的计算量(时间)有些大了
2019-03-1816 - 王彬成运行沪市指数数据结果为: 参数错误: (0, 2) 最优模型: ARMA Model Results 预测数据: 2019-03-31 2841.753594 2019-04-30 2862.532373 2019-05-31 2816.252354 2019-06-30 2801.829572 2019-07-31 2773.588278 2019-08-31 2752.587602 2019-09-30 2729.086661 2019-10-31 2707.560415 2019-11-30 2685.923215 2019-12-31 2665.117874 ----------- df_month2['forecast']=best_model.predict(start=0,end=348)理解 start=0表示从第0课数据开始计算 end=348是指需要计算348个数据,即从1990-12-19到2019-12-31一共有348个月,所以有348个数据
作者回复: 对的
2019-03-1837 - 王彬成# -*- coding:utf-8 -*- # 编码使用 ARMA 模型对沪市指数未来 10 个月(截止到 2019 年 12 月 31 日)的变化进行预测 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-master/shanghai_1990-12-19_to_2019-2-28.csv') # 将时间作为 df 的索引 df.Timestamp=pd.to_datetime(df.Timestamp) df.index=df.Timestamp # 数据探索 print(df.head()) # 按照月来统计 df_month=df.resample('M').mean() # 按照月来显示沪市指数的走势 fig=plt.figure(figsize=[15,7]) plt.rcParams['font.sans-serif']=['SimHei'] plt.suptitle('沪市指数',fontsize=20) plt.plot(df_month.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.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[['Price']] date_list= [datetime(2019, 3, 31), datetime(2019, 4, 30), datetime(2019, 5, 31), datetime(2019, 6, 30), datetime(2019, 7, 31), datetime(2019, 8, 31), datetime(2019, 9, 30), datetime(2019, 10, 31),datetime(2019, 11, 30),datetime(2019, 12, 31)] 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=348) # 沪市指数预测结果显示 plt.figure(figsize=(20,7)) df_month2.Price.plot(label='实际指数') df_month2.forecast.plot(color='r',ls='--',label='预测指数') plt.legend() plt.title('沪市指数(月)') plt.xlabel('时间') plt.ylabel('指数') plt.show()
作者回复: Good Job
2019-03-1827 - 张丽斌这是刚好撞对了吧,比特币、股市什么的预测受各种因素影响太大了。更多是考虑动态因素
作者回复: 对 很多因素
2019-04-016 - 跳跳一、AR、MA、ARMA、ARIMA的区别 AR的核心思想是过去若干点的线性组合,再加上白噪声预测未来时刻点的值。 MA的核心思想是通过历史白噪声线性组合来影响当前的时刻点。 ARMA:结合AR、MA的思想,综合考虑历史白噪声和当前白噪声,预测未来时刻点。 ARIMA:较ARMA多了差分过程,对不平衡数据进行了差分平稳。 二、沪市指数预测结果如下: 参数错误: (0, 2) 最优模型: ARMA Model Results ============================================================================== Dep. Variable: Price No. Observations: 339 Model: ARMA(2, 2) Log Likelihood -2208.110 Method: css-mle S.D. of innovations 162.159 Date: Mon, 18 Mar 2019 AIC 4428.219 Time: 10:59:23 BIC 4451.175 Sample: 12-31-1990 HQIC 4437.367 - 02-28-2019
作者回复: 很好的总结,同时赞下完成作业的同学
2019-03-1826 - 骑行的掌柜J我用ARIMA模型对老师一开始的那组时间序列进行了分析预测,因为字数限制:省略一开始的数据加载和最后的预测步骤,但是加入对差分次数d的查找、找ARIMA模型的p、q值和模型检验三个步骤,希望对大家有用,谢谢 # -*- coding: utf-8 -*- # 用 ARIMA 进行时间序列预测 import numpy as np from statsmodels.graphics.tsaplots import acf,pacf,plot_acf,plot_pacf #2.下面我们先对非平稳时间序列进行时间序列的差分,找出适合的差分次数 #fig = plt.figure(figsize=(12, 8)) #ax1 = fig.add_subplot(111) #diff1 = data.diff(1) #diff1.plot(ax=ax1) #这里是做了1阶差分,可以看出时间序列的均值和方差基本平稳, #这里我们使用一阶差分的时间序列,把上面代码注释掉 #3.接下来我们要找到ARIMA模型中合适的p和q值: data = data.diff(1) data.dropna(inplace=True) #第一步:先检查平稳序列的自相关图和偏自相关图 fig = plt.figure(figsize=(12, 8)) ax1 = fig.add_subplot(211) fig = sm.graphics.tsa.plot_acf(data,lags=40,ax=ax1) #lags 表示滞后的阶数,下面分别得到acf 图和pacf 图 ax2 = fig.add_subplot(212) fig = sm.graphics.tsa.plot_pacf(data, lags=40,ax=ax2) #由下图我们可以分别用ARMA(0,1)模型、ARMA(7,0)模型、ARMA(7,1)模型等来拟合找出最佳模型: #第三步:找出最佳模型ARMA arma_mod1 = sm.tsa.ARMA(data,(7,0)).fit() print(arma_mod1.aic, arma_mod1.bic, arma_mod1.hqic) arma_mod2 = sm.tsa.ARMA(data,(0,1)).fit() print(arma_mod2.aic, arma_mod2.bic, arma_mod2.hqic) arma_mod3 = sm.tsa.ARMA(data,(7,1)).fit() print(arma_mod3.aic, arma_mod3.bic, arma_mod3.hqic) arma_mod4 = sm.tsa.ARMA(data,(8,0)).fit() print(arma_mod4.aic, arma_mod4.bic, arma_mod4.hqic) #由上面可以看出ARMA(7,0)模型最佳 #第四步:进行模型检验,首先对ARMA(7,0)模型所产生的残差做自相关图 resid = arma_mod1.resid #一定要加上这个变量赋值语句,不然会报错resid is not defined fig = plt.figure(figsize=(12, 8)) ax1 = fig.add_subplot(211) fig = sm.graphics.tsa.plot_acf(resid.values.squeeze(),lags=40,ax=ax1) ax2 = fig.add_subplot(212) fig = sm.graphics.tsa.plot_pacf(resid, lags=40,ax=ax2) #接着做德宾-沃森(D-W)检验 print(sm.stats.durbin_watson(arma_mod1.resid.values)) #得出来结果是不存在自相关性的 #再观察是否符合正态分布,这里用qq图 fig = plt.figure(figsize=(12,8)) ax = fig.add_subplot(111) fig = qqplot(resid, line='q',ax=ax, fit=True) #最后用Ljung-Box检验:检验的结果就是看最后一列前十二行的检验概率(一般观察滞后1~12阶) r,q,p = sm.tsa.acf(resid.values.squeeze(),qstat=True) data1 = np.c_[range(1,41), r[1:], q, p] table= pd.DataFrame(data1, columns=[ 'lag','AC','Q','Prob(>Q)']) print(table.set_index('lag'))
作者回复: Good Job,使用差分之后,再进行的ARMA模型
2019-09-2634 - 滢想问下老师,(1)对于类似于彩票这种类型的数据该用什么算法分析?(2)对于ARMA的最优只能人为赋值,循环检测最大值吗?若数据多的情况怎么办?
作者回复: 1)彩票这种用什么没有用,因为是完全随机性,找不到规律的,或者用规律解决不了问题 2)ARMA 可以赋值个范围,让它在范围内自己来寻找适合的参数,一般超参数优化都是这样操作 加油滢
2019-04-263 - 叁我觉得确实有些问题,在是同arma模型之前没有对数据平稳性检验,毕竟模型是基于平稳性的。
作者回复: 可以使用ARIMA模型
2019-09-192 - 王彬成AR、MA、ARMA和ARIMA模型区别 1、AR (Auto Regressive),中文叫自回归模型,它认为过去若干时刻的点通过线性组合,再加上白噪声就可以预测未来某个时刻的点。AR 模型还存在一个阶数,称为 AR(p)模型,也叫作 p 阶自回归模型。它指的是通过这个时刻点的前 p 个点,通过线性组合再加上白噪声来预测当前时刻点的值。 2、MA ( Moving Average),中文叫做滑动平均模型。MA 模型存在一个阶数,称为 MA(q) 模型,也叫作 q 阶移动平均模型。MA 模型是通过将一段时间序列中白噪声序列进行加权和。 3、ARMA ( Auto Regressive Moving Average),中文叫做自回归滑动平均模型, ARMA 模型存在 p 和 q 两个阶数,称为 ARMA(p,q) 模型。 4、ARIMA( Auto Regressive Integrated Moving Average ),中文叫差分自回归滑动平均模型,也叫求合自回归滑动平均模型。相比于 ARMA,ARIMA 多了一个差分的过程,作用是对不平稳数据进行差分平稳,在差分平稳后再进行建模。ARIMA 是一个三元组的阶数 (p,d,q),称为 ARIMA(p,d,q) 模型。其中 d 是差分阶数。
作者回复: 很好的总结!
2019-03-182 - JustDoDT交作业:快学完第一遍了,奥利给干了。 https://github.com/LearningChanging/Data-analysis-in-action/tree/master/41-%E6%95%B0%E6%8D%AE%E6%8C%96%E6%8E%98%E5%AE%9E%E6%88%98%EF%BC%883%EF%BC%89%EF%BC%9A%E5%A6%82%E4%BD%95%E5%AF%B9%E6%AF%94%E7%89%B9%E5%B8%81%E8%B5%B0%E5%8A%BF%E8%BF%9B%E8%A1%8C%E9%A2%84%E6%B5%8B%EF%BC%9F
作者回复: Good Job
2020-04-241
收起评论