XÂY DỰNG DANH MỤC ĐẦU TƯ CÁC CỔ PHIẾU TRONG DANH SÁCH VN30 TRÊN THỊ TRƯỜNG CHỨNG KHOÁN VIỆT NAM: VẬN DỤNG LÝ THUYẾT CỦA MARKOWITZ VÀ MÔ HÌNH CAPM

28 14 0
Tài liệu đã được kiểm tra trùng lặp
XÂY DỰNG DANH MỤC ĐẦU TƯ CÁC CỔ PHIẾU TRONG DANH SÁCH VN30 TRÊN THỊ TRƯỜNG CHỨNG KHOÁN VIỆT NAM: VẬN DỤNG LÝ THUYẾT CỦA MARKOWITZ VÀ MÔ HÌNH CAPM

Đ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

Trang 1

BỘ GIÁO DỤC VÀ ĐÀO TẠO

ĐẠI HỌC KINH TẾ THÀNH PHỐ HỒ CHÍ MINH

TIỂU LUẬN CUỐI KỲTÀI CHÍNH ĐỊNH LƯỢNG

XÂY DỰNG DANH MỤC ĐẦU TƯ CÁC CỔ PHIẾU TRONG DANH SÁCH VN30 TRÊN THỊ TRƯỜNG CHỨNG KHOÁN VIỆT NAM: VẬN DỤNG LÝ THUYẾT CỦA

MARKOWITZ VÀ MÔ HÌNH CAPM

Giảng viên hướng dẫn: Vũ Việt Quảng

Lớp học phần: 23C1QUA60503302 (Lớp tối thứ 5)Sinh viên: Phạm Hồng Phượng

Trang 2

1.1.Lý do chọn đề tài3

2.2.Quy trình xây dựng danh mục đầu tư chứng khoán 32.3.Lý thuyết của Markowitz và lựa chọn danh mục đầu tư chứng khoán4

CHƯƠNG 3: ỨNG DỤNG PYTHON XÂY DỰNG DANH MỤC ĐẦU TƯ HIỆU QUẢ TRÊN THỊ

3.2.Áp dụng lý thuyết Markowitz mô hình MVP 6

Trang 3

CHƯƠNG 1: GIỚI THIỆU 1.1 Lý do chọn đề tài

Thị trường chứng khoán Việt Nam được đánh giá là một thị trường thứ cấp, thịtrường mới nổi, với phần lớn là các nhà đầu tư trên thị trường là các nhà đầu tư cá nhânvới ít kinh nghiệm, kiến thức chuyên sâu và dễ bị tác động bởi các yếu tố tâm lý Do đócác công cụ, mô hình nền tảng giúp phân tích kỹ thuật các chứng khoán trên thị trường đểxây dựng danh mục đầu tư là vô cùng cần thiết đối với các nhà đầu tư hiện nay Vì vậy,tác giả lựa chọn thực hiện đề tài tiểu luận: Xây dựng danh mục đầu tư các cổ phiếu trongdanh sách VN30 trên thị trường chứng khoán Việt Nam: Vận dụng lý thuyết củaMarkowitz và Mô hình CAPM.

1.2 Mục tiêu nghiên cứu

- Hệ thống lại cơ sở lý thuyết về danh mục đầu tư và xây dựng danh mục đầu tư hiệuquả

- Ứng dụng Mô hình MVP (Markowitz) và mô hình CAPM để xây dựng danh mụcđầu tư chứng khoán từ các cổ phiếu trong danh VN30 niêm yết trên thị trường chứngkhoán Việt Nam

1.3 Phạm vi nghiên cứu

- Sử dụng dữ liệu là giá cuối ngày của 10 cổ phiếu trong danh mục VN30 và chỉ số thịtrường VNindex thu thập từ Vietstock trong 5 năm từ tháng 01/2018 tới 12/2022, dữ liệuđược lấy theo tuần

1.4 Phương pháp nghiên cứu

