1. Trang chủ
  2. » Tài Chính - Ngân Hàng

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

8 1K 4

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

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 8
Dung lượng 216 KB

Nội dung

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 đ

Trang 1

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

http://www.pcworld.com.vn/pcworld/magazine_a.asp?t=mzdetail&atcl_id=5f5e5d5d5d5d5f

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ư

Xi

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)

ri 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ư

Trang 2

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

THUẬT TOÁN

Phương pháp giải: Tham khảo phương pháp “Gradien” và “đơn hình” trong giáo trình “Tối ưu hóa” – Nhà xuất bản khoa học kỹ thuật của PGS.TS Bùi Minh Trí

Bước 1 : Tìm phương án đầu tiên xo

Bước 2 : Tính các đạo hàm riêng của f(x) tại xo

Bước 3 : Khởi tạo vector ma trận cho bài toán đơn hình

Bước 4 : Sử dụng thuật toán đơn hình hai pha để giải

bài toán đơn hình để tìm hướng di chuyển xk

Bước 5 : Kiểm tra điều kiện tối ưu của bài toán

Markowitz

Bước 6 : Nếu chưa tìm thấy lời giải, tính nhân tố l,

tính xk+1, đặt xo=xk+1 rồi quay trở lại bước 2

CHƯƠNG TRÌNH

Chương trình gồm 20 hàm viết bằng VBA for Excel

được tóm tắt trong bảng bên dưới Bạn đọc có thể tải

file “Solution for Markowitz.xls” tại website của TGVT

để xem chi tiết mã nguồn (mở Tools\Macro\Visual

Basic Editor để xem)

HƯỚNG DẪN SỬ DỤNG

Dữ liệu

Giả sử chúng ta xem xét việc thiết lập danh mục đầu

tư từ 5 mã chứng khoán và có bảng dữ liệu về thu

nhập từ tháng 12/2004 đến 7/2007 tại sheet Dulieu

vùng B2:F33 như sau:

Để thuận lợi cho việc tính toán ta định nghĩa các vùng dữ liệu bằng chọn Insert\Name\Define như sau: AGF=dulieu!$B2$B33; GIL=dulieu!$C2$C33; GMD=dulieu!$D2$D33; NKD=dulieu!$E2$E33; REE

=dulieu!$F2$F33

Thiết lập các tham số

Tham số được thiết lập tại sheet thamso, như sau:

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 xk; tìm

