人工智慧 (07) 時間序列資料分析

Jason990420發表於2019-12-19

檔案建立日期: 2019/12/19
最後修訂日期: None
相關軟體資訊:

Win 10 Python 3.7.2 Numpy 1.17.3 sklearn 0.21.3
matplotlib 3.1.1 pandas 0.21.1 nltk 3.4.5 hmmlearn 0.2.2
pandas_reader 0.8.1 yfinance 0.1.52

參考檔案: AI with Python Tutorial

說明: 所有內容歡迎引用, 只需註明來源及作者, 本文內容如有錯誤或用詞不當, 敬請指正.

標題: 人工智慧 (07) 時間序列資料分析

時間序列資料分析 ( Time Series Data )

時間序列資料是指一系列特定時間間隔中的資料。
序列分析 ( Sequence Analysis ) 或 時間序列分析 ( Time Series Analysis )

分析順序資料 - 隱馬爾可夫模型(HMM, Hidden Markov Model)

一種基於馬爾可夫鏈概念的隨機統計模型, 前提是未來統計資訊的機率僅取決於當前流程狀態,而不取決於其之前的任何狀態。HMM 可以定義為 ?=(?,?,?,?,?)

  1. 狀態 ( ?, States)
  2. 輸出符號 ( ?, Output symbols)
  3. 狀態轉移機率矩陣 ( ?, State Transition Probability Matrix )
  4. 觀察排放機率矩陣 ( ?, Observation Emission Probability Matrix)
  5. 前機率矩陣 ( ?, Prior Probability Matrix )

例 1. 時間序列資料

# -----------------------------------------------------------------------------
# Handling time series data
# -----------------------------------------------------------------------------

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

def read_data():
    input_data = np.array([[2017,  1,  0.94197000],[2017,  2,  0.33986000],
                           [2017,  3,  1.36540000],[2017,  4, -0.08865800],
                           [2017,  5, -0.73014000],[2017,  6,  0.40166000],
                           [2017,  7,  0.63423000],[2017,  8,  0.15004000],
                           [2017,  9, -0.49245000],[2017, 10,  0.69034000],
                           [2017, 11, -0.07757300],[2017, 12, -0.05897800],
                           [2018,  1, -0.28084000],[2018,  2,  0.11273000],
                           [2018,  3, -0.94112000],[2018,  4,  0.54391000],
                           [2018,  5,  1.17960000],[2018,  6,  0.37988000],
                           [2018,  7,  0.61175000],[2018,  8,  0.83607000],
                           [2018,  9,  0.58451000],[2018, 10,  0.41277000],
                           [2018, 11, -1.11620000],[2018, 12,  0.10973000],
                           [2019,  1, -0.71320000],[2019,  2,  1.14950000],
                           [2019,  3,  2.11610000],[2019,  4, -0.25531000],
                           [2019,  5, -1.23130000],[2019,  6, -0.60129000],
                           [2019,  7, -0.88969000],[2019,  8, -0.72177000],
                           [2019,  9,  0.30620000],[2019, 10, -0.08219500],
                           [2019, 11, -1.19340000]])

    # 建立一個時間的索引, 2017-01開始, 週期為資料筆數, 以月為間隔
    dates = pd.date_range(start='2017-01', periods=len(input_data), freq='M')
    # 將輸入資料第3欄資料, 轉換成有時間卷標的一維陣列
    output = pd.Series(input_data[:, 2], index=dates)

    return output

# You can find lot of methods for timeseries by Pandas
timeseries = read_data()            # 載入資料集
timeseries['2018':'2018'].plot()    # 只畫2018年
plt.show()

人工智慧 (07) 時間序列資料分析

例 2. 股市資料分析

# -----------------------------------------------------------------------------
# Analysis of Stock Market data by HMM
# -----------------------------------------------------------------------------

import datetime
import warnings
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.dates import YearLocator, MonthLocator
from hmmlearn.hmm import GaussianHMM
from pandas_datareader import data as pdr
import yfinance as yf
import datetime

# 從YAHOO讀取英特爾(INTC)股市資料,1995/10/102109/12/19
stocks = ["INTC"]
start_date = datetime.date(1995, 10, 10)
end_date = datetime.date(2019, 12, 19)
quotes = pdr.get_data_yahoo(stocks,start=start,end=end)

closing_quotes = np.array(quotes['Close'])  # 當日收盤價
volumes = np.array(quotes['Volume'])        # 當日交易量

# 收盤價波動比率
diff_percentages = 100.0 * np.diff(closing_quotes) / closing_quotes[:-1]
# 訓練資料集為 - 收盤價波動比率 & 當日交易量
training_data = np.column_stack([diff_percentages, volumes[:-1]])

# 使用高斯發射的隱馬爾可夫模型
hmm = GaussianHMM(n_components=7, covariance_type='diag', n_iter=1000)
# 隱去所有的警訊
with warnings.catch_warnings():
    warnings.simplefilter('ignore')
    hmm.fit(training_data)

# 輸出交易股票的價差百分比和交易量
num_samples = 300
samples, _ = hmm.sample(num_samples)

# 畫圖
plt.figure()
plt.subplot(121)
plt.title('Difference percentages')
plt.plot(np.arange(num_samples), samples[:, 0], c='black')
plt.subplot(122)
plt.title('Volume of shares')
plt.plot(np.arange(num_samples), samples[:, 1], c='black')
plt.ylim(ymin=0)

plt.show()

人工智慧 (07) 時間序列資料分析

本作品採用《CC 協議》,轉載必須註明作者和本文連結
Jason Yang

相關文章