- Sử dụng phương pháp thống kê, tổng hợp và phân tích dữ liệu thứ cấp thu thậpđược, trong đó xử lý phân tích dữ liệu thông qua Python qua phần mềm Jupyter notebook.

1.5 Ý nghĩa nghiên cứu

- Góp phần xây dựng danh mục đầu tư hiệu quả làm cơ sở tham khảo, góp phần nângcao hiệu quả đầu tư cho các nhà đầu tư nhỏ lẻ trên thị trường chứng khoán Việt Nam.

CHƯƠNG 2: CƠ SỞ LÝ THUYẾT2.1 Khái niệm danh mục đầu tư

Danh mục đầu tư (Investment Portfolio) có thể hiểu đơn giản là sự kết hợp các tàisản tài chính khác nhau như cổ phiếu, trái phiếu… của một nhà đầu tư Việc đa dạng hóavà quản lý danh mục đầu tư hiệu quả là cách làm tốt nhất giúp nhà đầu tư quản trị rủi rovà tối ưu hóa lợi nhuận khi tham gia thị trường chứng khoán.

Trang 4

2.2 Quy trình xây dựng danh mục đầu tư chứng khoán

Theo Investopedia1, nhà đầu tư có thể xây dựng danh mục đầu tư phù hợp với chiến lượcđầu tư bằng cách thực hiện theo cách tiếp cận có hệ thống như sau:

- Bước 1: Xác định tình hình tài chính và mục tiêu đầu tư, trong đó xác định lợi nhuậnmục tiêu, mức độ chấp nhận rủi ro của nhà đầu tư

- Bước 2: Xác định phân bổ tài sản phù hợp, cần phân chia vốn cho các loại tài sảnthích hợp (cổ phiếu, trái phiếu, chứng khoán phái sinh,…)

- Bước 3: Khi đã thiết lập được danh mục đầu tư, xây dựng các chiến lược để quản lýdanh mục Thực hiện phân tích và điều chỉnh tỷ lệ giá trị của các khoản đầu tư định kỳ,vì những biến động giá có thể khiến trọng số đầu tư ban đầu thay đổi

- Bước 4: Tái cân bằng danh mục, chiến lược quản lý danh mục Các nhà đầu tư sửdụng các phương pháp phân tích, chiến lược đầu tư khác nhau để lựa chọn, định giá cácchứng khoán để đa dạng hóa danh mục, giảm thiểu rủi ro (như phương phápFundamental Analysis – phân tích cơ bản; phương pháp Technical Analysis - phân tíchkỹ thuật; ) từ đó đánh giá mức độ hiệu quả của danh mục.

2.3 Lý thuyết của Markowitz và lựa chọn danh mục đầu tư chứng khoán

Mô hình MV – mô hình kỳ vọng phương sai, được phát triển và giới thiệu bởi HarryMarkowitz năm 1952 và được coi là lý thuyết nền tảng trong lựa chọn danh mục đầu tư.Theo lý thuyết của Markowitz, danh mục đầu tư tối ưu là danh mục đảm bảo giữa 2 mụctiêu tối đa hóa lợi nhuận hoặc rủi ro tối thiểu

Trong đó, đường biên hiệu quả: là đường tập hợp các danh mục đầu tư có lợi nhuậnkỳ vọng cao nhất ứng với mỗi một mức rủi ro Mỗi nhà đầu tư sẽ có một mức độ chấp nhậnrủi ro khác nhau, dẫn tới các mức lợi nhuận kỳ vọng cũng khác nhau.

1 4 steps to building a profitable portfolio from Investopedia building-profitable-portfolio/

Trang 5

https://www.investopedia.com/financial-advisor/steps-Đồ thị minh họa đường biên hiệu quả danh mục tài sản rủi ro với trục y là TSSL kỳvọng của danh mục P và trục x là độ lệch chuẩn của P

