Vì vậy, việc nghiên cứu và tìm hiểu về lý thuyết Markowitz nhằm xây dựng một danh mục đầu tư tối ưu hiệu quả cho các nhà đầu tư cá nhân tại Việt Nam trên thị trường chứng khoán là cần th
Trang 1TRƯỜNG ĐẠI HỌC KINH TẾ TP.HỒ CHÍ MINH
VIỆN ĐÀO TẠO SAU ĐẠI HỌC
-b & a -
TIỂU LUẬN CUỐI KỲ DỰA VÀO NỀN TẢNG MÔ HÌNH MARKOWITZ
ĐỂ XÂY DỰNG DANH MỤC TỐI ƯU CHO NHÀ ĐẦU TƯ CÁ NHÂN TRÊN THỊ TRƯỜNG CHỨNG
KHOÁN VIỆT NAM
Lớp : 23C1QUA60503301 – Lớp tối thứ 4
Môn : Tài chính Định lượng
Giảng Viên : Vũ Việt Quảng
Họ và Tên : Nguyễn Thị Hồng Ngọc
Ngày sinh : 26/08/1998
Email : ngocnguyen.522202111210@st.ueh.edu.vn
2023/TPHCM
Trang 2MỤC LỤC
1 GIỚI THIỆU CHUNG 3
1.1 Lý do chọn đề tài 3
1.2 Mục tiêu nghiên cứu 3
1.3 Đối tượng và phạm vi nghiên cứu 3
1.4 Phương pháp nghiên cứu 3
2 TỔNG QUAN CƠ SỞ LÝ THUYẾT 3
2.1 Tổng quan về lý thuyết Markowitz 4
2.2 Một số công thức trong mô hình Markowitz 4
3 XÂY DỰNG DANH MỤC ĐẦU TƯ HIỆU QUẢ BẰNG PHẦN MỀM PYTHON 6
3.1 Dữ liệu 6
3.2 Xây dựng danh mục đầu tư hiệu quả bằng phần mềm Python 7
3.3 Xử lý dữ liệu 7
4 KẾT LUẬN 17
TÀI LIỆU THAM KHẢO 19
KẾT QUẢ KIỂM TRA ĐẠO VĂN 20
Trang 31 GIỚI THIỆU CHUNG
1.1 Lý do chọn đề tài
Tại Việt Nam, khi thị trường chứng khoán ngày càng phát triển thì các nhà đầu tư có nhiều những cơ hội đầu tư sinh lợi nhưng đi cùng theo đó là những rủi ro tiềm ẩn cũng lớn hơn Ngoài những nhà đầu tư chuyên nghiệp trong và ngoài nước thì sự góp phần của các nhà đầu tư cá nhân chiếm tỉ lệ áp đảo trên thị trường chứng khoán Việt Nam
Thị trường chứng khoán đã từng bước thực hiện được chức năng kinh tế
cơ bản của nó để phát triển tăng trưởng kinh tế đất nước Sự tăng trưởng của nền kinh tế Việt Nam cũng đã tạo điều kiện thuận lợi cho thị trường chứng khoán và có sức hút hấp dẫn cho các nhà đầu tư tham gia giao dịch Tuy vậy, hoạt động đầu tư nếu không có một phương pháp khoa học và hiệu quả nào thì các nhà đầu tư đã tác động tiêu cực đến kết quả đầu tư của họ và cũng như sự lành mạnh và ổn định của thị trường chứng khoán nếu các nhà đầu tư chỉ đưa
ra quyết định đầu tư theo cảm xúc, tâm lý bầy đàn bởi các tin đồn không xác thực, thiếu chuyên nghiệp Vì vậy, việc nghiên cứu và tìm hiểu về lý thuyết Markowitz nhằm xây dựng một danh mục đầu tư tối ưu hiệu quả cho các nhà đầu tư cá nhân tại Việt Nam trên thị trường chứng khoán là cần thiết để đảm bảo lợi nhuận và cơ hội đầu tư Điều này giúp các nhà đầu tư có thể đưa ra quyết định đầu tư sáng suốt và hiệu quả hơn
1.2 Mục tiêu nghiên cứu
Bài tiểu luận ứng dụng lý thuyết Markowitz để xây dựng danh mục đầu
tư hiệu qủa cho các nhà đầu tư cá nhân trên thị trường chứng toán Việt Nam
1.3 Đối tượng và phạm vi nghiên cứu
Trong phạm vi của bài tiểu luận này tập trung nghiên cứu là danh mục bao gồm 10 cổ phiếu trong danh sách cổ phiếu VN30 gồm: BID, CTG, FPT, HPG, MBB, STB, TCB, VCB, VNM Các cổ phiếu được thu thập dữ liệu giá đóng cửa hằng ngày trong giai đoạn từ tháng 10/2021 đến tháng 10/2023 Dữ liệu này được lấy từ website https://vn.investing.com
1.4 Phương pháp nghiên cứu
Phương pháp nghiên cứu trong bài tiểu luận này là phương pháp định tính và định lượng Qua việc thu thập các số liệu lịch sử được công bố qua các phương tiện đại chúng, truyền thông, từ các cơ quan chuyên môn kết hợp cùng với phương pháp so sánh phân tích bằng đồ thị minh hoạ, phương pháp thống kê để phân tích và xây dựng danh mục hiệu quả bằng phần mềm Python
2 TỔNG QUAN CƠ SỞ LÝ THUYẾT
Trang 42.1 Tổng quan về lý thuyết Markowitz
Trong một bài luận có tiêu đề là porfolio selection - lựa chọn danh mục đầu
tư (1952) của giáo sư Harry Markowitz đã được vinh danh trao giải khoa học kinh tế năm 1990 Lý thuyết Markowitz cho giả thuyết là để tối ưu hoá lợi
nhuận cũng như để xác định rủi ro thì các nhà đầu tư đều tìm cách đa dạng hoá danh mục đầu tư của mình Vì lợi nhuận của tài sản chính là yếu tố thay đổi lợi nhuận của một danh mục đầu tư bao gồm các loại tài sản với sự kết hợp tỷ trọng các nhau trên tổng lợi nhuận của các tài sản đó
Giáo sư Harry Markowitz đã chỉ ra cách giải quyết về xây dựng danh mục đầu tư hiệu quả, mô hình đã được công nhận về tính đơn giải về đại số và tính khả thi cho ứng dụng trong thực nghiệm
Các nguyên lý cơ bản của mô hình Markowitz:
- Khái niệm đường cong hiệu quả (efficient frontier) là tập hợp các danh mục đầu tư với tỷ lệ thu nhập tối đa tại mọi mức rủi ro nhất định hay mức rủi ro tối thiểu tại mọi mức thu nhập nhất định Đường này là đường cong lồi vì quan hệ giữa lợi nhuận và rủi ro không phải là tương quan tuyến tính
- Phân tán rủi ro là một trong những đóng góp quan trọng của mô hình khẳng định việc đa dạng hoá danh mục đầu tư Việc phân bổ vốn vào nhiều loại tài sản khác nhau có thể giảm thiểu rủi ro phi hệ thống vì sự biến động của một tài sản cụ thể có được bù đắp bởi sự ổn định của tài sản khác
- Định lượng và mô hình hoá: sử dụng các phương trình toán học để tính toán tỷ lệ phân bổ tối ưu trong mô hình Markowitz Bao gồm cả việc tính lợi nhuận kỳ vọng, độ lệch chuẩn, ma trận hiệp phương sai giữa các tài sản Những tính toán này có thể sử dụng hiệu quả thông qua phần nềm Python và dưới sự hỗ trợ của các thư viện chuyên ngành
- Nguyên tắc thiết lập danh mục đầu tư theo lý thuyết Markowizt: Thiết lập công thức tính thu nhập và rủi ro của danh mục đầu tư và chỉ ra nguyên tắc đa dạng hoá một cách hiệu quả trong danh mục đầu tư hiệu quả
Mô hình Markowitz đã được ứng dụng rộng rãi bởi các quỹ đầu tư, ngân hàng, các nhà quản lý tài sản để quản lý và xây dựng danh mục đầu tư Có thể được coi công trình nghiên cứu này là đã thiết lập phân tích tài chính vĩ mô là lĩnh vực quan trọng trong phân tích kinh tế
2.2 Một số công thức trong mô hình Markowitz
a Lợi nhuận kỳ vọng và rủi ro của một danh mục
Tỷ suất lợi nhuận kỳ vọng của một danh mục đầu tư - lợi nhuận trung bình
có trọng số của từng chứng khoán các biệt trong danh mục đầu tư
Công thức tính lợi nhuận kỳ vọng:
Trang 5Đo lường rủi ro của danh mục đầu tư được đo lường bằng chỉ tiêu phương sai hoặc độ lệch chuẩn của tỷ suất lợi nhuận trên danh mục đầu tư
Công thức tính độ lệch chuẩn:
Trong đó:
E ( 𝑅 𝑗 ) : Lợi nhuận kỳ vọng của tài sản j;
E ( 𝑅 𝑝 ): lợi nhuận kỳ vọng của danh mục P;
𝑊 𝑗 : Tỷ trọng của chứng khoán j;
𝑊 𝑘 : Tỷ trọng của chứng khoán k;
m : Tổng số chứng khoán trong danh mục
b Hệ số tương quan và hiệp phương sai
Độ rủi ro của danh mục đầu tư phụ thuộc vào độ lệch chuẩn của suất sinh lợi của từng tài sản riêng biệt và sự tương tác giữa suất sinh lợi của tài sản:
Công thức tính hiệp phương sai:
Công thức tính hệ số tương quan:
c Danh mục tiếp xúc
Danh mục tiếp xúc A có tỷ số Sharpe lớn nhất, với cùng một đường tập hợp các cơ hội đầu tư thì các nhà đầu tư chọn danh mục tiếp xúc A Danh mục đầu
tư tối ưu được xác định tuỳ theo thị hiếu của nhà đầu tư và sẽ là tiếp điếp của đường bàng quan và đường phân bổ vốn đi qua danh mục tiếp xúc A
Trang 6d Tỷ số Sharpe
Tỷ số Sharpe được sử dụng để đo lường tỷ suất lợi nhuận đã điều chỉnh rủi
ro của một khoản đầu tư:
𝑅 𝑝 : Tỷ suất lợi nhuận của danh mục đầu tư
𝑅 𝑓 : Tỷ suất lợi nhuận phi rủi ro
s𝑝 : Độ lệch chuẩn
Các công thức này là nền tảng để tính toán theo mô hình Markowitz giúp xác định và cân bằng tối ưu giữa rủi ro và lợi nhuận kỳ vọng
3 XÂY DỰNG DANH MỤC ĐẦU TƯ HIỆU QUẢ BẰNG PHẦN MỀM PYTHON
3.1 Dữ liệu
Để lựa chọn danh mục đầu tư tối ưu thì các nhà đầu tư cần thực hiện theo phương pháp tiếp cận top-down để chọn lọc các cổ phiếu vào danh mục Trong bài nghiên cứu này tác giả lấy dữ liệu giá đóng cửa của 30 cổ phiếu trong nhóm VN30 trong giai đoạn từ 01/10/2021 đến 29/09/2023, do thời gian nghiên cứu giới hạn nên sau khi thực hiện quan sát đã chọn lọc được 10 cổ phiếu với các ngành nghề khác nhau Dữ liệu được lấy từ: https://vn.investing.com
STT Mã
CK
1 BID Ngân hàng TMCP Đầu tư và Phát triển
Việt Nam
Ngân hàng
2 CTG Ngân hàng TMCP Công thương Việt
Nam
Ngân hàng
thông
6 MWG CTCP Đầu tư Thế giới di động Bán lẻ, thiết bị
điện tử
Trang 77 STB Ngân hàng TMCP Sài Gòn Thương
Tín
Ngân hàng
8 TCB Ngân hàng TMCP Kỹ Thương Việt
Nam
Ngân hàng
9 VCB Ngân hàng TMCP Ngoại thương Việt
Nam
Ngân hàng
Bảng 3.1 Danh sách các cổ phiếu nghiên cứu
3.2 Xây dựng danh mục đầu tư hiệu quả bằng phần mềm Python
Nguồn Python mà bài tiểu luận được tham khảo từ sách Artificial
Intelligence in Finance do Yves Hilpisch viết và được xuất bản đầu tiên vào năm 2020, kết hợp cùng với nguồn được tác giả hỏi và tham khảo từ OpenAI (GPT3.5) sau đó hiệu chỉnh để phù hợp nội dung của bài
3.3 Xử lý dữ liệu
Đầu tiên, tiến hành thực hiện các bước nhập những module cần thiết để xử lý
và làm sạch dữ liệu
Giải thích:
In [1]: Đoạn mã trên là một đoạn mã Python sử dụng các thư viện và module sau:
- numpy (được nhập như `np` NumPy là một thư viện mã nguồn mở cung cấp các
cấu trúc dữ liệu và công cụ tính toán cho Python Nó giúp xử lý mảng
multidimensional, ma trận và các phép toán số học một cách hiệu quả
- pandas (được nhập như `pd`): Pandas là một thư viện cung cấp cấu trúc dữ liệu
và công cụ phân tích dữ liệu hiệu quả trong Python Nó cung cấp các cấu trúc dữ liệu như DataFrame và Series, giúp làm việc với dữ liệu dạng bảng và chuỗi thời gian
- scipy.optimize.minimize: scipy là một thư viện toán học và khoa học tính toán
mạnh mẽ trong Python Trong đoạn mã trên, ta sử dụng `minimize` từ module
`scipy.optimize` để tối ưu hóa hàm mục tiêu
- matplotlib.pyplot (được nhập như `plt`): matplotlib là một thư viện được sử
dụng để tạo đồ thị 2D trong Python `pyplot` là module trong matplotlib cung cấp
Trang 8các chức năng để tạo ra các plot, đồ thị và biểu đồ Đoạn mã trên được sử dụng để tạo ra các biểu đồ và đồ thị trực quan để trình bày dữ liệu
Việc nhập những thư viện và module này là cần thiết để sử dụng các hàm và cấu trúc dữ liệu mà chúng cung cấp khi lập trình trong Python
Giải thích:
In [2]: Câu lệnh này đọc dữ liệu từ tệp CSV có đường dẫn và lưu trữ nó trong
biến VN30HistoricalData10
Các cờ index_col=0 và parse_dates=True được sử dụng để chỉ định cột nào
sẽ được sử dụng làm chỉ mục (index) cho DataFrame và để yêu cầu việc phân tích các cột ngày tháng thành đối tượng thời gian
In [3]: Lệnh này chuyển đổi tên cột trong DataFrame VN30HistoricalData10
Bằng cách gán danh sách tên mới cho thuộc tính columns của DataFrame, các tên cột sẽ được thay đổi thành mã chứng khoán của các cổ phiếu
Giải thích:
In [4]: Lệnh này đượcsử dụng để hiển thị thông tin tóm tắt về dữ liệu trong
DataFrame VN30HistoricalData10, bao gồm thông tin như số lượng dòng và cột, tên cột, số lượng giá trị null (nếu có) và kiểu dữ liệu của từng cột Thông tin này rất hữu ích để kiểm tra sơ bộ về dữ liệu trước khi thực hiện các phân tích hoặc xử
lý tiếp theo
Trang 9Giải thích:
In [5]: Lệnh này sử dụng phương thức apply trên DataFrame
VN30HistoricalData10 để áp dụng một hàm lambda cho mỗi phần tử trong
DataFrame Trong trường hợp này, hàm lambda được sử dụng để thay thế dấu phẩy bằng không và chuyển đổi dữ liệu thành kiểu dữ liệu float Điều này giúp loại bỏ dấu phẩy từ các chuỗi số và chuyển đổi chúng thành số thực, giúp chuẩn hóa dữ liệu để tiếp tục các phân tích số học hoặc thống kê
In [6]: Lệnh này sắp xế lại DataFrame VN30HistorData10 theo chỉ mục (index)
của nó Ascending=True được sử dụng để sắp xếp theo thứ tự tăng dần Điều này
có nghĩa là các dòng sẽ được sắp xếp theo thứ tự tăng dần của chỉ mục của chúng, giúp dữ liệu được tổ chức một cách chặt chẽ và dễ dàng trong quá trình phân tích
và hiển thị
Trang 10Giải thích:
In [8]: Dòng đầu tiên của mã này sẽ tính toán tỷ lệ giữa giá trị của data dịch
chuyển một ngày về phía trước Điều này tương đương với việc tính toán lợi nhuận hoặc biến đổi tăng trưởng hàng ngày của dữ liệu
Dòng thứ hai của mã chỉ đơn giản là in ra giá trị của rets, là kết quả từ phép tính ở trên
Tóm lại, mã này tính toán và in ra tỷ lệ giữa giá trị của VN30HistoricalData10 dịch chuyển một ngày về phía trước, với mục tiêu chính là đánh giá lợi nhuận hàng ngày của tài sản tài chính hoặc chỉ số VN30
Giải thích:
In [9]: Lệnh rets.tail() được sử dụng trong Python để hiển thị 05 hàng cuối cùng
của DataFrame Kết quả trả về là một DataFrame hoặc Series chứa các hàng cuối cùng của `rets`
Trang 11Giải thích:
In [10]: Lệnh đầu tiên logrets = np(rets) trong Python được sử dụng để tính toán
logarithm tự nhiên (logarit cơ số e) của mỗi phần tử trong Series `rets` và lưu kết quả vào một biến mới có tên là ‘logrets’
Kết quả sẽ là một Series mới chứa các giá trị logarithm tương ứng với từng phần tử trong ‘rets’
Giải thích:
In [11]: Các bước tính toán cho danh mục đầu tư như sau:
1 noOPortfolios = 10000: Gán giá trị 10000 cho biến ‘noOPortfoios’ là số lượng
các danh mục đầu tư mà bạn đang tính toán
2 weight = np.zeros((noOPortfolios,10)): Tạo một ma trận 2D có kích thước
‘noOPortfolios’ x 10, tất cả giá trị của mỗi phần tử trong ma trận này là 0 Đây là nơi lưu trữ trọng số của các danh mục đầu tư
Trang 123 expectedret = np.zeros(noOPortfolios): Tạo một mảng 1 chiều có kích thước
‘noOPortfolios’, tất cả giá trị ban đầu là 0 Lưu trữ kỳ vọng lợi nhuận (expected return) của từng danh mục đầu tư
4 expectedvolatility = np.zeros(noOPortfolios): Tạo một mảng 1 chiều có kích
thước ‘noOPortfolios’, tất cả giá trị ban đầu là 0 Đây có thể sẽ lưu trữ kỳ vọng biến động (expected volatility) của từng danh mục đầu tư
5 sharperatio = np.zeros(noOPortfolios): Tạo một mảng 1 chiều có kích thước
‘noOPortfolios’, tất cả giá trị ban đầu là 0 Đây có thể sẽ lưu trữ tỷ lệ Sharpe
(Sharpe ratio) của từng danh mục đầu tư
6 meanlogrets = logrets.mean(): Tính giá trị trung bình của các logarithm lợi
nhuận và lưu vào ‘meanlogrets’, dựa trên giả sử rằng ‘logrets’ là một DataFrame hoặc Series chứa dữ liệu logarithm lợi nhuận
7 sigma = logrets.cov(): Tính ma trận hiệp phương sai (covariance matrix) của
‘logrets’ và lưu vào ‘sigma’, dựa trên giả sử rằng ‘logrets’ là một DataFrame chứa
dữ liệu logarithm lợi nhuận
8 Vòng lặp ‘for’ từ ‘k=0’ đến ‘k=noOPortfolios – 1’: Đây là một vòng lặp để
tính toán thông tin cho từng danh mục đầu tư
a w = np.array(np.random.random(10)): Tạo một mảng 1 chiều gồm 10 giá trị ngẫu nhiên nằm trong khoảng từ 0 đến 1, và lưu vào `w`
b w = w / np.sum(w): Chuẩn hóa các giá trị trong `w` sao cho tổng của chúng bằng 1, cho ra trọng số hợp lý cho danh mục đầu tư
c Gán ‘w’ vào hàng thứ ‘k’ của ma trận ‘weight’
d Tính toán kỳ vọng lợi nhuận và kỳ vọng biến động dự kiến của danh mục đầu
tư, lưu vào ‘expectedret[k]’ và ‘expectedvolatility[k]’ tương ứng
e Tính tỷ lệ Sharpe (Sharpe ratio) của danh mục đầu tư, lưu vào
‘sharperatio[k]’
Cuối cùng, sẽ có các mảng weight, expectedret, expectedvolatility, và sharperatio chứa thông tin về danh mục đầu tư theo mô hình tính toán đã xây dựng
In [12]: Trong đoạn mã, lệnh "expectedret[k] = np.sum(meanlogrets * w)" được
sử dụng để tính toán lợi nhuận kỳ vọng của mỗi danh mục đầu tư trong vòng lặp Quá trình này được thực hiện như sau:
1 "meanlogrets" là giá trị trung bình của logarit lợi nhuận cho mỗi tài sản trong danh mục đầu tư Đây là một giá trị đã được tính từ dữ liệu logarit lợi nhuận
2 "w" là vector trọng số cho các tài sản trong danh mục đầu tư Nó đại diện cho tỷ
lệ đầu tư vào từng tài sản