数据分析实战45讲
陈旸
清华大学计算机博士
立即订阅
17188 人已学习
课程目录
已完结 48 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 你为什么需要数据分析能力?
免费
第一模块:数据分析基础篇 (16讲)
01丨数据分析全景图及修炼指南
02丨学习数据挖掘的最佳路径是什么?
03丨Python基础语法:开始你的Python之旅
04丨Python科学计算:用NumPy快速处理数据
05丨Python科学计算:Pandas
06 | 学数据分析要掌握哪些基本概念?
07 | 用户画像:标签化就是数据的抽象能力
08 | 数据采集:如何自动化采集数据?
09丨数据采集:如何用八爪鱼采集微博上的“D&G”评论
10丨Python爬虫:如何自动化下载王祖贤海报?
11 | 数据科学家80%时间都花费在了这些清洗任务上?
免费
12 | 数据集成:这些大号一共20亿粉丝?
13 | 数据变换:考试成绩要求正态分布合理么?
14丨数据可视化:掌握数据领域的万金油技能
15丨一次学会Python数据可视化的10种技能
16丨数据分析基础篇答疑
第二模块:数据分析算法篇 (20讲)
17 丨决策树(上):要不要去打篮球?决策树来告诉你
18丨决策树(中):CART,一棵是回归树,另一棵是分类树
19丨决策树(下):泰坦尼克乘客生存预测
20丨朴素贝叶斯分类(上):如何让机器判断男女?
21丨朴素贝叶斯分类(下):如何对文档进行分类?
22丨SVM(上):如何用一根棍子将蓝红两色球分开?
23丨SVM(下):如何进行乳腺癌检测?
24丨KNN(上):如何根据打斗和接吻次数来划分电影类型?
25丨KNN(下):如何对手写数字进行识别?
26丨K-Means(上):如何给20支亚洲球队做聚类?
27丨K-Means(下):如何使用K-Means对图像进行分割?
28丨EM聚类(上):如何将一份菜等分给两个人?
29丨EM聚类(下):用EM算法对王者荣耀英雄进行划分
30丨关联规则挖掘(上):如何用Apriori发现用户购物规则?
31丨关联规则挖掘(下):导演如何选择演员?
32丨PageRank(上):搞懂Google的PageRank算法
33丨PageRank(下):分析希拉里邮件中的人物关系
34丨AdaBoost(上):如何使用AdaBoost提升分类器性能?
35丨AdaBoost(下):如何使用AdaBoost对房价进行预测?
36丨数据分析算法篇答疑
第三模块:数据分析实战篇 (7讲)
37丨数据采集实战:如何自动化运营微博?
38丨数据可视化实战:如何给毛不易的歌曲做词云展示?
39丨数据挖掘实战(1):信用卡违约率分析
40丨数据挖掘实战(2):信用卡诈骗分析
41丨数据挖掘实战(3):如何对比特币走势进行预测?
42丨当我们谈深度学习的时候,我们都在谈什么?
43丨深度学习(下):如何用Keras搭建深度学习网络做手写数字识别?
第四模块:数据分析工作篇 (2讲)
44丨如何培养你的数据分析思维?
45丨求职简历中没有相关项目经验,怎么办?
加餐 (1讲)
加餐丨在社交网络上刷粉刷量,技术上是如何实现的?
结束语 (1讲)
结束语丨当大家都在讲知识和工具的时候,我更希望你重视思维和实战
数据分析实战45讲
登录|注册

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