Theo đó, giả sử danh mục có 2 tài sản rủi ro: Cổ phiếu (E) và Trái phiếu (B) để lựachọn danh mục đầu tư tối ưu, ta có 2 mô hình như sau:

- Mô hình hàm mục tiêu phương sai nhỏ nhất:

🡪 minTrong đó:

σP2 là phương sai của danh mục PWE là tỷ trọng đầu tư của cổ phiếu EWB là tỷ trọng đầu tư của trái phiếu BσB2 là phương sai của trái phiếu BσE2 là phương sai của cổ phiếu E

Cov (rB,rE) là hiệp phương sai giữa 2 tài sản

- Mô hình hàm mục tiêu tối đa hóa thu nhập: Với TSSL kỳ vọng của danh mục P:

🡪 max

2.4 Hệ số Sharpe

Hệ số Sharpe, đo lường tỷ lệ phần bù rủi ro trên một đơn rủi ro Hệ số này giúp nhà đầutư cân nhắc khi phải đánh đổi giữa lợi nhuận và rủi ro, nó càng lớn thì cho thấy danh mụcđầu tư càng hiệu quả (tỷ trọng đầu tư tối ưu) Hệ số Sharpe của một danh mục đầu tư đượctính bằng công thức:

Trang 6

2.5 Lý thuyết về mô hình CAPM

Mô hình CAPM là mô hình định giá tài sản vốn được phát triển bởi William Sharpe,được sử dụng để tính toán tỷ suất sinh lời kỳ vọng của nhà đầu tư cho một tài sản hoặckhoản đầu tư CAPM thực hiện điều này bằng cách sử dụng lợi nhuận kỳ vọng trên cả thịtrường và tài sản phi rủi ro cũng như mối tương quan hoặc độ nhạy cảm của tài sản đó vớithị trường (beta thị trường)

Theo đó, TSSL kỳ vọng theo mô hình CAPM được tính toán bằng công thức:

Có hiểu rằng, danh mục đầu tư được kết hợp giữa các tài sản rủi ro và tài sản phi rủi rosẽ đem lại lợi nhuận kỳ vọng bằng lợi nhuận phi rủi ro cộng thêm với phần bù rủi ro Trongđó phần bù là phần lợi nhuận kỳ vọng tăng thêm so với lợi nhuận phi rủi ro

CHƯƠNG 3: ỨNG DỤNG PYTHON XÂY DỰNG DANH MỤC ĐẦU TƯ HIỆUQUẢ TRÊN THỊ TRƯỜNG CHỨNG KHOÁN VIỆT NAM

3.1 Phạm vi xây dựng danh mục

Xây dựng danh mục căn cứ vào dữ liệu quá khứ, giá cổ phiếu theo các tuần từ tháng 01/2018 tới tháng 12/2022 Lựa chọn danh mục gồm 10 cổ phiếu từ VN30 bao gồm: ACB(Ngân hàng Thương mại Cổ phần Á châu), BID (Ngân hàng TMCP Đầu tư và Phát triển ViệtNam), FPT (Công ty Cổ phần FPT), HDB (Ngân hàng TMCP Phát triển T.P Hồ Chí Minh),HPG (CTCP Tập đoàn Hòa Phát), MBB (Ngân hàng Thương mại cổ phần Quân đội), PLX(Tập đoàn Xăng dầu Việt Nam), SAB (CTCP Bia - Rượu - Nước giải khát Sài Gòn), SSI(CTCP Chứng khoán SSI), VIC (Tập đoàn VINGROUP); và dữ liệu chỉ số VNI (chỉ số thịtrường Vnindex) và sử dụng Python để tính toán, xây dựng danh mục theo lý thuyếtMarkowitz và mô hình CAPM

3.2 Áp dụng lý thuyết Markowitz mô hình MVP

- Để có thể sử dụng Python, đầu tiên thực hiện input khai báo như sau:Input [1]: import numpy as np

import pandas as pd

from pylab import plt, mpl

