Phươ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ôngxác định bằng cách sử dụng giá trị dữ liệu liên quan và đã biết khác.
Trang 1UEH UNIVERSITY UEH COLLEGE OF TECHNOLOGY AND DESIGN
UEH 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ƯỜNG CHỨNG KHOÁN BẰNG PHƯƠNG PHÁP HỒI QUY
TUYẾN TÍNH
Giáo viên hướng dẫn: Ngô Hiếu Trường
Mã học phần: 24D1TEC55001903 Nhóm trưởng: Lưu Phan Bình Thy - MSSV: 31231025476
Trang 2DANH SÁCH THÀNH VIÊN VÀ NHIỆM VỤ
hoàn thành (%)
Trưởng nhóm đánh giá (%)
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
3.2 Hạn chế đề tài
3.3 Hướng phát triển đề tài
3.4 Kịch bản demo
TÀI LIỆU THAM KHẢO
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 nayvớ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ácsà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 xuhướ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ácchuyên gia kinh tế học Và một trong những lý do khiến thị trường chứng khoán thuhú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ôngnghệ 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àymộ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áncủ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ừ xuhướ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ềuyế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 giakhá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ộttrong những yếu tố quan trọng trong việc phân tích chứng khoán và đưa ra nhữngnhậ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áiquá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ệnnay, 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ự đadạ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ĩnhvự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ôngxá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óatoá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ộtphươ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ánhọ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 doanhnghiệ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ọctrong 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ếnsố) Để 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ủabiế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
import matplotlib pyplot as plt
from numpy import arange
from pandas import read_csv
from sklearn import metrics
from sklearn model_selection import TimeSeriesSplit
from sklearn ensemble import RandomForestRegressor
from sklearn preprocessing import MinMaxScaler
from sklearn model_selection import RandomizedSearchCV
from sklearn model_selection import train_test_split
from sklearn linear_model import LinearRegression
from sklearn metrics import confusion_matrix, accuracy_score
from pandas_datareader.data import DataReader
from pandas_datareader import data as pdr
from datetime import datetime
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ớpTimeSeriesSplit 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ớpRandomForestRegressor 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ớpRandomizedSearchCV từ thư viện scikit-learn để thực hiện điều chỉnh siêutham số ngẫu nhiên
● from sklearn.linear_model import LinearRegression: Import lớpLinearRegression từ mô-đun linear_model của thư viện scikit-learn để xâydựng mô hình hồi quy tuyến tính
● from sklearn.metrics import confusion_matrix, accuracy_score: Import cáchàm confusion_matrix và accuracy_score từ mô-đun metrics của thư việnscikit-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ânloạ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ácnguồn trực tuyến
● from pandas_datareader import data as pdr: Import alias pdr cho mô-đun datacủa thư viện pandas_datareader giúp sử dụng cú pháp pdr.DataReader thay chopandas_datareader.data.DataReader
● from datetime import datetime: Import datetime từ thư viện datetime để làmviệ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ỉnh
2.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 )
print (read_df.head())
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ạngbả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ếnsp500_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àngtruy 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
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
tech_list = ['AAPL']
for stock in tech_list :
Trang 10globals()[ stock ] = yf download( stock , start_date , end_date )
company_list [AAPL]
company_name ["AAPL"]
for company , com_name in zip ( 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ómdù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 đếnend_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 = )
Kết quả:
2.1.3.3 Chuẩn hóa dữ liệu
scaler MinMaxScaler ()
X scaler fit_transform( read_df [['Open', 'High', 'Low', 'Close']])
X = pd DataFrame ( columns = 'Open', 'High', 'Low', 'Close'], data = ,
index = read_df index )
print( X head())
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úpcá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ị trongkhoả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ứcfit_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ẩnhó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 trongkhoả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ớingà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ử
timesplit = TimeSeriesSplit ( n_splits = 10 )
for train_index , test_index in timesplit split( ):
X_train , X_test iloc [ train_index ], X iloc [ test_index ]
y_train , y_test iloc [ train_index ], y iloc [ 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ácphần tử của DataFrame X (dữ liệu đã chuẩn hóa) và cột y (giá đóng cửa) được tríchxuấ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ệntrê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ậyhơn
2.1.5 Tính hệ số và điểm giao của đường thẳng tuyến tính
x ["Open"] values
y ["Close"] values
N shape [ 0
Trang 12m ( N*np sum( * ) np sum( x *np sum( )) / N np sum( x ** 2 - np sum( ) ** 2 ))
Nhóm tiến hành tính toán các hệ số:
● Hệ số góc m: (np.sum(x)**2)):
m=(N*np.sum(x*y)-np.sum(x)*np.sum(y))/(N*np.sum(x**2)-■ np.sum(x*y): Tính tổng tích của các phần tử tương ứng trong x
và y
■ np.sum(x) và np.sum(y): Tính tổng các phần tử trong x và ytương ứng
■ 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ốithiể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)
sns set_style('whitegrid')
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ựatrên Matplotlib) để thiết lập bảng kiểu cho các biểu đồ được tạo bằng các hàmMatplotlib, 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 phongcá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
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 đượctí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 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ị chogiá đó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ụngf-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ảngcá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ồngchéo
2.1.8 Vẽ biểu đồ số lượng giao dịch
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