Tài liệu Tối ưu hóa danh mục đầu tư chứng khoán bằng VBA for Excel doc - Pdf 10

Giải bài toán Markowitz:
Tối ưu hóa danh mục đầu tư chứng khoán bằng VBA for Excel
/>Harry Markowitz đã mô hình hóa quá trình lựa chọn danh mục đầu tư (nhờ đó đoạt giải Nobel kinh tế
năm 1990) dưới dạng một bài toán quy hoạch phi tuyến (bài toán Markowitz). Mục tiêu của bài toán
Markowitz là tìm các tỉ trọng của các chứng khoán trong danh mục đầu tư sao cho giảm tới mức tối thiểu
phương sai (rủi ro) của danh mục mà đạt được một mức thu nhập đã định. Giải liên tiếp bài toán với các
mức thu nhập mục tiêu người ta xác định được một tập hợp các danh mục đầu tư có hiệu quả. Từ đây
nhà đầu tư sẽ lựa chọn một danh mục nằm trong tập hợp này dựa trên quan điểm của mình về việc đánh
đổi giữa thu nhập và rủi ro.
Tìm
Với hệ ràng buộc
Trong đó:
Phương sai thu nhập của danh mục đầu tư
X
i

Tỉ trọng của chứng khoán thứ i trong danh mục đầu
tư gồm n chứng khoán; do thị trường chứng khoán
nước ta chưa cho phép bán khống.
(Nếu cho phép bán khống thì bài toán được giải
bằng phương pháp Lagrange và rủi ro của danh
mục tối ưu còn giảm nhiều hơn, bài toán Markowitz
kinh điển không có điều kiện này)

r
i
Thu nhập kỳ vọng của chứng khoán thứ i
Thu nhập dự tính của toàn bộ danh mục đầu tư
1
Tôi đã viết một chương trình nhỏ bằng VBA for Excel để giải bài toán Markowitz. Qua tạp chí TGVT giới
thiệu để các bạn cùng xem xét và sửa đổi chương trình hiệu quả hơn.

2
(dữ liệu trích từ trang web />Taichinh/Quihoach/Mohinhhoa_Dubao/5673.saga)

1. Function Sol(Var As
Range, R As Range,
RConst As Double, idx
As Integer) As Double

• Hàm lấy dữ liệu, tính
phương án khởi tạo, tạo lập
vector Gradien của f(xo), gọi
hàm “donhinh” để tìm x
k
; tìm
lamda l, tính toán x
k+1
.
• Trả về tỷ trọng tối ưu của
chứng khoán thứ “idx” trong
danh mục

• “Var” bảng dữ liệu về ma trận
phương sai;
• ”R” bảng dữ liệu về vector thu
nhập kỳ vọng của các chứng
khoán,
• “Rconst” thu nhập mục tiêu của
danh mục,
• “idx” số thứ tự của chứng khoán
cần tính tỷ trọng

• Gra() vector gradien của hàm f(x)4. Function Lamda(X()
As Double, DX() As
Double, Var() As
Double) As Double

• Hàm trả về nhân tố lamda l
để từ đó chuyển sang một
phương án phân bổ chứng
khoán mới tốt hơn

• X() vector phương án đang xét Xo
• DX() là vector hiệu của phương
án Xk và Xo
• Var() ma trận hiệp phương sai các
chứng khoán5. Sub SetXnew(X() As
Double, Lamda As
Double, DX() As
Double, X_new() As
Double)

• Thủ tục trả về phương án
tốt hơn vào mảng X_new()

• X() vector phương án đang xét Xo

Integer, simplex() As
Double)

• Thủ tục lập phương án cực
biên của bài toán quy hoạch
tuyến tính rồi gán vào mảng
X()

• X() phương án cực biên trả về
• Base() mảng chỉ tới các cột cơ sở
của bảng đơn hình
• Simplex() mảng 2 chiều ứng bảng
đơn hình của bài toán quy hoạch
tuyến tính

3

8. Function
TestDelta(Delta() As
Double, X() As Double,
base() As Integer,
C_matrix() As Double,
simplex() As Double,
nv As Integer) As
Integer

• Hàm tính các Delta của bài
toán đơn hình rồi gán vào
mảng Delta()
• Kiểm tra điều kiện tối ưu

As Double, V_in As
Integer, nv As Integer)

• Thủ tục biến đổi bảng đơn
hình nhằm tìm ra phương án
cực biên tốt hơn

