MỤC LỤC
Mô hình LSTM (Long Short-Term Memory) hay còn gọi là mạng nơ-ron ngắn hạn dài hạn là một loại mạng nơ-ron tuần hoàn (RNN) được phát triển để giải quyết vấn đề biến mất gradient (vanishing gradient problem) trong các mạng RNN thông thường. LSTM sử dụng cơ chế tế bào nhớ với các đơn vị gating để điều khiển lưu lượng thông tin, giúp mạng có thể học tập và lưu giữ thông tin trong thời gian dài. Cổng ra (Output Gate): Xác định thông tin từ trạng thái tế bào được truyền đến tế bào tiếp theo và lớp đầu ra.
Dự báo chuỗi thời gian: Dự đoán các giá trị trong tương lai của dữ liệu chuỗi thời gian, chẳng hạn như giá cổ phiếu, kiểu thời tiết hoặc số liệu bán hàng.
Việc lựa chọn phương pháp đánh giá phù hợp phụ thuộc vào mục đích đánh giá và đặc điểm của tập dữ liệu. ● R-squared: Thích hợp khi ta muốn đánh giá mối quan hệ tuyến tính giữa giá trị dự đoán và giá trị thực tế. ● MAE: Thích hợp khi ta muốn đánh giá mức độ sai số trung bình giữa giá trị dự đoán và giá trị thực tế.
● MAPE: Thích hợp khi ta muốn đánh giá mức độ sai số phần trăm trung bình giữa giá trị dự đoán và giá trị thực tế, đặc biệt khi giá trị thực tế có thể có giá trị lớn.
Ngày: Kiểu dữ liệu datetime64[ns], có nghĩa là lưu trữ thông tin về ngày tháng. Đóng cửa, Mở cửa, Cao nhất, Thấp nhất: Các cột này đều có kiểu dữ liệu object. Điều này cho thấy các giá trị trong các cột này không phải là số thực (float) mà có thể là chuỗi (string) chứa các ký tự đặc biệt hoặc có định dạng không chuẩn.
Dữ liệu không bị thiếu: Tất cả các cột đều có 2505 giá trị không null, nghĩa là không có giá trị nào bị thiếu trong bộ dữ liệu. Cột này chứa thông tin về thời gian, cụ thể là ngày giao dịch chứng khoán. Tuy nhiên, giá trị này không mang nhiều ý nghĩa thực tiễn vì ngày tháng không thể tính trung bình theo cách thông thường.
Điều này cho thấy dữ liệu có sự phân bố không đều, với mật độ ngày giao dịch tăng dần theo thời gian.
Bằng cách đặt các biến lên cùng một biểu đồ, chúng ta có thể thấy được mối tương quan hoặc khác biệt giữa chỳng. Nhóm sử dụng biểu đồ scatter matrix - một công cụ hữu ích để hiểu mối quan hệ giữa các cặp biến trong bộ dữ liệu. Mỗi điểm trên biểu đồ thể hiện một cặp giá trị từ hai biến khác nhau, và việc phân tán của các điểm có thể giúp phát hiện các mô hình, xu hướng hoặc sự tương quan giữa chúng.
`pd.plotting.scatter_matrix()` được nhóm sử dụng để vẽ biểu đồ scatter matrix từ DataFrame `df` với kích thước 12x8 inches. Điều này sẽ hiển thị một ma trận các biểu đồ scatter plot, mỗi cặp biến sẽ có một biểu đồ riêng, và các trục của các biểu đồ sẽ hiển thị các giá trị của các biến tương ứng. Biểu đồ Scatter Matrix cho thấy mối quan hệ tương quan dương mạnh giữa giá đóng cửa, mức cao nhất và mức thấp nhất.
Giá trị ngoại lệ: Biểu đồ Boxplot cho thấy có một số giá trị ngoại lệ trong các biến Đóng cửa, Mở cửa, Cao nhất và Thấp nhất. Điều này cho thấy rằng có nhiều giá trị tập trung ở nửa trên của biểu đồ đối với biến Cao nhất và nửa dưới của biểu đồ đối với biến Thấp nhất. Biến Đóng cửa và Mở cửa có phân bố đối xứng và sự lan rộng trung bình, trong khi biến Cao nhất và Thấp nhất có phân bố không đối xứng và sự lan rộng lớn.
Theo biểu đồ, độ chênh lệch giữa giá đóng cửa và giá mở cửa của cổ phiếu Vinamilk nhìn chung là không đáng kể. Nhóm sử dụng biểu đồ cột để hiển thị và so sánh các giá trị của các biến dữ liệu không liên tục (discrete variables). Sử dụng `plt.bar()` để vẽ biểu đồ cột, với trục x là các năm (`df_yearly.index`) và trục y là giá đóng cửa trung bình tương ứng.
Sử dụng `average_close_price_by_quarter.plot(kind='bar', color='blue')` để vẽ biểu đồ cột cho giá trung bình đóng cửa của các quý trong năm 2021.
`df1.index = df1.Ngày`: Gán cột 'Ngày' của DataFrame mới `df1` làm chỉ số (index) của DataFrame, điều này có nghĩa là cột 'Ngày' sẽ được sử dụng để chỉ mục các dòng trong DataFrame thay vì chỉ mục mặc định từ 0 đến n-1. Tham số `axis=1` chỉ ra rằng ta muốn loại bỏ một cột, và `inplace=True` cho phép thực hiện thay đổi trực tiếp trên DataFrame `df1` thay vì tạo ra một bản sao mới. `data = df1.values`: Chuyển DataFrame `df1` thành một mảng NumPy, trong đó mỗi hàng của DataFrame trở thành một mảng con (array) trong mảng NumPy.
Bước 2: Phương thức `transform` sẽ áp dụng các tham số đã tính được từ bước trước vào dữ liệu (`data`), biến đổi nó sao cho nằm trong khoảng [0, 1]. `len(train_data)`, ta lấy 50 giá trị đóng cửa từ dữ liệu chuẩn hóa (`sc_train`) và thêm chúng vào danh sách `x_train`, sau đó lấy giá trị đóng cửa của ngày tiếp theo và thêm vào danh sách. Điều này làm cho dữ liệu đầu vào phù hợp với đầu vào của một mô hình LSTM, trong đó cần có kích thước (số mẫu, số lượng bước thời gian, số lượng đặc trưng).
Đây là lớp đầu tiên trong mạng, nó nhận đầu vào có kích thước `(x_train.shape[1], 1)` (số lượng bước thời gian trong mỗi mẫu và số lượng đặc trưng là 1), và trả về chuỗi các đầu ra (return_sequences=True). `best_model = ModelCheckpoint(save_model, monitor='loss', verbose=2, save_best_only=True, mode='auto')`: Đây là một callback trong Keras để lưu lại trọng số của mô hình có hiệu suất tốt nhất dựa trên giá trị của hàm mất mát. `y_train = sc.inverse_transform(y_train)`: Dùng để chuyển đổi lại giá trị dự đoán từ dạng chuẩn hóa về dạng ban đầu để có thể so sánh với giá trị thực tế.
`final_model = load_model("/content/drive/MyDrive/Big data/save_model.hdf5")`: Dùng để tải mô hình đã được lưu trữ sau quá trình huấn luyện. `y_train_predict = sc.inverse_transform(y_train_predict)`: Chuyển đổi lại giá trị dự đoán từ dạng chuẩn hóa về dạng ban đầu để có thể so sánh với giá trị thực tế.
`y_train_predict = final_model.predict(x_train)`: Sử dụng mô hình đã được tải để dự đoán giá đóng cửa trên tập dữ liệu đã huấn luyện. Tiếp theo, chuẩn bị dữ liệu kiểm tra (`x_test`) bằng cách chia thành các cửa sổ có độ dài 50 giá trị giống như quá trình chuẩn bị dữ liệu huấn luyện. `y_test_predict = sc.inverse_transform(y_test_predict)`: Chuyển đổi lại giá trị dự đoán từ dạng chuẩn hóa về dạng ban đầu để có thể so sánh với giá trị thực tế.
Các đường màu đỏ là giá trị thực tế, đường màu xanh lá cây là giá trị dự đoán trên tập huấn luyện và đường màu xanh dương là giá trị dự đoán trên tập kiểm tra. ⇒ Dựa trên phân tích biểu đồ so sánh giá dự đoán và giá thực tế của cổ phiếu Vinamilk, có thể nhận thấy mô hình dự đoán giá cổ phiếu có hiệu quả tương đối tốt. Độ phù hợp được tính bằng hàm `r2_score`, nó đo lường mức độ phù hợp giữa dữ liệu thực tế và dữ liệu dự đoán bởi mô hình trên tập huấn luyện và test.
`mean_absolute_error`, nó đo lường độ lớn trung bình của sự chênh lệch giữa giá trị thực tế và giá trị dự đoán trên tập huấn luyện và test. Phần trăm sai số tuyệt đối trung bình (MAPE) được tính bằng hàm `mean_absolute_percentage_error`, nó đo lường tỉ lệ phần trăm trung bình của sai số tuyệt đối giữa giá trị thực tế và giá trị dự đoán trên tập huấn luyện và test. Đánh giá chung: Mô hình đạt được độ chính xác cao trên cả tập huấn luyện và tập kiểm tra, được đo bằng các chỉ số như R^2, sai số tuyệt đối trung bình và phần trăm sai số tuyệt đối.
● Sử dụng các mô hình học máy khác: Cân nhắc tthử nghiệm các mô hình học máy khác như RNN, CNN hoặc các mô hình kết hợp để tìm ra mô hình phù hợp nhất cho bài toán dự đoán giá cổ phiếu. ● Kết hợp với phân tích cơ bản: Kết hợp mô hình học máy với phân tích cơ bản có thể giúp đưa ra dự đoán chính xác hơn, đồng thời cung cấp thêm thông tin để ra quyết định đầu tư.