from scipy.optimize import minimizeplt.style.use('seaborn-v0_8')

mpl.rcParams['savefig.dpi']=300

Trang 7

mpl.rcParams['font.family'] = 'serif'

np.set_printoptions(precision=5, suppress=True,formatter={'float': lambda x: f'{x:6.3f}'})

Giải thích ý nghĩa: nhập (import) các thư viện, các thông tin kiểu vẽ đồ thị và cấu hình tùy

chọn cho việc in ra kết quả Cụ thể:

import numpy as np: nhập thư viện numpy với ký hiệu là np;

import pandas as pd: thư viện pandas với ký hiệu là pd;

frompylabimport plt, mpl: từ module pylab nhập chức năng vẽ đồ thị plt vàmpl (matplotlib)

from scipy.optimize import minimize: Nhập hàm minimize từ module tối ưuhóa (optimize) của SciPy Để thực hiện tìm giá trị nhỏ nhất

plt.style.use('seaborn-v0_8'): khai báo kiểu vẽ đồ thị từ chức năng plt củanumPy, là kiểu seaborn bản v0_8

mpl.rcParams['savefig.dpi']=300: thiết lập độ phân giải hiển thị cho đồ thị là300 điểm (trên mỗi inchs hiển thị) để đảm bảo chất lượng hình ảnh

mpl.rcParams['font.family'] = 'serif':thiết lập font chữ sử dụng cho biểuđồ là serif

lambda x: f'{x:6): khai báo cho cấu hình tùy chọn in của NumPy, trong đó precision =5nghĩa là kết quả đầu ra có mức độ chính xác đến 5 chữ số thập phân; suppress = True: ẩn cácsố lẻ; formatter: độ dài trường in ra là 6 ký tự, lấy sau dấu phẩy 3 chữ số thập phân

- Sử dụng code Python để truy xuất tệp dữ liệu: Input [2]: url='Du lieu VN30 va VNI.csv'

Giải thích ý nghĩa: tạo đối tượng url để chứa tệp dữ liệu (CSV) giá đóng cửa của 10 cổ

