数据分析实战 45 讲
陈旸
清华大学计算机博士
85359 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 49 讲
第二模块:数据分析算法篇 (20讲)
第四模块:数据分析工作篇 (2讲)
数据分析实战 45 讲
15
15
1.0x
00:00/00:00
登录|注册

41丨数据挖掘实战(3):如何对比特币走势进行预测?

今天我带你用数据挖掘对比特币的走势进行预测和分析。
我们之前介绍了数据挖掘算法中的分类、聚类、回归和关联分析算法,那么对于比特币走势的预测,采用哪种方法比较好呢?
可能有些人会认为采用回归分析会好一些,因为预测的结果是连续的数值类型。实际上,数据挖掘算法还有一种叫时间序列分析的算法,时间序列分析模型建立了观察结果与时间变化的关系,能帮我们预测未来一段时间内的结果变化情况。
那么时间序列分析和回归分析有哪些区别呢?
首先,在选择模型前,我们需要确定结果与变量之间的关系。回归分析训练得到的是目标变量 y 与自变量 x(一个或多个)的相关性,然后通过新的自变量 x 来预测目标变量 y。而时间序列分析得到的是目标变量 y 与时间的相关性。
另外,回归分析擅长的是多变量与目标结果之间的分析,即便是单一变量,也往往与时间无关。而时间序列分析建立在时间变化的基础上,它会分析目标变量的趋势、周期、时期和不稳定因素等。这些趋势和周期都是在时间维度的基础上,我们要观察的重要特征。
那么针对今天要进行的预测比特币走势的项目,我们都需要掌握哪些目标呢?
了解时间序列预测的概念,以及常用的模型算法,包括 AR、MA、ARMA、ARIMA 模型等;
掌握并使用 ARMA 模型工具,对一个时间序列数据进行建模和预测;
对比特币的历史数据进行时间序列建模,并预测未来 6 个月的走势。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《数据分析实战 45 讲》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(32)

  • 最新
  • 精选
  • Geek_2a6093
    老师能不能讲一下LSTM

    作者回复: LSTM也是不错的方式,不过LSTM就像是炼金术,需要的计算量(时间)有些大了

    16
  • 王彬成
    运行沪市指数数据结果为: 参数错误: (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个数据

    作者回复: 对的

    3
    7
  • 王彬成
    # -*- 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

    2
    7
  • 张丽斌
    这是刚好撞对了吧,比特币、股市什么的预测受各种因素影响太大了。更多是考虑动态因素

    作者回复: 对 很多因素

    6
  • 跳跳
    一、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

    作者回复: 很好的总结,同时赞下完成作业的同学

    2
    6
  • 骑行的掌柜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模型

    3
    4
  • 想问下老师,(1)对于类似于彩票这种类型的数据该用什么算法分析?(2)对于ARMA的最优只能人为赋值,循环检测最大值吗?若数据多的情况怎么办?

    作者回复: 1)彩票这种用什么没有用,因为是完全随机性,找不到规律的,或者用规律解决不了问题 2)ARMA 可以赋值个范围,让它在范围内自己来寻找适合的参数,一般超参数优化都是这样操作 加油滢

    3
  • 我觉得确实有些问题,在是同arma模型之前没有对数据平稳性检验,毕竟模型是基于平稳性的。

    作者回复: 可以使用ARIMA模型

    2
  • 王彬成
    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 是差分阶数。

    作者回复: 很好的总结!

    2
  • 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

    1
收起评论
显示
设置
留言
32
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部