UEH UNIVERSITY
UEH COLLEGE OF TECHNOLOGY AND DESIGNUEH INSTITUTE OF INNOVATION
ĐỒ ÁN CUỐI KỲMôn học: Lập trình căn bản
ĐỀ TÀI: PHÂN TÍCH VÀ DỰ ĐOÁN THỊ TRƯỜNGCHỨNG KHOÁN BẰNG PHƯƠNG PHÁP HỒI QUY
Trang 2DANH SÁCH THÀNH VIÊN VÀ NHIỆM VỤ
Trang 3MỤC LỤC
DANH MỤC BẢNG BIỂU
CHƯƠNG 1 TỔNG QUAN ĐỀ TÀI
1.1 Giới thiệu đề tài
1.2 Phương pháp nghiên cứu
CHƯƠNG 2 HIỆN THỰC ĐỀ TÀI
2.1 Mô tả thuật toán
2.1.1 Nhập các thư viện cần thiết
2.1.2 Lấy dữ liệu và chuyển dữ liệu thành bảng hoàn chỉnh
2.1.2.1 Lấy dữ liệu về giá cổ phiếu
2.1.2.2 Chuyển dữ liệu thành bảng dữ liệu hoàn chỉnh
2.1.3 Khởi tạo danh sách cổ phiếu, thiết lập thời gian và tải dữ liệu cổ phiếu
2.1.3.1 Khởi tạo danh sách cổ phiếu
2.1.3.2 Kết hợp dữ liệu và mô tả dữ liệu
2.1.3.3 Chuẩn hóa dữ liệu
2.1.4 Chia dữ liệu theo dãy thời gian thành các tập huấn luyện và kiểm thử
2.1.5 Tính hệ số và điểm giao của đường thẳng tuyến tính
2.1.6 Vẽ biểu đồ scatter plot và đường thẳng tuyến tính
2.1.7 Vẽ biểu đồ thể hiện Closing price
2.1.8 Vẽ biểu đồ số lượng giao dịch
2.1.9 Vẽ đường trung bình động
2.1.10 Chia dữ liệu thành tập huấn luyện và tập kiểm tra
2.1.11 Tạo và huấn luyện mô hình
2.1.12 Dự đoán và đánh giá
2.1.13 Trực quan hóa dữ liệu (Vẽ biểu đồ)
2.1.14 Xây dựng mô hình Random Forest
2.1.15 Các số đo đánh giá mô hình
2.2 Tổng hợp các kết quả (Biểu đồ)
CHƯƠNG 3 KẾT QUẢ VÀ HƯỚNG PHÁT TRIỂN
3.1 Kết quả nghiên cứu
Trang 4DANH MỤC BẢNG BIỂU
Bảng 1 Model Summary
Bảng 2 Bảng biểu thị giá đóng cửa đã được điều chỉnh của Apple Bảng 3 Bảng số lượng giao dịch trong ngày của Apple
Bảng 4 Bảng đường trung bình động (MA)
Bảng 5 Phân tích và dự đoán giá cổ phiếu AAPL
Trang 5CHƯƠNG 1 TỔNG QUAN ĐỀ TÀI
1.1 Giới thiệu đề tài
Đầu tư chứng khoán là một trong những xu hướng kiếm tiền khá phổ biến hiện nay với đa dạng các cổ phiếu, trái phiếu, quỹ mở, từ các công ty trên toàn cầu Và các sàn giao dịch chứng khoán luôn được cho là rất khó dự đoán cũng như có rất nhiều rủi ro bất ngờ khi đầu tư với số tiền lớn Chính vì vậy mà các bài toán về việc dự đoán xu hướng của thị trường chứng khoán luôn là điểm quan tâm của các nhà đầu tư, các chuyên gia kinh tế học Và một trong những lý do khiến thị trường chứng khoán thu hút nhiều sự quan tâm đến từ các nhà đầu tư hay các chuyên gia kinh tế chính bởi sự phát triển vô cùng mạnh mẽ của nó Đồng thời, sự phát triển nhanh chóng của công nghệ thông tin giúp cho việc giao dịch và lưu trữ dữ liệu chứng khoán trở nên ngày một dễ dàng hơn Người dùng có thể dễ dàng tra cứu xu hướng tăng giảm của các mã cổ phiếu mà họ quan tâm một cách thường xuyên và dễ dàng
Dự báo giá cổ phiếu luôn là một bài toán đau đầu của rất nhiều người vì sự khó đoán của nó Nhưng ngày nay với các dữ liệu khổng lồ được khai thác từ các sàn giao dịch đã phần nào giúp cho việc nghiên cứu và dự đoán xu hướng tăng giảm của các mã cổ phiếu trở nên thuận tiện hơn Bằng sự phân tích kỹ lưỡng qua các thông số thống kê từ giá cổ phiếu phản ánh được xu hướng vận động quan trọng của chứng khoán Từ xu hướng vận động đó, chúng ta có thể đánh giá các dữ liệu một cách hiệu quả hơn Và một trong những khó khăn của việc dự đoán giá cổ phiếu chính là sự tác động từ nhiều yếu tố bên ngoài cũng như bị ảnh hưởng bởi nền kinh tế ở mỗi khu vực và quốc gia khác nhau Và bằng việc nghiên cứu, nhìn nhận và phân tích thị trường cũng là một trong những yếu tố quan trọng trong việc phân tích chứng khoán và đưa ra những nhận định phù hợp với tình thời điểm giúp các nhà đầu tư có thêm những cái nhìn khái quát hơn về xu hướng tăng hay giảm của cổ phiếu.
1.2 Phương pháp nghiên cứu
Thị trường chứng khoán được nhìn nhận là một kênh đầu tư cực kỳ tiềm năng hiện nay, nơi cung cấp các sản phẩm đầu tư phong phú, giúp giảm thiểu rủi ro nhờ sự đa dạng hóa danh mục đầu tư
Mô hình hồi quy tuyến tính là một công cụ đơn giản với các ứng dụng trong nhiều lĩnh vực không chỉ trong lĩnh vực thống kê mà trong tất cả các lĩnh vực cần quan tâm đến ước lượng và dự báo, đặc biệt đối với các nghiên cứu trong lĩnh vực chứng khoán
Trang 6Phương pháp Hồi quy tuyến tính:
Hồi quy tuyến tính là một kỹ thuật phân tích dữ liệu dự đoán giá trị của dữ liệu không xác định bằng cách sử dụng giá trị dữ liệu liên quan và đã biết khác Nó mô hình hóa toán học biến không xác định hoặc phụ thuộc và biến đã biết hoặc độc lập như một phương trình tuyến tính Ở đồ án này, kỹ thuật Hồi quy tuyến tính phân tích dữ liệu là giá cổ phiếu trong quá khứ để dự đoán giá cổ phiếu của tương lai.
Các mô hình hồi quy tuyến tính tương đối đơn giản và cung cấp một công thức toán học dễ giải thích để đưa ra các dự đoán Hồi quy tuyến tính là một kỹ thuật thống kê được sử dụng từ lâu và áp dụng dễ dàng cho phần mềm và tính toán Các doanh nghiệp sử dụng nó để chuyển đổi dữ liệu thô một cách đáng tin cậy và có thể dự đoán được thành nghiệp vụ thông minh và thông tin chuyên sâu hữu ích Các nhà khoa học trong nhiều lĩnh vực, bao gồm sinh học và các ngành khoa học hành vi, môi trường, và xã hội, sử dụng hồi quy tuyến tính để tiến hành phân tích dữ liệu sơ bộ và dự đoán các xu hướng tương lai Nhiều phương pháp khoa học dữ liệu, chẳng hạn như máy học và trí tuệ nhân tạo, sử dụng hồi quy tuyến tính để giải quyết các bài toán phức tạp.
Công thức chung của của phương trình Hồi quy tuyến tính là Y = a + bX, trong đó Y là biến phụ thuộc, X là biến độc lập, a là hệ số góc (hằng số) và b là hệ số chặn (biến số) Để tìm giá trị a, ta chia hiệp phương sai của X và Y cho phương sai của X Để tìm b, ta lấy giá trị trung bình của Y trừ đi tích của hệ số góc và giá trị trung bình của X Sau khi tìm được hệ số a, b, ta sử dụng phương trình hồi quy để dự đoán giá trị của biến phụ thuộc (Y) dựa trên giá trị của biến độc lập (X).
Trang 7CHƯƠNG 2 HIỆN THỰC ĐỀ TÀI
2.1 Mô tả thuật toán
2.1.1 Nhập các thư viện cần thiết
importmatplotlib.pyplotaspltfromnumpyimport arange
frompandasimport read_csv
fromsklearn.model_selectionimportTimeSeriesSplitfromsklearn.ensembleimportRandomForestRegressorfromsklearn.preprocessingimportMinMaxScaler
fromsklearn.model_selectionimportRandomizedSearchCVfromsklearn.model_selectionimport train_test_split
fromsklearn.metricsimport confusion_matrix, accuracy_score
from pandas_datareader.data import DataReader
from pandas_datareader import data as pdr
Các thư viện nhóm đã sử dụng:
● import yfinance as yf: tải dữ liệu tài chính.
● import datetime as dt: xử lý ngày tháng và thời gian
● import pandas as pd: thư viện pandas để thao tác và phân tích dữ liệu ● import numpy as np: thư viện numpy để thực hiện tính toán số
● import seaborn as sns: tạo biểu đồ thống kê ● import matplotlib.pyplot as plt: tạo biểu đồ.
● from numpy import arange: tạo ra các giá trị cách đều nhau trong một khoảng cụ thể.
● from pandas import read_csv: đọc dữ liệu từ file CSV ● from sklearn import metrics: đánh giá hiệu suất mô hình.
● from sklearn.model_selection import TimeSeriesSplit: Import lớp TimeSeriesSplit từ thư viện scikit-learn để tạo các tập chia theo thời gian trong dữ liệu chuỗi thời gian cho xác thực chéo.
Trang 8● from sklearn.ensemble import RandomForestRegressor: Import lớp RandomForestRegressor từ thư viện scikit-learn để tạo mô hình hồi quy
● from sklearn.preprocessing import MinMaxScaler: Import lớp MinMaxScaler từ thư viện scikit-learn để chuẩn hóa dữ liệu giữa 0 và 1.
● from sklearn.model_selection import RandomizedSearchCV: Import lớp RandomizedSearchCV từ thư viện scikit-learn để thực hiện điều chỉnh siêu tham số ngẫu nhiên.
● from sklearn.linear_model import LinearRegression: Import lớp LinearRegression từ mô-đun linear_model của thư viện scikit-learn để xây dựng mô hình hồi quy tuyến tính.
● from sklearn.metrics import confusion_matrix, accuracy_score: Import các hàm confusion_matrix và accuracy_score từ mô-đun metrics của thư viện scikit-learn.
● confusion_matrix: Tính toán ma trận nhiễu loạn (confusion matrix) để đánh giá hiệu suất của mô hình phân loại.
● accuracy_score: Tính toán độ chính xác (accuracy) của mô hình phân loại.
● from pandas_datareader.data import DataReader: Import hàm DataReader từ mô-đun data của thư viện pandas_datareader để tải dữ liệu tài chính từ các nguồn trực tuyến.
● from pandas_datareader import data as pdr: Import alias pdr cho mô-đun data của thư viện pandas_datareader giúp sử dụng cú pháp pdr.DataReader thay cho pandas_datareader.data.DataReader.
● from datetime import datetime: Import datetime từ thư viện datetime để làm việc với ngày tháng và thời gian.
2.1.2 Lấy dữ liệu và chuyển dữ liệu thành bảng hoàn chỉnh2.1.2.1 Lấy dữ liệu về giá cổ phiếu
start_date = input("Nhập ngày bắt đầu lấy dữ liệu (yyyy-mm-dd): ")end_date = dt.datetime.now().strftime("%Y-%m-%d")
data = yf.download("AAPL", start = start_date, end = end_date)
print("Dữ liệu chứng khoán AAPL từ ngày ",start_date," đến",end_date,":")
Nhóm đã thực hiện:
● Lấy dữ liệu (do người dùng nhập) ngày bắt đầu và lưu vào biến start_date, dữ liệu kết thúc là thời gian hiện tại và lưu vào biến end_date.
Trang 9● Dùng hàm yf.download để tải dữ liệu chứng khoán của Apple (AAPL) từ Yahoo Finance và lưu trữ dữ liệu trong biến data.
2.1.2.2 Chuyển dữ liệu thành bảng dữ liệu hoàn chỉnh
sp500_df = pd.DataFrame(data)sp500_df.to_csv("data.csv")
read_df = pd.read_csv("data.csv")
read_df.set_index("Date", inplace=True)
Nhóm đã thực hiện các lệnh: Tạo DataFrames: sp500_df = pd.DataFrame(data) và chuyển đổi dữ liệu trong biến data thành một DataFrame (một cấu trúc dữ liệu dạng bảng hai chiều, tương tự như một bảng tính) của thư viện pandas, lưu trữ trong biến sp500_df
● Lưu trữ dữ liệu vào một file CSV tên "data.csv": sp500_df.to_csv("data.csv") ● read_df = pd.read_csv("data.csv") sử dụng để đọc dữ liệu từ file CSV
"data.csv", lưu trữ vào file read_df
● Thiết lập cột "Date" (Ngày) làm chỉ mục (index) của DataFrame để dễ dàng truy cập dữ liệu theo ngày
● In ra 5 dòng đầu tiên để kiểm tra nhanh nội dung dữ liệu
Chọn biến x làm biến độc lập, khởi tạo danh sách gồm các giá trị "Open" (Giá mở cửa), "High" (Giá cao nhất), và "Low" (Giá thấp nhất) và lưu vào biến x Chọn biến y làm biến phụ thuộc Danh sách gồm giá trị Close và lưu vào biến y.
2.1.3 Khởi tạo danh sách cổ phiếu, thiết lập thời gian và tải dữ liệu cổ phiếu2.1.3.1 Khởi tạo danh sách cổ phiếu
tech_list= ['AAPL']
forstockintech_list:
Trang 10globals()[stock] =yf.download(stock, start_date, end_date)
company_list [AAPL]
company_name ["AAPL"]
forcompany, com_nameinzip(company_list, company_name): company["company_name"] =com_name
Nhóm khởi tạo danh sách tech_list chứa tên mã cổ phiếu “AAPL” (Apple) Nhóm dùng vòng lặp for để duyệt qua từng dữ liệu cổ phiếu, sử dụng hàm download từ thư viện yfinance để tải dữ liệu cổ phiếu trong khoảng thời gian từ start_date đến end_date Sau đó, nhóm thêm tên công ty tương ứng vào DataFrame của từng cổ phiếu: duyệt hai danh sách company_list và company_name song song bằng hàm zip, thêm một cột mới tên “company_name” vào DataFrame và gán vào biến com_name.
2.1.3.2 Kết hợp dữ liệu và mô tả dữ liệu
df=pd.concat(company_list, axis=)
print(AAPL.describe())AAPL.info()
Nhóm sử dụng hàm concat từ thư viện pandas để kết hợp các DataFrame trong danh sách company_list thành một DataFrame mới, lưu vào biến df Sau đó, nhóm in các thống kê dữ liệu tóm tắt (count, mean, std, ), các thông tin chi tiết (kiểu dữ liệu, số lượng giá trị Non-Null: bao nhiêu ô chứa giá trị thực tế) của DataFrame.
Kết quả:
2.1.3.3 Chuẩn hóa dữ liệu
Xscaler.fit_transform(read_df[['Open', 'High', 'Low', 'Close']])
X=pd.DataFrame(columns='Open', 'High', 'Low', 'Close'], data=,
index=read_df.index)print(Xhead())
Vì dữ liệu có các giá trị và thang đo khác nhau nên cần phải chuẩn hóa dữ liệu, giúp các thuật toán học máy hoạt động hiệu quả hơn Vì vậy, nhóm đã tạo ra một đối tượng
Trang 11scaler thuộc lớp MinMaxScaler để chuẩn hóa dữ liệu thành dữ liệu có giá trị trong khoảng từ 0 đến 1
Nhóm tiến hành chọn 4 cột “Open”, “High”, “Low” và “Close”; dùng phương thức fit_transform để tính toán các tham số cần thiết cho việc chuẩn hóa dựa trên dữ liệu đầu vào là 4 cột giá (Open, High, Low, Close); sau đó lưu trữ dữ liệu đã được chuẩn hóa vào biến X
Cuối cùng, nhóm tạo DataFrame mới tên X từ dữ liệu đã chuẩn hóa (giá trị nằm trong khoảng từ 0 đến 1) với các cột như DataFrame ban đầu (Open, High, Low, Close); sử dụng chỉ mục cho DataFrame mới để dữ liệu được chuẩn hóa giữ được mối liên hệ với ngày tháng tương ứng trong dữ liệu gốc
Kết quả in ra 5 dòng đầu tiên:
2.1.4 Chia dữ liệu theo dãy thời gian thành các tập huấn luyện và kiểm thử
fortrain_index, test_index in timesplit.split():
X_train, X_test.iloc[train_index], Xiloc[test_index] y_train, y_test.iloc[train_index], yiloc[test_index]
Đầu tiên, nhóm khởi tạo đối tượng timesplit Lớp TimeSeriesSplit được sử dụng để chia dữ liệu theo dãy thời gian (time series) cho việc đánh giá chéo (cross-validation) trong các bài toán học máy Tham số n_splits=10 thiết lập số lượng phân chia của dữ liệu Trong trường hợp này, dữ liệu sẽ được chia thành 10 phần.
Vòng lặp for lặp qua các cách chia dữ liệu khác nhau (10 lần) Bên trong vòng lặp, các phần tử của DataFrame X (dữ liệu đã chuẩn hóa) và cột y (giá đóng cửa) được trích xuất riêng rẽ cho tập huấn luyện và kiểm thử Qua đó, mô hình có thể được huấn luyện trên nhiều tập hợp dữ liệu con khác nhau để đánh giá hiệu suất một cách đáng tin cậy
Trang 12m (N*np.sum(*)np.sum(x*np.sum())/Nnp.sum(x**2-np.sum()**2))
Đầu tiên, nhóm trích xuất các cột "Open" và "Close" từ DataFrame X và chuyển đổi chúng thành mảng NumPy bằng cách sử dụng values Sau đó, nhóm tính toán số lượng điểm dữ liệu (N) bằng cách truy cập chiều đầu tiên ([0]) của thuộc tính hình
■ np.sum(x**2): Tính tổng bình phương của các phần tử trong x.
■ N: Số lượng điểm dữ liệu (đã được tính toán trước đó).
● Hệ số chặn b:
b = (np.sum(y)-m*np.sum(x))/N:
● x_min = np.min(x): tìm giá trị tối thiểu (x_min) trong mảng x.
● y_min = m*x_min+b: tính toán tọa độ y (y_min) tương ứng với giá trị x tối thiểu (x_min) bằng cách sử dụng phương trình đường thẳng phù hợp nhất (hệ số góc m và hệ số chặn b).
● x_max = np.max(x): tìm giá trị tối đa (x_max) trong mảng x.
● y_max = m*x_max+b: tính toán tọa độ y (y_max) tương ứng với giá trị x tối đa (x_max) ( công thức tương tự dòng trên)
plt.style.use("fivethirtyeight")
Trang 13Sau đó, nhóm thiết lập phong cách trực quan tổng thể cho các biểu đồ Seaborn Đối số 'whitegrid' được truyền vào để thiết lập thành chủ đề có nền trắng và lưới mờ
Nhóm sử dụng hàm plt.style.use từ thư viện Matplotlib (Seaborn được xây dựng dựa trên Matplotlib) để thiết lập bảng kiểu cho các biểu đồ được tạo bằng các hàm Matplotlib, bao gồm cả các hàm được sử dụng bởi Seaborn Đối số "fivethirtyeight" cho biết hàm sử dụng bảng kiểu "fivethirtyeight" được thiết kế để mô phỏng phong cách trực quan của các biểu đồ và đồ thị.
2.1.6 Vẽ biểu đồ scatter plot và đường thẳng tuyến tính
Đầu tiên, nhóm tạo một hình fig và một trục ax để vẽ biểu đồ Tiếp theo, vẽ biểu đồ Scatterplot (biểu đồ phân tán) để thể hiện mối quan hệ giữa giá mở cửa (trục hoành) và giá đóng cửa (trục tung) dựa trên dữ liệu trong DataFrame: alpha=0.5 cho biết các điểm dữ liệu có độ mờ 50%, cho phép thấy các điểm dữ liệu chồng lên nhau
Sau đó, nhóm vẽ đường thẳng thể hiện đường hồi quy tuyến tính bằng cách:
● Xác định giá trị x của hai điểm đầu và cuối của đường thẳng, đường thẳng sẽ trải dài từ giá mở cửa tối thiểu (x_min) đến giá mở cửa tối đa (x_max).
● Xác định giá trị y của hai điểm đầu và cuối của đường thẳng Giá trị y được tính toán dựa trên hệ số góc m và hệ số chặn b của đường hồi quy tuyến tính, cùng với giá trị x tương ứng (x_min và x_max).
● Thiết lập độ dày và màu sắc của đường thẳng.
Trang 142.1.7 Vẽ biểu đồ thể hiện Closing price
Nhóm tạo một đối tượng hình ảnh mới bằng cách sử dụng hàm plt.figure Tham số figsize đặt kích thước của hình ảnh có chiều rộng 10 inch và chiều cao 5 inch.
Sau đó, nhóm tiến hành vẽ đường Closing price (giá đóng cửa) AAPL['Adj Close'].plot(): vẽ cột "Adj Close" (giá đóng cửa điều chỉnh) từ DataFrame AAPL Hàm plot() của Matplotlib được sử dụng để tạo một biểu đồ đường, thể hiện trực quan giá đóng cửa điều chỉnh theo thời gian
Nhóm sử dụng những lệnh sau để cài đặt nhãn và tiêu đề:
● plt.ylabel('Adj Close'): đặt nhãn cho trục y thành "Adj Close" để biểu thị cho giá đóng cửa điều chỉnh.
● plt.xlabel(None): đặt nhãn cho trục x thành None.
Trang 15● plt.title(f"Closing Price of AAPL"): đặt tiêu đề cho biểu đồ bằng cách sử dụng f-string, hiển thị "Closing Price of AAPL".
Cuối cùng, định cấu hình bố cục bằng dòng plt.tight_layout() để điều chỉnh khoảng cách giữa các phần tử biểu đồ và các cạnh hình ảnh, ngăn các nhãn hoặc tiêu đề chồng
Tương tự với cách vẽ ở phần trên, nhóm tạo một đối tượng hình ảnh mới bằng cách sử dụng hàm plt.figure Tham số figsize đặt kích thước của hình ảnh có chiều rộng 10 inch và chiều cao 5 inch.
Sau đó, nhóm tiến hành vẽ đường Volume, vẽ cột "Volume" từ DataFrame AAPL Hàm plot() của Matplotlib được sử dụng để tạo một biểu đồ đường, thể hiện trực quan số lượng giao dịch.