• base() mảng chỉ tới các cột cơ sở
của bảng đơn hình
• Simplex() là bảng đơn hình
• V_in là biến mới được đưa vào cơ
sở
• Nv là chỉ số mà Base(nv) trỏ tới
phải ra khỏi cơ sở10. Function Min(arr()
As Double) As Integer

• Hàm trả về chỉ số của phần
tử dương nhỏ nhất trong
mảng
• arr() mảng 1 chiều

11. Function Max(arr()
As Double) As Integer

• Hàm trả về chỉ số của phần
tử lớn nhất trong mảng
• arr() mảng 1 chiều

• X() mảng 1 chiều
• Y() ma trận
• M chỉ số dòng của ma trận được
nhân15. Sub SetDX(DX()
As Double, X_cu() As
Double, X_moi() As
Double)

• Thủ tục trả về hiệu của hai
vector X_cu() và X_moi() vào
vector DX() 16. Sub SetEqual(X()
As Double, Y() As
Double

• Thủ tục đặt vector X() bằng
với vector Y()

17. Sub SetB(b() As
Double, n As Integer,
RConst As Double)
• Thủ tục gán giá trị cho
vector b() của bài toán đơn
hình
• B() vector ràng buộc của bài toán

• C() vector mục tiêu của bài toán
đơn hình
• N chính bằng số chứng khoán
• G() vector gradien của hàm f(x)20. Public Function
Varience(Var_matrix
As Range, W_matrix
As Range) As Double

• Hàm trả về phương sai của
danh mục đầu tư

• Var_matrix là bảng ma trận
phương sai/hiệp phương sai
• W_matrix phương án phân bổ các
chứng khoán

• Vùng từ B3:F3 là các tham số về thu nhập kỳ vọng (trung bình) chứng khoán
Tại ô B3 công thức =AVERAGE(AGF)
Tại ô C3 công thức =AVERAGE(GIL)
Tại ô D3 công thức =AVERAGE(GMD)
Tại ô E3 công thức =AVERAGE(NKD)
Tại ô F3 công thức=AVERAGE(REE)
• Vùng từ B4:F4 là các tham số về độ lệch chuẩn về thu nhập của chứng khoán
Tại ô B4 công thức =SQRT(VAR(AGF))
Tại ô C4 công thức = SQRT(VAR(GIL))
5
Tại ô D4 công thức = SQRT(VAR(GMD))

mục đầu tư Y ở vùng D13:F13 (AGF=26,7%;GIL=17,4%;GMD=21,2%;NKD=11,4%;REE=23,3%) có thu
7
nhập là 7% và độ lệch chuẩn là 15,04%; danh mục này hiệu quả hơn danh mục Z gồm 100% chứng
khoán GMD có thu nhập 7% và độ lệch chuẩn 24,2%. Có thể nói danh mục Y chi phối danh mục Z. Các
danh mục đầu tư bị chi phối bởi các danh mục đầu tư khác gọi là “các danh mục đầu tư kém hiệu quả”.
Tập hợp hiệu quả là một phần của danh mục đầu tư khả dĩ có độ lệch chuẩn tối thiểu sau khi cắt bỏ các
danh mục đầu tư kém hiệu quả. Để làm rõ hơn điều này ta chọn vùng A3:C23 để vẽ biểu đồ có dạng,
như sau:
Ta thấy ngay danh mục đầu tư nằm trên đoạn BC chính là đường danh mục đầu tư hiệu quả. Đây là các
danh mục tốt nhất bởi vì không thể tìm được một danh mục nào khác tốt hơn về thu nhập mà lại không
phải hy sinh về rủi ro (độ lệch) và ngược lại không thể tìm một danh mục nào khác có rủi ro ít hơn mà
không phải hy sinh về thu nhập. Các danh mục đầu tư nằm phía dưới đoạn BC là không hiệu quả vì cùng
một mức rủi ro nhưng lại có thu nhập thấp hơn. Nhà đầu tư thông minh sẽ lựa chọn một danh mục nào
đó nằm trên đường BC dựa trên quan điểm của anh ta về việc đánh đổi giữa thu nhập và rủi ro.
Nguyễn Văn Thắng
Công ty hợp danh Kiểm toán Hà Nội

8


Nhờ tải bản gốc

Tài liệu, ebook tham khảo khác

Music ♫

Copyright: Tài liệu đại học © DMCA.com Protection Status