phiếu và giá đóng của của chỉ số Vnindex (đã được đưa lên Jupyter notebook)Input [3]: raw = pd.read_csv(url, index_col=0,

Giải thích ý nghĩa: tạo đối tượng raw là một DataFrame, kết quả của hàm pd.read_csv, đọc

dữ liệu từ tệp url đã nhập liệu, trong đó: index_col =0 để chỉ định cột đầu tiên của tệp dữ liệudùng để làm chỉ mục; parse_dates = True để chỉ định các giá trị trong cột chỉ mục được đổisang kiểu dữ liệu dates (ngày tháng năm) và dùng lệnh dropna() để xóa bỏ các hàng chứa giátrị trống.

Input [4]: raw.info()

Output[4]: <class 'pandas.core.frame.DataFrame'>

DatetimeIndex: 259 entries, 2018-01-05 to 2022-12-30Data columns (total 11 columns):

# Column Non-Null Count Dtype - - - - 0 ACB 259 non-null int64

Trang 8

1 BID 259 non-null int64 2 FPT 259 non-null int64 3 HDB 259 non-null int64 4 HPG 259 non-null int64 5 MBB 259 non-null int64 6 PLX 259 non-null int64 7 SAB 259 non-null int64 8 SSI 259 non-null int64 9 VIC 259 non-null int64 10 VNI 259 non-null float64dtypes: float64(1), int64(10)

memory usage: 24.3 KB

Giải thích ý nghĩa: Sử dụng hàm info trong thư viện Pandas để xem thông tin của đối

tượng raw vừa tạo được Ta nhận được kết quả thông tin đối tượng raw như sau:- Đây là một DataFrame với 259 dòng và 11 cột;

- Chỉ mục của DataFrame này có dạng DatetimeIndex với 259 chỉ mục bắt đầu từngày 2018-01-05 tới ngày 2022-12-30

- Các cột của DataFrame này là 10 mã chứng khoán: ACB, BID, FPT, HDB, HPG, MBB, PLX, SAB, SSI, VIC;

- Kiểu dữ liệu là int64 ; và mất 22.3 KB để lưu trữ tệp dữ liệu này.Input [5]: symbols = ['ACB','BID',

Giải thích ý nghĩa: tạo đối tượng symbols là 1 list 10 mã cổ phiếu, để sử dụng cho các phân

tích, tính toán phía sau

- Tính Tỷ suất lợi nhuận của các cổ phiếu: Tỷ suất sinh lời hàng ngày (log returns) làmột phép đo hiệu suất của một khoản đầu tư trong một ngày Nó được tính bằng cách lấylogarit tự nhiên của giá trị của khoản đầu tư tại thời điểm hiện tại chia cho giá trị của khoảnđầu tư tại thời điểm trước đó Ta thực hiện:

Input [6]: rets = np.log(raw[symbols] / raw[symbols].shift(1)).dropna()

Giải thích ý nghĩa: tạo đối tượng rets, trong đó lưu kết quả là 1 DataFrame có các cột chứa

kết quả của hàm np.log tính toán logarit của các giá trị lấy từ:

raw[symbols]: các giá trị của các cột trong đối tượng raw tương ứng với các mã cổ phiếutrong symbols; chia cho

raw[symbols].shift(1): các giá trị của các cột trong đối tượng raw tương ứng với cácmã cổ phiếu trong symbols tại thời điểm trước đó; và sau đó dùng lệnh

dropna() loại bỏ các dòng có giá trị thiếu (NaN).

Input [7]: (raw[symbols] / raw[symbols].iloc[0]).plot(figsize=(10, 6));

Trang 9

Giải thích ý nghĩa: đoạn code này dùng để vẽ biểu đồ thể hiện sự thay đổi giá trị theo thời

gian của các mã cổ phiếu trong danh sách symbols, trong đó các dữ liệu đã được chuẩn hóa.Cụ thể:

- raw[symbols] / raw[symbols].iloc[0]): Thực hiện phép chia giá trị củamỗi phần tử trong các cột raw cho giá trị đầu tiên tương ứng của nó (dùng iloc[0]để lấy giá trị đầu tiên của mỗi cột trong các cột đã chọn) Kết quả là giá trị chuẩnhóa, cho thấy sự thay đổi tương đối của giá trị cổ phiếu so với thời điểm đầu tiên.- plot(figsize=(10, 6)): sau đó thực hiện vẽ biểu đồ với các giá trị cổ phiếu

với kích cỡ biểu đồ là chiều ngang 10 chiều dọc 6 đơn vị.

- Để đạt được mục tiêu đặt đường cơ sở cho hiệu suất được đưa ra bởi danh mục đầu tưcó tỷ trọng các tài sản như nhau trong toàn bộ khoảng thời gian, ta thực hiện các codePython sau đây để xác định các hàm để tính toán lợi nhuận của danh mục đầu tư, độ biếnđộng của danh mục đầu tư và hệ số Sharpe của danh mục đầu tư:

Input [8]: weights = len(rets.columns) * [1 / len(rets.columns)]

Giải thích ý nghĩa: tạo đối tượng weights -1 vector là kết quả tính các trong số cân bằng

nhau, trong đó mỗi trọng số có giá trị bằng 1/ số lượng cột trong DataFrame rets Điềunày đảm bảo được tỷ trọng sẽ cân bằng nhau Cụ thể:

- len(rets.columns): Dùng hàm len để đếm số lượng cột trong rets và trả về kếtquả là một số nguyên Với rets có 10 cột, kết quả sẽ là 10.

- [1 / len(rets.columns)]: danh sách này sẽ chứa 1 phần tử duy nhất là giá trị1/ số lượng cột đếm được trong rets Kết quả sẽ là 1/10 =0.1

- Nhân danh sách 0.1 với số lượng cột là 10 Kết quả nhận được là weights gồm 1dòng và 10 cột

Trang 10

Input [9]: def port_return(rets, weights):

return np.dot(rets.mean(), weights) * 52

Giải thích ý nghĩa: đoạn code này là để khai báo công thức của hàm tính lợi nhuận kỳ vọng,

trong đó:

- def port_return(rets, weights): dùng hàm def định nghĩa cho hàm lợi

nhuận kỳ vọng là port_return với các argument được đưa vào hàm là rets:chứa tỷ suất sinh lợi hàng ngày của các cổ phiếu, weights: chứa trọng số tươngứng với các tài sản trong danh mục đầu tư.

- return np.dot(rets.mean(), weights) * 52: dùng hàm return để trả kếtquả của công thức tính là tích vô hướng (sử dụng np.dot) giữa mảng giá trị trungbình cộng của rets và mảng weights; * 52 là để chuyển đổi dữ liệu lợi nhuậnhàng ngày thành hàng năm (do dữ liệu được thu thập theo tuần, 1 năm giả định có52 tuần).

Như vậy, tóm lại đoạn code khi triển khai công thức của hàm port_return sẽ chạy các bướcnhư sau:

- Nhận dữ liệu từ tỷ suất lợi nhuận (rets) và các trọng số (weights)- Tính trung bình cộng của tỷ suất lợi nhuận hàng ngày cho mỗi tài sản.

- Thực hiện tích vô hướng giữa vector trung bình và vector trọng số để tính lợinhuận kỳ vọng hàng ngày.

- Nhân lợi nhuận kỳ vọng hàng ngày với 52 để chuyển đổi sang lợi nhuận kỳ vọnghàng năm.

- Trả về kết quả lợi nhuận kỳ vọng hàng năm.Input 10 sẽ chạy kết quả của công thức này:

Input [10]: port_return(rets, weights)Output[10] -0.09182403043677012

Giải thích ý nghĩa: Điều này có nghĩa là kết quả tỷ suất sinh lời kỳ vọng của danh mục này

hàng năm là -9,18%

Input [11]: def port_volatility(rets, weights):

return np.dot(weights, np.dot(rets.cov() * 52 , weights)) ** 0.5

Giải thích ý nghĩa: đoạn code này để nhập công thức tính toán độ biến động của danh mục

10 cổ phiếu Trong đó:

- def port_volatility(rets, weights): dùng hàm def để định nghĩa cho

hàm độ biến động của danh mục port_volatility Trong đó, đầu vào của hàmlà rets: chứa tỷ suất sinh lợi hàng ngày của các cổ phiếu, weights: chứa trọngsố tương ứng với các tài sản trong danh mục đầu tư.

Trang 11

- return np.dot(weights, np.dot(rets.cov() * 52 , weights)):dùnghàm return để trả kết quả tính toán phương sai của danh mục, đo lường mức độbiến động dự kiến của lợi nhuận danh mục so với mức trung bình của nó Nhântích vô hướng của

o np.dot(rets.cov() * 52: mảng kết quả tính toán ma trận hiệpphương sai của rets theo năm; với

- Nhận dữ liệu từ tỷ suất lợi nhuận (rets) và các trọng số (weights)

- Tính ma trận hiệp phương sai của danh mục và nhân với 52 để chuyển đổi sangtheo năm.

- Thực hiện tích vô hướng giữa vector hiệp phương sai và vector trọng số lấy cănbậc hai để tính độ lệch chuẩn – biến động của lợi nhuận

- Trả về kết quả tính độ biến động của lợi nhuận danh mục 10 cổ phiếu.Input 12 sẽ chạy kết quả của công thức này:

Input [12]: port_volatility(rets, weights)Output[12]: 0.26253260925188804

Giải thích ý nghĩa: Điều này có nghĩa là kết quả độ lệch chuẩn của danh mục này hàng năm

là 26,3%

Input [13]: def port_sharpe(rets, weights):

return port_return(rets, weights) / port_volatility(rets, weights)

Giải thích ý nghĩa: đoạn code này để nhập công thức tính toán hệ số Sharpe của danh mục.

Trong đó:

- def port_sharpe(rets, weights)dùng hàm def để định nghĩa cho hàm hệsố Sharpe port_sharpe Trong đó, đầu vào của hàm là rets: chứa tỷ suấtsinh lợi hàng ngày của các cổ phiếu, weights: chứa trọng số tương ứng với các tàisản trong danh mục đầu tư.

- return port_return(rets, weights) / port_volatility(rets,weights):dùng hàm return để trả kết quả cho phép chia của tỷ suất lợi nhuậnhàm port_return(rets, weights) và độ biến động hay độ lệch chuẩn củadanh mục port_volatility(rets, weights)

Input 14 sẽ chạy kết quả của công thức này:

Input [14]: port_sharpe(rets, weights)

Trang 12

Output[14]: -0.34976238075121996

Giải thích ý nghĩa: Điều này có nghĩa là kết quả hệ số Sharpe của danh mục này hàng năm

là -34,9% Cho thấy, danh mục này không hiệu quả trong việc tạo ra lợi nhuận so với rủi romà nó mang lại.

- Để phân tích và biểu diễn những kết hợp giữa rủi ro và lợi nhuận danh mục đầu tư,thực hiện áp dụng mô phỏng Monte Carlo để ngẫu nhiên hóa trọng số của danh mục đầu tư,thể hiện tỷ lệ Sharpe của danh mục Ta thực hiện đoạn code Python sau:

Input [15]: w = np.random.random((1000, len(symbols))) w = (w.T / w.sum(axis=1)).T

Giải thích ý nghĩa: thực hiện mô phỏng trọng số danh mục đầu tư cộng lên tới 100% Cụ

thể

- w = np.random.random((1000, len(symbols))): tạo đối tượng w là một matrận ngẫu nhiên có kích thước 1000 hàng và số cột bằng số ký tự trong symbols là10 cột

- w = (w.T / w.sum(axis=)).T: dùng lệnh Transpose đểK chuyểKn hàngthành cột cuKa ma trận w và ngược lại, Sau đó, ma trận này được chuẩnhóa để tổng các phần tử trên mỗi hàng bằng 1 (100%)

Input 16 sẽ truy xuất 5 dòng đầu tiên của đối tượng wInput [16]: w[:5]

Output[16]: array([[ 0.088, 0.105, 0.089, 0.143, 0.145, 0.196, 0.036, 0.021,0.106, 0.070],

[ 0.172, 0.020, 0.178, 0.156, 0.061, 0.166, 0.103, 0.015,0.120, 0.010],

[ 0.168, 0.131, 0.121, 0.200, 0.012, 0.076, 0.163, 0.006,0.004, 0.120],

[ 0.081, 0.021, 0.115, 0.124, 0.153, 0.003, 0.144, 0.106,0.090, 0.163],

[ 0.035, 0.095, 0.037, 0.100, 0.170, 0.126, 0.112, 0.090,0.080, 0.155]])

Input [17]: pvr = [(port_volatility(rets[symbols], weights), port_return(rets[symbols], weights))

for weights in w]pvr = np.array(pvr)

Giải thích ý nghĩa:

Trang 13

pvr=[(port_volatility(rets[symbols],weights),port_return(rets[symbols], weights)): để tạo đối tượng pvr là 1 list các cặp giá trị của hàmport_volatility và port_return hay cặp giá trị tỷ lệ biến động và lợi nhuận của cácdanh mục cổ phiếu đã được lưu trong symbols Sau đó dùng lệnh for weights in w đểchạy vòng lặp cho weights qua mỗi tập hợp trọng số trong mảng w, chứa các trọng số ngẫunhiên để tạo 1000 danh mục Sau đó, pvr = np.array(pvr): chuyển đối tượng pvr là 1list thành mảng numpy pvr là 1 vector 2 chiều.

Input [18]: psr = pvr[:, 1] / pvr[:, 0]

Giải thích ý nghĩa: mục đích của input này là để tính toán hệ số Sharpe của mỗi danh

mục đầu tư trong mảng pvr và lưu trữ kết quả trong đối tượng tên là psr Cụ thể nhưsau: lấy tất cả các phần tử cột thứ 2 của pvr chứa các giá trị tỷ suất sinh lời kỳ vọng củadanh mục đầu tư chia cho các phần tử của cột đầu tiên của pvr chứa các độ lệch chuẩn củadanh mục đầu tư

- Với kết quả tính tỷ lệ Sharpe tại input 18, ta thực hiện vẽ biểu đồ biểu diễn sự phântán thể hiện sự đánh đổi rủi ro-lợi nhuận của các danh mục đầu tư như sau:

Input [19]: plt.figure(figsize=(10, 6))

fig = plt.scatter(pvr[:, 0], pvr[:, 1], c=psr, cmap='coolwarm')cb = plt.colorbar(fig)

cb.set_label('Sharpe ratio')plt.xlabel('expected volatility')plt.ylabel('expected return')plt.title(' | '.join(symbols));

Trang 14

Giải thích ý nghĩa:

Vẽ biểu đồ với trục x thể hiện độ lệch chuẩn (rủi ro) dự kiến (expected volatility) củadanh mục đầu tư và trục y thể hiện tỷ suất sinh lời dự kiến (expected return) của danh mụcđầu tư Mỗi điểm trên biểu đồ đại diện cho một danh mục đầu tư cụ thể Màu sắc của mỗiđiểm thể hiện tỷ lệ Sharpe của danh mục đầu tư đó Cụ thể, thực hiện các bước sau:

-plt.figure(figsize=(10, 6)): tạo biểu đồ mới với kích thước 10 x 6 đơn vị-fig=plt.scatter(pvr[:,0],pvr[:,1],c=psr,cmap='coolwarm'): dùng lệnhscatter của matplotlib để tạo một biểu đồ độ phân tán với các giá trị pvr[:,0] là cácphần tử của cột đầu tiên trong pvr - độ lệch chuẩn dự kiến của danh mục đầu tư;pvr[:,1] là các phần tử của cột thứ hai trong pvr thể hiện các tỷ suất lợi nhuận dựkiến; c=psr để tô màu cho các điểm tỷ lệ Sharpe của danh mục đầu tư,cmap='coolwarm': để sử dụng bản đồ đổ màu từ xanh lam đến đỏ phụ thuộc vào tỷ lệSharpe cao hay thấp (xanh là tỷ lehe thấp và đỏ là tỷ lệ Sharpe cao.

cb.set_label('Sharpe ratio'): đoạn mã Python này để thêm thanh màu vào bên phải của biểu đồ để thể hiện mức độ của tỷ lệ Sharpe Và đặt tên cho thanh biểu diễn là Sharpe ratio

-plt.xlabel('expected volatility')plt.ylabel('expected return')

plt.title(' | '.join(symbols)):

đoạn mã Python này để thêm label cho trục x là expected volatility – độ biến động dựkiến; trục y là expected return là tỷ suất sinh lời kỳ vọng; thêm title cho các mã cổphiếu trong symbols và ngăn cách bởi ký hiệu |

Biểu đồ phân tán này cho thấy các danh mục đầu tư với độ biến động dự kiến cao hơnsẽ đem lại lợi nhuận cao hơn, phù hợp với lý thuyết Markowitz “high risk – high return”.Các nhà đầu tư có thể sử dụng biểu đồ này để phân tích, lựa chọn các danh mục đầu tư có sựkết hợp các tài sản, cổ phiếu phù hợp với khẩu vị rủi ro cũng như mục tiêu của mình

Ngày đăng: 05/06/2024, 15:27