PYTHON MAROV

HMM là một mô hình thống kê được sử dụng rộng rãi cho dữ liệu có tính liên tục và khả năng mở rộng như phân tích thị trường chứng khoán theo chuỗi thời gian, kiểm tra sức khỏe và nhận dạng giọng nói. Phần này đề cập chi tiết đến việc phân tích dữ liệu tuần tự bằng Mô hình Markov ẩn (HMM).

Mô hình Markov n (HMM)

HMM là một mô hình ngẫu nhiên được xây dựng dựa trên khái niệm chuỗi Markov dựa trên giả định rằng xác suất của các số liệu thống kê trong tương lai chỉ phụ thuộc vào trạng thái quy trình hiện tại chứ không phải bất kỳ trạng thái nào trước nó. Ví dụ, khi tung đồng xu, chúng ta không thể nói rằng kết quả của lần tung thứ năm sẽ là mặt ngửa. Điều này là do một đồng xu không có bất kỳ bộ nhớ nào và kết quả tiếp theo không phụ thuộc vào kết quả trước đó.

Về mặt toán học, HMM bao gồm các biến sau –

K (S)

Nó là một tập hợp các trạng thái ẩn hoặc tiềm ẩn có trong HMM. Nó được ký hiệu là S.

Ký hiu đầu ra (O)

Nó là một tập hợp các ký hiệu đầu ra có thể có trong HMM. Nó được ký hiệu là O.

Ma trn xác sut chuyn trng thái (A)

Đó là xác suất thực hiện quá trình chuyển đổi từ trạng thái này sang từng trạng thái khác. Nó được ký hiệu là A.

Ma trn xác sut phát x quan sát (B)

Đó là xác suất phát ra/quan sát một biểu tượng ở một trạng thái cụ thể. Nó được ký hiệu là B.

Ma trn xác sut trước (Π)

Đó là xác suất bắt đầu tại một trạng thái cụ thể từ các trạng thái khác nhau của hệ thống. Nó được ký hiệu là Π.

Do đó, một HMM có thể được định nghĩa là 𝝀 = (S,O,A,B,𝝅) ,

Ở đâu,

  • S = {s 1 ,s 2 ,…,s N } là tập N trạng thái có thể,
  • O = {o 1 ,o 2 ,…,o M } là tập M ký hiệu quan sát có thể,
  • A là một N𝒙N ma trận xác suất chuyển trạng thái (TPM),
  • B là quan sát N𝒙M hoặc Ma trận xác suất phát thải (EPM),
  • π là một vectơ phân phối xác suất trạng thái ban đầu N chiều.

Ví d: Phân tích d liu Th trường chng khoán

Trong ví dụ này, chúng ta sẽ phân tích dữ liệu của thị trường chứng khoán, từng bước một, để có ý tưởng về cách HMM hoạt động với dữ liệu tuần tự hoặc chuỗi thời gian. Xin lưu ý rằng chúng tôi đang triển khai ví dụ này bằng Python. Nhập các gói cần thiết như hình dưới đây

import datetime
import warnings

Bây giờ, hãy sử dụng dữ liệu thị trường chứng khoán từ gói matpotlib.finance , như được hiển thị ở đây

import numpy as np
from matplotlib import cm, pyplot as plt
from matplotlib.dates import YearLocator, MonthLocator
try:
   from matplotlib.finance import quotes_historical_yahoo_och1
except ImportError:
   from matplotlib.finance import (
      quotes_historical_yahoo as quotes_historical_yahoo_och1)

from hmmlearn.hmm import GaussianHMM

Tải dữ liệu từ ngày bắt đầu và ngày kết thúc, nghĩa là giữa hai ngày cụ thể như được hiển thị ở đây

start_date = datetime.date(1995, 10, 10)
end_date = datetime.date(2015, 4, 25)
quotes = quotes_historical_yahoo_och1('INTC', start_date, end_date)

Trong bước này, chúng tôi sẽ trích xuất các báo giá đóng mỗi ngày. Đối với điều này, sử dụng lệnh sau –

closing_quotes = np.array([quote[2] for quote in quotes])

Bây giờ, chúng tôi sẽ trích xuất khối lượng cổ phiếu được giao dịch mỗi ngày. Đối với điều này, sử dụng lệnh sau –

volumes = np.array([quote[5] for quote in quotes])[1:]

Tại đây, lấy phần trăm chênh lệch của giá cổ phiếu đóng cửa, sử dụng mã hiển thị bên dưới

diff_percentages = 100.0 * np.diff(closing_quotes) / closing_quotes[:-]
dates = np.array([quote[0] for quote in quotes], dtype = np.int)[1:]
training_data = np.column_stack([diff_percentages, volumes])

Trong bước này, hãy tạo và huấn luyện Gaussian HMM. Đối với điều này, sử dụng đoạn mã sau

hmm = GaussianHMM(n_components = 7, covariance_type = 'diag', n_iter = 1000)
with warnings.catch_warnings():
   warnings.simplefilter('ignore')
   hmm.fit(training_data)

Bây giờ, tạo dữ liệu bằng mô hình HMM, sử dụng các lệnh được hiển thị –

num_samples = 300
samples, _ = hmm.sample(num_samples)

Cuối cùng, trong bước này, chúng ta vẽ đồ thị và trực quan hóa phần trăm chênh lệch và khối lượng cổ phiếu được giao dịch dưới dạng đầu ra dưới dạng biểu đồ. Sử dụng đoạn mã sau để vẽ đồ thị và trực quan hóa tỷ lệ phần trăm chênh lệch

plt.figure()
plt.title('Difference percentages')
plt.plot(np.arange(num_samples), samples[:, 0], c = 'black')

Sử dụng đoạn mã sau để vẽ sơ đồ và trực quan hóa khối lượng cổ phiếu được giao dịch

plt.figure()
plt.title('Volume of shares')
plt.plot(np.arange(num_samples), samples[:, 1], c = 'black')
plt.ylim(ymin = 0)
plt.show()

Xem thêm : AI với Python – Nhận dạng giọng nói

Trả lời