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

20 2 0
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

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

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

TRƯỜ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 MSSV : 522202111210 SĐT : 0909 361 003 Ngày sinh : 26/08/1998 Email : ngocnguyen.522202111210@st.ueh.edu.vn 2023/TPHCM MỤ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 1 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 2.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: Đ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 d 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ã Tên Doanh nghiệp Ngành nghề CK Ngân hàng TMCP Đầu tư và Phát triển Ngân hàng 1 BID Việt Nam Ngân hàng TMCP Công thương Việt Ngân hàng 2 CTG Nam Công ty cổ phần FPT CNTT & Viễn 3 FPT thông CTCP Tập đoàn Hoà phát Sản xuất 4 HPG Ngân hàng TMCP Quân Đội Ngân hàng 5 MBB CTCP Đầu tư Thế giới di động Bán lẻ, thiết bị 6 MWG điện tử 7 STB Ngân hàng TMCP Sài Gòn Thương Ngân hàng Tín 8 TCB Ngân hàng TMCP Kỹ Thương Việt Ngân hàng Nam 9 VCB Ngân hàng TMCP Ngoại thương Việt Ngân hàng Nam 10 VNM CTCP Sữa Việt Nam Sản xuất 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 cá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 Giả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ị Giả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` Giả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ư 3 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 3 "meanlogrets * w" thực hiện phép nhân từng phần tử giữa giá trị trung bình logarit và vector trọng số Điều này tạo ra một vector trong đó mỗi phần tử là tích của các phần tử tương ứng trong "meanlogrets" và "w" 4 "np.sum()" sau đó tính tổng của vector kết quả, cho kết quả là lợi nhuận kỳ vọng của danh mục đầu tư Điều này xảy ra vì lợi nhuận kỳ vọng là tổng của tích của giá trị trung bình logarit và trọng số danh mục đầu tư cho mỗi tài sản Toàn bộ quá trình được lặp lại cho tất cả các danh mục đầu tư trong vòng lặp, tạo ra một mảng "expectedret" chứa lợi nhuận kỳ vọng cho tất cả các danh mục đầu tư Giải thích: In [13]: Lệnh trên dùng để vẽ một biểu đồ phân tán (scatter plot) trong Python, sử dụng thư viện matplotlib Dưới đây là giải thích cho từng phần của lệnh: 1 plt.figure(figsize = (20, 7)): Đây là lệnh để tạo một figure, tức là không gian vẽ, với kích thước là 20x7 inches 2 plt.scatter(expectedvolatility,expectedret, c=sharperatio): Lệnh này tạo ra biểu đồ phân tán, trong đó trục hoành là ‘expectedvolatility’ (độ biến động kỳ vọng), trục tung là ‘expectedret’ (lợi nhuận logarithm kỳ vọng), và màu sắc của các điểm phân tán được chọn dựa trên giá trị của ‘sharperatio’ (tỷ lệ Sharpe) 3 plt.xlabel('Expected Volability'): Đặt nhãn trục hoành là ‘Expected Volatility’ (Độ biến động kỳ vọng) 4 plt.ylabel('Expected Log Return'): Đặt nhãn trục tung là 'Expected Log Return' (Lợi nhuận logarithm kỳ vọng) 5 plt.colorbar(label = ' Sharpe Ratio'): Tạo một thanh màu cho biểu đồ, với nhãn là 'Sharpe Ratio' (Tỷ lệ Sharpe) 6 plt.show(): Hiển thị biểu đồ Kết quả là bạn sẽ thấy một biểu đồ phân tán với các điểm được phân tán trên mặt phẳng dựa trên expectedvolatility và expectedret, màu sắc của từng điểm thể hiện thông tin về sharperatio, và bạn có thể dễ dàng nhận biết các điểm theo màu sắc của chúng trên thanh màu Giải thích: In [14]: Đoạn mã trên đang thực hiện các bước sau: 1 Định nghĩa hàm negativeSR(w): Hàm này nhận đầu vào là vector trọng số `w` Vector trọng số này được chuyển đổi thành mảng numpy, sau đó tính toán R (tổng của log return nhân với trọng số), V (công thức tính độ lệch chuẩn), và cuối cùng tính toán Sharpe Ratio là tỷ lệ giữa R và V nhân với -1 và trả về kết quả 2 Định nghĩa hàm checksumtoOne(w): Hàm này kiểm tra tổng của các trọng số có bằng 1 không và trả về kết quả 3 Khởi tạo vector trọng số ban đầu `w0` với giá trị đều nhau 4 Định nghĩa ranh giới cho vector trọng số thông qua tuple ‘bounds’, đây là chỉ định rằng các giá trị trong vector trọng số phải nằm trong khoảng từ 0 đến 1 5 Xác định ràng buộc thông qua từ điển constraints, với ràng buộc là tổng của vector trọng số phải bằng 1 6 Sử dụng hàm ‘minimize’ để tối ưu hóa hàm ‘negativeSR’ với các ràng buộc và ranh giới đã xác định Kết quả được lưu trong biến ‘w_opt’ là vector trọng số tối ưu hóa Giải thích: In [15]: Lệnh đầu tiên ‘maxindex = sharperatio.argmax()’ sẽ tìm ra chỉ số của phần tử có giá trị lớn nhất trong mảng `sharperatio` Điều này giả sử rằng `sharperatio` là một mảng chứa các giá trị Sharpe ratio Lệnh thứ hai ‘weight[maxindex, :]’ sẽ lấy ra hàng tương ứng với chỉ số `maxindex` từ mảng `weight` Điều này có thể được sử dụng để chọn ra trọng số của tài sản tương ứng với giá trị Sharpe ratio cao nhất trong mảng Giải thích: In [16]: Lệnh `w_opt.x` trong lý thuyết Markowitz trong Python thường được sử dụng để lấy ra các trọng số tối ưu của các tài sản phù hợp với phương pháp tối ưu hóa Markowitz Trong ngữ cảnh này, `w_opt` có thể là kết quả từ việc tối ưu hóa theo lý thuyết Markowitz sử dụng các tính toán và hạn chế nhất định Kết quả của `w_opt.x` sẽ cung cấp một mảng các trọng số tài sản tối ưu hóa, mỗi phần tử trong mảng tương ứng với tài sản cụ thể trong danh sách các tài sản được xem xét trong phân tích tối ưu hóa In [17]: Dòng đầu tiên tạo một mảng các giá trị trả về d kiến (rets) cho danh mục sử dụng np.linspace, với 50 điểm trong khoảng từ -0.0002 đến 0.0005 Dòng thứ hai tạo một danh sách rỗng có tên là volatility_opt để lưu trữ kết quả tối ưu của biến động Hai hàm minimizeMyvolatility và getRet được định nghĩa: - minimizeMyvolatility tính toán biến động của danh mục sử dụng công thức V = căn bậc hai của (w^T * Σ * w), trong đó w là trọng số danh mục và Σ là ma trận hiệp phương sai - getRet tính toán lợi nhuận của danh mục sử dụng công thức R = Σ(meanlogrets * w), trong đó meanlogrets là vector trung bình log lợi nhuận Một vòng lặp for duyệt qua mỗi giá trị trả về dự kiến trong rets Đối với mỗi giá trị trả về dự kiến, ràng buộc được thiết lập cho bài toán tối ưu hóa: tổng trọng số bằng 1 và lợi nhuận của danh mục bằng giá trị trả về dự kiến Hàm minimize sau đó được gọi cho mỗi giá trị trả về dự kiến, tối ưu hóa biến động danh mục (minimizeMyvolatility) dưới ràng buộc cho trước Giá trị biến động tối thiểu được tính và được thêm vào danh sách volatility_opt Giải thích: In [18]: Đoạn mã trên trong lý thuyết Markowitz sử dụng thư viện `matplotlib` để tạo một biểu đồ phân tán (scatter plot) hiển thị quan hệ giữa rủi ro dự kiến, lợi nhuận dự kiến và hệ số Sharpe Dưới đây là mô tả chi tiết: 1 `plt.figure(figsize = (20, 7))`: Tạo một hình vẽ mới với kích thước rộng 20 inch và cao 7 inch 2 `plt.scatter(expectedvolatility,expectedret, c=sharperatio)`: Tạo biểu đồ phân tán trong đó trục hoành biểu diễn rủi ro dự kiến (`expectedvolatility`), trục tung biểu diễn lợi nhuận dự kiến (`expectedret`), và màu sắc của điểm phụ thuộc vào hệ số Sharpe (`sharperatio`) 3 `plt.xlabel('Expected Volability')`: Đặt nhãn cho trục hoành là "Rủi ro dự kiến" 4 `plt.ylabel('Expected Log Return')`: Đặt nhãn cho trục tung là "Lợi nhuận dự kiến" 5 `plt.colorbar(label = ' Sharpe Ratio')`: Thêm thanh màu của biểu đồ và đặt nhãn là "Hệ số Sharpe" 6 `plt.scatter(expectedvolatility[maxindex],expectedret[maxindex],c='red')`: Đánh dấu điểm có Rủi ro dự kiến và Lợi nhuận dự kiến lớn nhất bằng màu đỏ 7 `plt.plot(volatility_opt,rets,' ')`: Vẽ đường (hoặc đồ thị) với đường kẻ đứt, trong đó trục hoành biểu diễn rủi ro tối ưu (`volatility_opt`) và trục tung biểu diễn lợi nhuận tối ưu (`rets`) 8 `plt.show()`: Hiển thị biểu đồ đã tạo Đoạn mã này giúp hiển thị đồ thị phân tán với các thông tin quan trọng về rủi ro, lợi nhuận và hệ số Sharpe, đồng thời cũng cho phép đánh dấu điểm dự kiến tối ưu trên biểu đồ 4 KẾT LUẬN Bài tiểu luận này trình bày chi tiết các bước xây dựng danh mục đầu tư tối ưu trên thị trường chứng khoán bằng cách ứng dụng lý thuyết Markowitz kết hợp cùng với việc phân tích bằng phần mềm Python để tính toán được diễn biến các chỉ số tài chính về giá các cổ phiếu được chọn qua các thời kỳ bằng việc sử dụng số liệu quá khứ nhằm hạn chế rủi ro nhưng vẫn đảm bảo tỷ suất sinh lời của danh mục giúp cho các nhà đầu tư cá nhân có thêm công cụ lựa chọn để hạn chế rủi ro khi tham gia đầu tư trên thị trường chứng khoán Việt Nam Kết quả đã được thể hiện thông qua tỷ số Sharpe cho việc tối ưu hoá danh mục giúp đánh giá lợi suất điều chỉnh theo rủi ro và việc tính tỷ trọng tối ưu của từng cổ phiếu trong danh mục giúp nhà đầu tư có cái nhìn về cách phân bổ tài sản để đạt được mục tiêu sinh lợi Việc áp dụng lý thuyết Markowitz kết hợp phần mềm Python còn giúp các nhà đầu tư giảm thiểu rủi ro khi đưa ra quyết định đầu tư TÀI LIỆU THAM KHẢO 1 L.A.Tuan (2010) Vận dụng mô hình Markowitz trong việc xây dựng danh mục đầu tư chứng khoán tại thị trường chứng khoán Việt Nam 2 L.Quy (2013) Ứng dụng lý thuyết Markowitz để xây dựng danh mục đầu tư hiệu quả cho nhà đầu tư cá nhân trên TTCK Việt Nam 3 Y.Hilpish (2020) Artificial Intelligence in Finance 4 Open AI (GPT-3.5) 5 FMZ (2023) Đo lường rủi ro và lợi nhuận – Giới thiệu về lý thuyết Markowitz https://www.fmz.com/lang/vi/digest-topic/10275 6 Số liệu: https://vn.investing.com/indices/vn-historical-data KẾT QUẢ KIỂM TRA ĐẠO VĂN

Ngày đăng: 09/03/2024, 15:44

Tài liệu cùng người dùng

Tài liệu liên quan