• “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 (dữ liệu trích từ trang web http://www.saga.vn/ Taichinh/Quihoach/Mohinhhoa_Dubao/5673.saga)

Trang 3

lamda l, tính toán xk+1.

• Trả về tỷ trọng tối ưu của chứng khoán thứ “idx” trong danh mục

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

2 Sub FirstSol(R() As

Double, X() As Double,

RConst As Double)

• Thủ tục lập phương án đầu tiên của bài toán Markowit (phương án này chỉ bao gồm

2 chứng khoán)

• R() vector thu nhập kỳ vọng của các chứng khoán

• X() vector trả về của phương án

• Rconst thu nhập mục tiêu của chứng khoán

3 Sub SetGradien(X()

As Double, Var() As

Double, Gra() As

Double)

• Thủ tục tính các đạo hàm riêng của hàm f(x) rồi gán

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

• Var() (mảng 2 chiều) ma trận hiệp phương sai các chứng khoán

• 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án

5 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

• Lamda là nhân tố lamda l

• DX() là vector hiệu của phương

án Xk và Xo

• X_new() phương án tốt hơn trả về

6 Function

donhinh(a() As

Double, b() As Double,

C() As Double, X() As

Double) As Boolean

• Hàm giải bài toán quy hoạch tuyến tính theo thuật toán đơn hình 2 pha

• Trở về True nếu giải được bài toán

Phương án tối ưu được trả

về mảng X()

• A() mảng hai chiều ứng với ma trận tham số của bài toán đơn hình

• B() mảng 1 chiều ứng với vector ràng buộc

• C() mảng 1 chiều ứng với vetor của hàm mục tiêu

7 Sub SetXVector(X()

As Double, base() As

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

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 của bài toán đơn hình

• Kiểm tra sự không giải được của bài toán đơn hình

• Chỉ ra hướng để chuyển đổi bảng đơn hình tốt hơn bằng cách trả về số thứ tự của Delta lớn nhất( chính là biến cần phải đưa vào cơ sở của bảng đơn hình) và đặt giá trị cho biến nv (giá trị mà Base(nv) chỉ tới là biến phải đưa khỏi cơ sở của bảng đơn hình)

• Delta() vector các Delta của bảng đơn hình đang xét

• X() phương án cực biên đang xét base() mảng chỉ tới các cột cơ sở của bảng đơn hình

• C_matrix() vector của hàm mục tiêu của bài toán đơn hình

• Simplex() là bảng đơn hình

• nv là giá trị mà Base(nv) chỉ tới chính là biến phải đưa khỏi cơ sở của bảng đơn hình)

Trang 4

9 Sub

ChangeSimplex(base()

As Integer, simplex()

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

11 Function Max(arr()

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

12 Function Min2(arr()

As Double) As Integer • Hàm trả về chỉ số của phầntử nhỏ nhất trong mảng • arr() mảng 1 chiều

13 Function

SumProduct(X() As

Double, Y() As

Double) As Double

• Hàm trả về tích vô hướng của 2 vector • X() mảng 1 chiều• Y() mảng 1 chiều

14 Function

SumSuper(X() As

Double, Y() As Double,

m As Integer) As

Double

• Hàm trả về tích vô hướng của 1 vector và 1 dòng của 1

• X() mảng 1 chiều

• Y() ma trận

• M chỉ số dòng của ma trận được nhân

15 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ằngvớ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

• B() vector ràng buộc của bài toán đơn hình

• N chính bằng số chứng khoán

• Rconst thu nhập mục tiêu của danh mục chứng khoán

18 Sub SetA(a() As

Double, n As Integer,

R() As Double

• Thủ tục gán giá trị cho mảng 2 chiều a() của bài

• A() ma trận tham số của bài toán đơn hình

• N chính bằng số chứng khoán

• R() vector thu nhập kỳ vọng của các chứng khoán

19 Function SetC(C()

As Double, n As

Integer, G() As

Double)

• Thủ tục gán giá trị cho vector c() của bài toán đơ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ủadanh 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

Trang 5

• 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))

Tại ô D4 công thức = SQRT(VAR(GMD))

Tại ô E4 công thức = SQRT(VAR(NKD))

Tại ô F4 công thức= SQRT(VAR(REE))

• Vùng từ B9:F13 là ma trận phương sai/hiệp phương sai của thu nhập của các chứng khoán Tại ô B9 là phương sai của chứng khoán AGF; công thức =VAR(AGF)

Tại ô C10 phương sai của chứng khoán GIL; công thức =VAR(GIL)

Tại ô D11 phương sai của chứng khoán GMD; công thức =VAR(GMD)

Trang 6

Tại ô E12 phương sai của chứng khoán NKD; công thức =VAR(NKD)

Tại ô F13 phương sai của chứng khoán REE; công thức =VAR(REE)

Tại ô B10 là hiệp phương sai của chứng khoán AGF và GIL; công thức =COVAR(AGF;GIL)

Tại ô C9 là hiệp phương sai của chứng khoán GIL và AGF; công thức =COVAR(AGF;GIL)

Tại ô B11 là hiệp phương sai của chứng khoán AGF và GMD; công thức =COVAR(AGF;GMD) Tương tự như vậy ta điền hết công thức vào các ô còn trống

• Ta tiếp tục định nghĩa các vùng dữ liệu sau cho tiện việc tính toán (bằng Insert\Name\Define) Thunhap=thamso!$B$3:$F$3;phuongsai= thamso!$B$9:$F$13

Xử lý bài toán

• Vùng từ D3:H23 là các tính toán xử lý của chúng ta về tỷ trọng phân bổ chứng khoán, ví dụ: Tại ô D4 công thức =sol(phuongsai;thunhap;A4;1)

Tại ô E4 công thức =sol(phuongsai;thunhap;A4;2)

Trang 7

Tại ô F4 công thức =sol(phuongsai;thunhap;A4;3)

Tại ô G4 công thức =sol(phuongsai;thunhap;A4;4)

Tại ô F4 công thức =sol(phuongsai;thunhap;A4;5)

Tương tự ô G22 công thức =sol(phuongsai;thunhap;A22;4)

• Vùng B3:B23 là tính toán về phương sai của danh mục, ví dụ:

tại ô B2 có công thức =varience(phuongsai;D2:F2)

tại ô B22 có công thức =varience(phuongsai;D22:F22)

• Vùng C3:C23 là tính toán về độ lệch chuẩn của danh mục:

tại ô C2 công thức=SQRT(B2)

tại ô C22 công thức=SQRT(B22)

Thông qua kết quả tính toán ta thấy ngay được hiệu của việc đa dạng hóa danh mục đầu tư, ví dụ danh 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 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:

Trang 8

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

Thang_via@yahoo.com

Ngày đăng: 26/01/2014, 13:20

HÌNH ẢNH LIÊN QUAN

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) - Tài liệu Tối ưu hóa danh mục đầu tư chứng khoán bằng VBA for Excel doc
arry 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) (Trang 1)
Phương pháp giải: Tham khảo phương pháp “Gradien” và “đơn hình” trong giáo trình “Tối ưu hóa” – Nhà xuất bản khoa học kỹ thuật của PGS.TS Bùi Minh Trí. - Tài liệu Tối ưu hóa danh mục đầu tư chứng khoán bằng VBA for Excel doc
h ương pháp giải: Tham khảo phương pháp “Gradien” và “đơn hình” trong giáo trình “Tối ưu hóa” – Nhà xuất bản khoa học kỹ thuật của PGS.TS Bùi Minh Trí (Trang 2)
• “Var” bảng dữ liệu về ma trận phương sai; - Tài liệu Tối ưu hóa danh mục đầu tư chứng khoán bằng VBA for Excel doc
ar ” bảng dữ liệu về ma trận phương sai; (Trang 3)
• Delta() vector các Delta của bảng đơn hình đang xét - Tài liệu Tối ưu hóa danh mục đầu tư chứng khoán bằng VBA for Excel doc
elta () vector các Delta của bảng đơn hình đang xét (Trang 4)
hình - Tài liệu Tối ưu hóa danh mục đầu tư chứng khoán bằng VBA for Excel doc
h ình (Trang 5)
• 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 - Tài liệu Tối ưu hóa danh mục đầu tư chứng khoán bằng VBA for Excel doc
ar _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 (Trang 5)

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w