數據挖掘實戰之時間序列分析(比特幣趨勢預測)

本文在只考慮比特幣以往的歷史數據,不考慮其他外界相關的因素的前提下,通過構造ARMA時間序列模型,預測比特幣平均價格的走勢。

比特幣歷史數據源(從2012-01-01到2018-10-31)https://github.com/cystanford/bitcoin

1、加載數據

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from statsmodels.tsa.arima_model import ARMA
import warnings
warnings.filterwarnings('ignore')
from itertools import product
from datetime import datetime
#加載數據
df = pd.read_csv(r'C:\Users\hzjy\Desktop\bitcoin_2012-01-01_to_2018-10-31.csv')
#將時間作爲df的索引
df.Timestamp = pd.to_datetime(df.Timestamp)
df.index = df.Timestamp

2、採用數據可視化的方式查看比特幣的歷史走勢

按照不同的時間尺度(天,月,季度,年)可以將數據壓縮,得到不同尺度的數據,然後做可視化呈現。

#按照月、季度、年來統計
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()

3、構建ARMA時間序列模型

#設置參數範圍
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())

4、比特幣未來走勢的預測

#比特幣預測
df_month2 = df_month[['Weighted_Price']]
data_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 = data_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()

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章