檔案建立日期: 2019/12/19
最後修訂日期: None
相關軟體資訊:
| Windows 10 | Python 3.7.2 | Numpy 1.17.3 | sklearn 0.21.3 |
| matplotlib 3.1.1 | pandas 0.25.1 | nltk 3.4.5 | hmmlearn 0.2.2 |
| pandas_datareader 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 可以定義為 ?=(?,?,?,?,?)
- 狀態 ( ?, States)
- 輸出符號 ( ?, Output symbols)
- 狀態轉移概率矩陣 ( ?, State Transition Probability Matrix )
- 觀察排放概率矩陣 ( ?, Observation Emission Probability Matrix)
- 前概率矩陣 ( ?, 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()
例 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/10到2109/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()