美文网首页分析方法及算法知识
python时间序列预测股票走势

python时间序列预测股票走势

作者: 在做算法的巨巨 | 来源:发表于2018-08-16 20:39 被阅读0次

    数据源来自“tushare”的包,安装方法参考如下链接:https://pypi.org/project/tushare/

    提示:这只是个训练模型,技术不具备实际意义,入市需谨慎。


    首先调用tushare包

    import tushare as ts
    import pandas as pd
    import matplotlib.pyplot as plt
    

    查自己比较感兴趣的股票,这里我查找的是新能源/燃料电池/氢燃料,在数据库里查找下

    concept = ts.get_concept_classified()
    df = concept[concept.c_name=='燃料电池']
    

    我们就用金龙汽车作为我们的股票分析对象吧。

    data=ts.get_hist_data('600686')
    

    将开盘价open作为我们的分析对象,在这里截取了一段相对趋势唯一的数据作为train_data。并且选取了最后的一部分数据作为test_data。如下图。


    在导入数据的过程中遇到一个很奇怪的现象,那就是数据的行index是时间逆序排列,刚开始没注意,后来才发现,用DataFrame.sort_index()进行调整。

    data= ts.get_hist_data('600686', start='2016-09-13',end='2017-02-15').sort_index()
    testdata=ts.get_hist_data('600686',start='2017-02-16',end='2017-03-29').sort_index()
    plt.figure(figsize=(10,6))
    plt.plot(data.open, label='Raw')
    plt.legend(loc=0)
    

    我们想对该时间序列数据进行预测,我们需要先对该数据进行分析,判断它到底是不是平稳性数据。

    #使用ADF单位根检验法检验时间序列的稳定性
    #先做一个编译器
    def tagADF(t):
        result = pd.DataFrame(index=[
                "Test Statistic Value", "p-value", "Lags Used", 
                "Number of Observations Used", 
                "Critical Value(1%)", "Critical Value(5%)", "Critical Value(10%)"
            ],columns=['value']
        )
        result['value']['Test Statistic Value']=t[0]
        result['value']['p-value']=t[1]
        result['value']['Lags Used']=t[2]
        result['value']['Number of Observations Used'] = t[3]
        result['value']['Critical Value(1%)']=t[4]['1%']
        result['value']['Critical Value(5%)']=t[4]['5%']
        result['value']['Critical Value(10%)']=t[4]['10%']
        return result
    

    我们调用python的统计包

    import statsmodels.api as sm
    import statsmodels.tsa.stattools as sts
    

    这里会涉及到迪基-福勒检验的概念,后面我会抽时间补充这块知识。

    adf_Data = sts.adfuller(data.open)
    tagADF(adf_Data)
    

    我们的前提假设是该数据是非平稳性数据,从p-value上我们看出,有78.68%的可信度证明这条假设。

    接下来利用差分法构建平稳时间序列。

    diff = data[['open']].diff(1).dropna()
    plt.figure(figsize=(10,6))
    plt.plot(diff, label='Diff')
    plt.legend(loc=0)
    

    验证是否是平稳性数据,重复上面的动作

    adf_Data1 = sts.adfuller(diff.iloc[:,0])
    tagADF(adf_Data1)
    

    p-value很小,我们的假设失效,因此,diff数据序列符合平稳性要求。

    ic = sm.tsa.arma_order_select_ic(
        diff, 
        max_ar=4, 
        max_ma=2, 
        ic='hqic'
    )
    

    计算结果,order=(1,1)

    ARMAModel = sm.tsa.ARMA(diff, order).fit()
    
    delta = ARMAModel.fittedvalues - diff
    score = 1 - delta.var()/diff.var()
    
    plt.figure(figsize=(10, 6))
    plt.plot(diff, 'r', label='Raw')
    plt.plot(ARMAModel.fittedvalues, 'g',label='ARMA Model')
    plt.legend()
    

    遇到一个很诡异的事情,

    p = ARMAModel.predict(
        start='2017-02-16', 
        end='2017-03-29'
    )
    

    跑了四遍代码,重启了两遍kernel,还是不行
    试了一下数字index,将就着用吧

    p = ARMAModel.predict(
        start=98, 
        end=127
    )
    

    还原数据

    def revert(diffValues, *lastValue):
        for i in range(len(lastValue)):
            result = [];
            lv = lastValue[i];
            for dv in diffValues:
                lv = dv + lv
                result.append(lv)
            diffValues = result
        return diffValues;
    
    r = revert(p, data.open[-1])
    
    plt.figure(figsize=(10,6))
    plt.plot(r,'g',label='Predict')
    plt.plot(testdata.open,'r',label='Raw')
    plt.legend()
    

    相关文章

      网友评论

        本文标题:python时间序列预测股票走势

        本文链接:https://www.haomeiwen.com/subject/kgqnbftx.html