陈旸 2019-03-18
今天我带你用数据挖掘对比特币的走势进行预测和分析。
我们之前介绍了数据挖掘算法中的分类、聚类、回归和关联分析算法,那么对于比特币走势的预测,采用哪种方法比较好呢?
可能有些人会认为采用回归分析会好一些,因为预测的结果是连续的数值类型。实际上,数据挖掘算法还有一种叫时间序列分析的算法,时间序列分析模型建立了观察结果与时间变化的关系,能帮我们预测未来一段时间内的结果变化情况。
那么时间序列分析和回归分析有哪些区别呢?
首先,在选择模型前,我们需要确定结果与变量之间的关系。回归分析训练得到的是目标变量 y 与自变量 x(一个或多个)的相关性,然后通过新的自变量 x 来预测目标变量 y。而时间序列分析得到的是目标变量 y 与时间的相关性。
另外,回归分析擅长的是多变量与目标结果之间的分析,即便是单一变量,也往往与时间无关。而时间序列分析建立在时间变化的基础上,它会分析目标变量的趋势、周期、时期和不稳定因素等。这些趋势和周期都是在时间维度的基础上,我们要观察的重要特征。
那么针对今天要进行的预测比特币走势的项目,我们都需要掌握哪些目标呢?
了解时间序列预测的概念,以及常用的模型算法,包括 AR、MA、ARMA、ARIMA 模型等;
掌握并使用 ARMA 模型工具,对一个时间序列数据进行建模和预测;
对比特币的历史数据进行时间序列建模,并预测未来 6 个月的走势。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《数据分析实战45讲》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(19)

  • Geek_2a6093
    老师能不能讲一下LSTM
    2019-03-18
    11
  • 钟朗🐾
    老师,为什么这个没有对数据进行单位根检验和白噪声检验,这样会不会粗暴了点尼
    2019-04-20
    5
  • 王彬成
    # -*- 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()
    2019-03-18
    4
  • 王彬成
    运行沪市指数数据结果为:
    参数错误: (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-18
    3
  • 我觉得确实有些问题,在是同arma模型之前没有对数据平稳性检验,毕竟模型是基于平稳性的。
    2019-09-19
    2
  • 想问下老师,(1)对于类似于彩票这种类型的数据该用什么算法分析?(2)对于ARMA的最优只能人为赋值,循环检测最大值吗?若数据多的情况怎么办?
    2019-04-26
    2
  • 张丽斌
    这是刚好撞对了吧,比特币、股市什么的预测受各种因素影响太大了。更多是考虑动态因素
    2019-04-01
    2
  • 骑行的掌柜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'))
    2019-09-26
    2
    1
  • 堂吉诃德
    1. parameters = product(ps, qs)
    parameters为可迭代对象, 直接使用
    for param in parameters:
    不用再转为列表吧?

    2. 回答一下 @Grandia_Z
    时间序列操作
    date_list = pd.date_range('2019-03-31', '2019-12-31', periods=None, freq='D')
    希望你能看到
    2019-03-18
    1
  • 跳跳
    一、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-18
    1
  • Ronnyz
    AR
    随机变量的取值是前p期的多元线性回归,认为主要受过去p期的序列值影响。误差项是当前的随机干扰,为零均值白噪声序列
    MA
    在t时刻的随机变量的取值是前q期的随机扰动的多元线性函数。误差项是当期的随机干扰,为零均值白噪声序列,是序列的均值。认为主要受过去q期的误差项影响。
    ARMA
    随机变量的取值不仅与以前p期的序列值有关还与前q期的随机扰动有关。
    ARIMA
    将ARMA和差分法结合,得到ARIMA(p,d,q),其中d是需要对数据进行差分的阶数。


    #设置参数调整范围
    p_scope=range(0,3)
    q_scope=range(0,3)
    最优模型:
    Model: ARMA(2, 2)
    AIC 4428.219
    2019-12-02
  • A股预测,语言Python3.6 ,最佳模型ARMA(5, 4),设置的范围稍大,得到的结果还蛮接近,可以设置的再大一些,不过数据优点多跑起来时间较长。
    #数据加载
    path = '/Users/apple/Desktop/GitHubProject/Read mark/数据分析/geekTime/data/'
    df = pd.read_csv(path + '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()
    print(df_month.head())

    #按照天、月、季度、年显示A股走势
    fig = plt.figure(figsize=[15,7])
    plt.rcParams['font.sans-serif']=['SimHei']
    plt.suptitle('A股指数',fontsize = 18.0)
    plt.plot(df_month.Price, '-', label ='按月')
    plt.legend()
    plt.show()

    #设置参数范围
    ps = range(0,7)
    qs = range(0,7)
    parameters = product(ps,qs)
    parameters_list = list(parameters)
    #寻找最优ARMA模型参数,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())
    #A股预测
    df_month_value = 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_month_value = pd.concat([df_month_value,future])
    df_month_value['forecast']=best_model.predict(start=0, end=348)
    #A股预测结果展示
    plt.figure(figsize=(20,7))
    df_month_value.Price.plot(label='实际金额')
    df_month_value.forecast.plot(color='r', ls='--', label='预测金额')
    plt.legend()
    plt.title('A股金额(月)')
    plt.xlabel('时间')
    plt.ylabel('指数')
    plt.show()
    2019-04-26
  • Geek_dancer
    老师,ARMA是完全根据过去时序中的数据走势规律来进行预测的吗?但是大部分预测还是会受其他特征属性的影响,从而影响其走势还有波动。我用ARMA做了电力系统的负荷预测,对比了之前用SVM做的预测,感觉ARMA的预测测精度相当低,预测曲线基本就是一个一次线性曲线,有一个大概的趋势,负荷的周期波动性完全没有体现。请问这是ARMA的局限性决定的,还是我没有训练好啊。
    2019-03-26
  • Destroy、
    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('shanghai_1990-12-19_to_2019-2-28.csv')
    df.index = pd.to_datetime(df.Timestamp)
    df_month = df.resample('M').mean()
    # 设置参数范围
    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())
    # 股市预测
    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_month = pd.concat([df_month, future])
    df_month['forecast'] = best_model.predict(start=0, end=348)
    # 预测结果显示
    plt.figure(figsize=(20, 7))
    df_month.Price.plot(label='实际指数')
    df_month.forecast.plot(color='r', ls='--', label='预测指数')
    plt.legend()
    plt.title('金额(月)')
    plt.xlabel('TIME')
    plt.ylabel('RMB')
    plt.show()
    2019-03-25
  • third
    最优模型,ARMA(2, 2)
    2019-03-21
  • szm
    我看老师在挑选最有参数时用的是轮询办法,39章信用卡违约率分析中讲的GridSearch可以在这里使用吗?还是GridSearch只能用于sklearn库中的分类算法?
    2019-03-21
  • 白夜
    2019-03-31 2808.787904
    2019-04-30 2881.416121
    2019-05-31 2875.788248
    2019-06-30 2885.653128
    2019-07-31 2959.346386
    2019-08-31 3003.165403
    2019-09-30 2991.057003
    2019-10-31 2995.312025
    2019-11-30 3016.652431
    2019-12-31 2997.065752
    这是看涨啊
    2019-03-19
  • Grandia_Z
    提问:对未来十个月的变化进行统计,如果按日统计的话:
    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)]
    上面这段怎么写能包含从(2019.3.1-2019.12.31)的数据呢,不会把每一天都写进去吧
    2019-03-18
  • 王彬成
    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-18
收起评论
19
返回
顶部