Lời đầu tiên, em xin gửi lời cảm ơn đến các thầy cô của trường Đại học Tài chính – Marketing, đặc biệt là các thầy cô bộ môn Khoa Kinh tế - Luật đã tận tình giảng dạy và chỉ dẫn em trong quá trình học tập vừa qua. Và em xin chân thành cảm ơn thầy Trần Mạnh Tường đã giúp đỡ, hướng dẫn em hoàn thành bài tiểu luận môn Mô phỏng ngẫu nhiên này một cách tốt nhất. Em xin chúc thầy cô có nhiều sức khỏe, hạnh phúc và thành công trên con đường sự nghiệp của mình.
Trong quá trình hoàn thành tiểu luận em khó tránh khỏi nhiều thiếu sót, em rất mong nhận được những ý kiến đóng góp từ thầy cô, từ đó giúp em hoàn thiện, học hỏi thêm được nhiều kinh nghiệm và củng cố thêm kiến thức của mình.
Lời cuối cùng, em xin kính chúc thầy, cô thật nhiều sức khỏe, đạt được nhiều thành công và phát triển.
Em xin chân thành cảm ơn!
Trong đầu tư, để đưa ra quyết định đầu tư vào các tài sản, các nhà đầu tư thường quan tâm đến hai yếu tố quan trọng: lợi nhuận dự kiến thu được và mức độ rủi ro. Thông thường, các tài sản có lợi nhuận càng cao thì rủi ro càng lớn, và dĩ nhiên các nhà đầu tư luôn muốn hạn chế các rủi ro ấy. Ở các quốc gia có thị trường chứng khoán phát triển, từ rất lâu các nhà đầu tư đã biết áp dụng nguyên tắc “không để tất cả trứng vào cùng một giỏ”, thông qua việc kết hợp các loại tài sản khác nhau để hạn chế rủi ro. Danh mục đầu tư chính là sự kết hợp nắm giữ các loại chứng khoán, hàng hóa, bất động sản, các công cụ tương đương tiền mặt hay các tài sản khác bởi một cá nhân hay một tổ chức đầu tư; mục đích của danh mục đầu tư là làm giảm thiểu rủi ro bằng việc đa dạng hóa đầu tư.
Bài toán tối ưu danh mục đầu tư là bài toán có ý nghĩa quan trọng và nhận được sự quan tâm của các nhà đầu tư trên toàn thế giới. Lý thuyết tối ưu hóa danh mục đầu tư được khởi nguồn từ những nghiên cứu đầu tiên của Harry Markowitz năm 1952. Từ đó, rất nhiều các nghiên cứu tiếp tục được đưa ra, nhằm giải quyết hai vấn đề chính: mô hình một cách đầy đủ bài toán lựa chọn danh mục đầu tư trong thực tế với các rủi ro và các ràng buộc; tính hiệu quả, cụ thể là khả năng giải quyết bài toán cỡ lớn, khi số lượng tài sản và kịch bản đầu tư cần xem xét là rất nhiều
Vì thế em quyết định chọn đề tài “Mô phỏng danh mục đầu tư tối ưu cho nhóm ngành chứng khoán”.
Mục tiêu đầu tiên và quan trọng nhất của việc tối ưu hóa danh mục đầu tư là tối đa hóa lợi nhuận trên một mức rủi ro nhất định. Điều này được thể hiện thông qua biểu đồ đường biên hiệu quả. Danh mục đầu tư tốt nhất sẽ là danh mục mang lại lợi nhuận kỳ vọng cao nhất cho một mức rủi ro hoặc có mức rủi ro thấp nhất cho một khoản lợi nhuận cố định. Vì vậy các nhà đầu tư theo đuổi quá trình tối ưu hóa danh mục đầu tư thường có khả năng đạt được lợi nhuận cao cho các nhà đầu tư.
Danh mục đầu tư giá cổ phiếu của nhóm ngành chứng khoán bao gồn các mã: AGR, APG, BSI, CTS, FTS, HCM, SSI.
Thời gian thu thập từ 1/1/2022 đến 31/7/2023
Nội dung bài tiểu luận bao gồm:
Chương 1: Phần mở đầu
Chương 2: Tổng quan lý thuyết
Chương 3: Dữ liệu nghiên cứu và mô hình đề xuất
Chương 4: Kết quả nghiên cứu
Chương 5: Kết luận
Lý thuyết danh mục đầu tư hiện đại (Modern portfolio theory - MPT) được Harry Markowitz xây dựng vào năm 1952. Lý thuyết MPT giải quyết vấn đề căn bản trong lĩnh vực Quản lý danh mục đầu tư: Cho một danh mục các tài sản, cần phải phân bổ làm sao để được một danh mục là tối ưu. Lý thuyết này sẽ xem xét danh mục dưới hai khía cạnh: lợi nhuận và rủi ro (được đại diện bởi giá trị kỳ vọng và phương sai của danh mục2). Danh mục được xem là hiệu quả hơn nếu có lợi nhuận lớn hơn và rủi ro nhỏ hơn.
Cơ sở lý thuyết
Giả sử danh mục gồm các tài sản (có rủi ro). Ứng với một bộ trọng số (còn gọi là một chiến lược đầu tư) ta có một cặp giá trị (lợi nhuận, rủi ro); hình biểu diễn các cặp giá trị này là hình lồi về bên trái:
knitr::include_graphics("D:/MARKOWITZ1.png")
Hình trên minh họa cho trường hợp danh mục có 3 cổ phiếu A, B, C. Tập tất cả những điểm nằm trong hình lồi gọi là điểm chấp nhận được - ứng với một danh mục được thành lập từ 3 cổ phiếu A, B, C. Điểm R ứng với danh mục có rủi ro nhỏ nhất.
Biên hiệu quả: Đường biên phía trên điểm R của hình lồi được gọi là biên hiệu quả. Mỗi điểm nằm trên biên hiệu quả ứng với một danh mục hiệu quả, chẳng hạn danh mục Q - không có danh mục nào lợi nhuận cao hơn Q mà đồng thời rủi ro nhỏ hơn Q.
Hiệu ứng đa dạng hóa: Lý thuyết MPT cổ súy cho chiến thuật đa dạng hóa trong đầu tư (còn gọi là “không nên bỏ tất cả trứng vào một giỏ”). Chẳng hạn, bằng cách đầu tư vào cả ba cổ phiểu A, B, C ta thu được danh mục R có rủi ro nhỏ hơn là đầu tư vào một cổ phiếu.
Nguyên lý “No free lunch”: Lý thuyết MPT cũng là một minh họa tốt cho khái niệm “No free lunch” trong tài chính. Chẳng hạn, so với danh mục hiệu quả Q, ta có thể tìm được danh mục hiệu quả khác có rủi ro thấp hơn nhưng lợi nhuận lại giảm đi; và ngược lại.
library(readxl)
library(DT)
## Warning: package 'DT' was built under R version 4.3.1
gia <- read_excel("D:/dataCK.xlsx")
gia
Bộ dữ liệu bao gồm 391 quan sát và 7 biến. Dữ liệu được thu thập từ ngày 1/1/2022 đến 31/7/2023.
Đơn vị: ngàn đồng
Biến AGR: là mã chứng khoán của Công ty Cổ phần Chứng khoán Agribank
Biến APG: là mã chứng khoán của Công ty Cổ phần Chứng khoán APG
Biến BSI: là mã chứng khoán của Công ty Cổ phần Chứng khoán Ngân hàng Đầu tư và Phát triển Việt Nam
Biến CTS: là mã chứng khoán của Công ty Cổ phần Chứng khoán Ngân hàng Công thương Việt Nam
Biến FTS: là mã chứng khoán của Công ty Cổ phần Chứng khoán FPT
Biến HCM: là mã chứng khoán của Công ty Cổ phần Chứng khoán Thành Phố Hồ Chí Minh
Biến SSI: là mã chứng khoán của Công ty Cổ phần Chứng khoán SSI
Biểu đồ tình hình biến động giá của các cổ phiếu nhóm ngành chứng khoán
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.3.1
ggplot(gia) +
geom_line(aes(x = gia$Ngày, y = gia$AGR, color = "AGR")) +
geom_line(aes(x = gia$Ngày, y = gia$APG, color = "APG")) +
geom_line(aes(x = gia$Ngày, y = gia$BSI, color = "BSI")) +
geom_line(aes(x = gia$Ngày, y = gia$CTS, color = "CTS")) +
geom_line(aes(x = gia$Ngày, y = gia$FTS, color = "FTS")) +
geom_line(aes(x = gia$Ngày, y = gia$HCM, color = "HCM")) +
geom_line(aes(x = gia$Ngày, y = gia$SSI, color = "SSI")) +
labs(x = "Time", y = "price", title = "stock price", color = "stock price") +
scale_color_manual(values = c("AGR" = "deepskyblue4", "APG" = "brown", "BSI" = "darkseagreen", "CTS" = "goldenrod4", "FTS" = "cyan", "HCM" = "pink", "SSI" = "darkgreen"))
## Warning: Use of `gia$Ngày` is discouraged.
## ℹ Use `Ngày` instead.
## Warning: Use of `gia$AGR` is discouraged.
## ℹ Use `AGR` instead.
## Warning: Use of `gia$Ngày` is discouraged.
## ℹ Use `Ngày` instead.
## Warning: Use of `gia$APG` is discouraged.
## ℹ Use `APG` instead.
## Warning: Use of `gia$Ngày` is discouraged.
## ℹ Use `Ngày` instead.
## Warning: Use of `gia$BSI` is discouraged.
## ℹ Use `BSI` instead.
## Warning: Use of `gia$Ngày` is discouraged.
## ℹ Use `Ngày` instead.
## Warning: Use of `gia$CTS` is discouraged.
## ℹ Use `CTS` instead.
## Warning: Use of `gia$Ngày` is discouraged.
## ℹ Use `Ngày` instead.
## Warning: Use of `gia$FTS` is discouraged.
## ℹ Use `FTS` instead.
## Warning: Use of `gia$Ngày` is discouraged.
## ℹ Use `Ngày` instead.
## Warning: Use of `gia$HCM` is discouraged.
## ℹ Use `HCM` instead.
## Warning: Use of `gia$Ngày` is discouraged.
## ℹ Use `Ngày` instead.
## Warning: Use of `gia$SSI` is discouraged.
## ℹ Use `SSI` instead.
Để mô phỏng được giá trị của danh mục tối ưu đầu tư 7 cổ phiếu lớn thuộc nhóm ngành chứng khoán, em xin đề xuất mô hình như sau:
\(DMDT = E_{1}AGR+E_{2}APG+E_{3}BSI+E_{4}CTS+E_{5}FTS+E_{6}HCM+E_{7}SSI\)
Trong đó: \(E_{1},E_{2},E_{3},E_{4},E_{5},E_{6},E_{7}\) là tỷ trọng danh mục đầu tư tối ưu
Biến phụ thuộc: DMDT: Giá trị danh mục đầu tư tối ưu của 7 cổ phiếu nhóm ngành chứng khoán
Biến độc lập: cổ phiếu AGR, APG, BSI, CTS, FTS, HCM, SSI.
summary(gia)
## Ngày AGR APG
## Min. :2022-01-04 00:00:00.00 Min. : 5669 Min. : 2520
## 1st Qu.:2022-05-31 12:00:00.00 1st Qu.: 8263 1st Qu.: 6285
## Median :2022-10-18 00:00:00.00 Median :11700 Median : 7270
## Mean :2022-10-18 18:50:38.35 Mean :12285 Mean : 8871
## 3rd Qu.:2023-03-11 12:00:00.00 3rd Qu.:14732 3rd Qu.: 9195
## Max. :2023-07-31 00:00:00.00 Max. :25098 Max. :20700
## BSI CTS FTS HCM
## Min. :12050 Min. : 7540 Min. :11827 Min. :15073
## 1st Qu.:19600 1st Qu.:13600 1st Qu.:19755 1st Qu.:22390
## Median :27509 Median :16867 Median :26563 Median :25200
## Mean :26987 Mean :18062 Mean :27000 Mean :26147
## 3rd Qu.:32350 3rd Qu.:21322 3rd Qu.:32150 3rd Qu.:27945
## Max. :43645 Max. :36760 Max. :43530 Max. :44878
## SSI
## Min. :13900
## 1st Qu.:19575
## Median :22400
## Mean :24979
## 3rd Qu.:26567
## Max. :47092
hist(gia$AGR, main = "BIỂU ĐỒ GIÁ CỔ PHIẾU AGR",xlab = "AGR", ylab = "frequency price",col = "#4682B4")
\(H_0\): Biến AGR có phân phối chuẩn
\(H_1\): Biến AGR không có phân phối chuẩn
shapiro.test(gia$AGR)
##
## Shapiro-Wilk normality test
##
## data: gia$AGR
## W = 0.89837, p-value = 1.772e-15
Với p-value < 0.05 , bác bỏ \(H_0\) nên dãy số liệu này không có phân phối chuẩn
\(H_0\): Biến AGR có phân phối loga chuẩn
\(H_1\): Biến AGR không có phân phối loga chuẩn
ks.test(gia$AGR,y="plnorm")
## Warning in ks.test.default(gia$AGR, y = "plnorm"): ties should not be present
## for the Kolmogorov-Smirnov test
##
## Asymptotic one-sample Kolmogorov-Smirnov test
##
## data: gia$AGR
## D = 1, p-value < 2.2e-16
## alternative hypothesis: two-sided
Với p-value < 0.05 , bác bỏ \(H_0\) nên dãy số liệu này không có phân phối loga chuẩn
\(H_0\): Biến AGR có phân phối mũ
\(H_1\): Biến AGR không có phân phối mũ
ks.test(gia$AGR,y="pexp")
## Warning in ks.test.default(gia$AGR, y = "pexp"): ties should not be present for
## the Kolmogorov-Smirnov test
##
## Asymptotic one-sample Kolmogorov-Smirnov test
##
## data: gia$AGR
## D = 1, p-value < 2.2e-16
## alternative hypothesis: two-sided
Với p-value < 0.05 , bác bỏ \(H_0\) nên dãy số liệu này không có phân phối mũ
hist(gia$APG, main = "BIỂU ĐỒ GIÁ CỔ PHIẾU APG",xlab = "APG", ylab = "frequency price",col = "#4682B4")
\(H_0\): Biến APG có phân phối chuẩn
\(H_1\): Biến APG không có phân phối chuẩn
shapiro.test(gia$APG)
##
## Shapiro-Wilk normality test
##
## data: gia$APG
## W = 0.79233, p-value < 2.2e-16
Với p-value < 0.05 , bác bỏ \(H_0\) nên dãy số liệu này không có phân phối chuẩn
\(H_0\): Biến APG có phân phối loga chuẩn
\(H_1\): Biến APG không có phân phối loga chuẩn
ks.test(gia$APG,y="plnorm")
## Warning in ks.test.default(gia$APG, y = "plnorm"): ties should not be present
## for the Kolmogorov-Smirnov test
##
## Asymptotic one-sample Kolmogorov-Smirnov test
##
## data: gia$APG
## D = 1, p-value < 2.2e-16
## alternative hypothesis: two-sided
Với p-value < 0.05 , bác bỏ \(H_0\) nên dãy số liệu này không có phân phối loga chuẩn
\(H_0\): Biến APG có phân phối mũ
\(H_1\): Biến APG không có phân phối mũ
ks.test(gia$APG,y="pexp")
## Warning in ks.test.default(gia$APG, y = "pexp"): ties should not be present for
## the Kolmogorov-Smirnov test
##
## Asymptotic one-sample Kolmogorov-Smirnov test
##
## data: gia$APG
## D = 1, p-value < 2.2e-16
## alternative hypothesis: two-sided
Với p-value < 0.05 , bác bỏ \(H_0\) nên dãy số liệu này không có phân phối mũ
hist(gia$BSI, main = "BIỂU ĐỒ GIÁ CỔ PHIẾU APG",xlab = "BSI", ylab = "frequency price",col = "#4682B4")
\(H_0\): Biến BSI có phân phối chuẩn
\(H_1\): Biến BSI không có phân phối chuẩn
shapiro.test(gia$BSI)
##
## Shapiro-Wilk normality test
##
## data: gia$BSI
## W = 0.9632, p-value = 2.438e-08
Với p-value < 0.05 , bác bỏ \(H_0\) nên dãy số liệu này không có phân phối chuẩn
\(H_0\): Biến BSI có phân phối loga chuẩn
\(H_1\): Biến BSI không có phân phối loga chuẩn
ks.test(gia$BSI,y="plnorm")
## Warning in ks.test.default(gia$BSI, y = "plnorm"): ties should not be present
## for the Kolmogorov-Smirnov test
##
## Asymptotic one-sample Kolmogorov-Smirnov test
##
## data: gia$BSI
## D = 1, p-value < 2.2e-16
## alternative hypothesis: two-sided
Với p-value < 0.05 , bác bỏ \(H_0\) nên dãy số liệu này không có phân phối loga chuẩn
\(H_0\): Biến BSI có phân phối mũ
\(H_1\): Biến BSI không có phân phối mũ
ks.test(gia$BSI,y="pexp")
## Warning in ks.test.default(gia$BSI, y = "pexp"): ties should not be present for
## the Kolmogorov-Smirnov test
##
## Asymptotic one-sample Kolmogorov-Smirnov test
##
## data: gia$BSI
## D = 1, p-value < 2.2e-16
## alternative hypothesis: two-sided
Với p-value < 0.05 , bác bỏ \(H_0\) nên dãy số liệu này không có phân phối mũ
hist(gia$CTS, main = "BIỂU ĐỒ GIÁ CỔ PHIẾU CTS",xlab = "CTS", ylab = "frequency price",col = "#4682B4")
\(H_0\): Biến CTS có phân phối chuẩn
\(H_1\): Biến CTS không có phân phối chuẩn
shapiro.test(gia$CTS)
##
## Shapiro-Wilk normality test
##
## data: gia$CTS
## W = 0.92937, p-value = 1.231e-12
Với p-value < 0.05 , bác bỏ \(H_0\) nên dãy số liệu này không có phân phối chuẩn
\(H_0\): Biến CTS có phân phối loga chuẩn
\(H_1\): Biến CTS không có phân phối loga chuẩn
ks.test(gia$CTS,y="plnorm")
## Warning in ks.test.default(gia$CTS, y = "plnorm"): ties should not be present
## for the Kolmogorov-Smirnov test
##
## Asymptotic one-sample Kolmogorov-Smirnov test
##
## data: gia$CTS
## D = 1, p-value < 2.2e-16
## alternative hypothesis: two-sided
Với p-value < 0.05 , bác bỏ \(H_0\) nên dãy số liệu này không có phân phối loga chuẩn
\(H_0\): Biến CTS có phân phối mũ
\(H_1\): Biến CTS không có phân phối mũ
ks.test(gia$CTS,y="pexp")
## Warning in ks.test.default(gia$CTS, y = "pexp"): ties should not be present for
## the Kolmogorov-Smirnov test
##
## Asymptotic one-sample Kolmogorov-Smirnov test
##
## data: gia$CTS
## D = 1, p-value < 2.2e-16
## alternative hypothesis: two-sided
Với p-value < 0.05 , bác bỏ \(H_0\) nên dãy số liệu này không có phân phối mũ
hist(gia$FTS, main = "BIỂU ĐỒ GIÁ CỔ PHIẾU FTS",xlab = "FTS", ylab = "frequency price",col = "#4682B4")
\(H_0\): Biến FTS có phân phối chuẩn
\(H_1\): Biến FTS không có phân phối chuẩn
shapiro.test(gia$FTS)
##
## Shapiro-Wilk normality test
##
## data: gia$FTS
## W = 0.97261, p-value = 9.994e-07
Với p-value < 0.05 , bác bỏ \(H_0\) nên dãy số liệu này không có phân phối chuẩn
\(H_0\): Biến FTS có phân phối loga chuẩn
\(H_1\): Biến FTS không có phân phối loga chuẩn
ks.test(gia$FTS,y="plnorm")
## Warning in ks.test.default(gia$FTS, y = "plnorm"): ties should not be present
## for the Kolmogorov-Smirnov test
##
## Asymptotic one-sample Kolmogorov-Smirnov test
##
## data: gia$FTS
## D = 1, p-value < 2.2e-16
## alternative hypothesis: two-sided
Với p-value < 0.05 , bác bỏ \(H_0\) nên dãy số liệu này không có phân phối loga chuẩn
\(H_0\): Biến FTS có phân phối mũ
\(H_1\): Biến FTS không có phân phối mũ
ks.test(gia$FTS,y="pexp")
## Warning in ks.test.default(gia$FTS, y = "pexp"): ties should not be present for
## the Kolmogorov-Smirnov test
##
## Asymptotic one-sample Kolmogorov-Smirnov test
##
## data: gia$FTS
## D = 1, p-value < 2.2e-16
## alternative hypothesis: two-sided
Với p-value < 0.05 , bác bỏ \(H_0\) nên dãy số liệu này không có phân phối mũ
hist(gia$HCM, main = "BIỂU ĐỒ GIÁ CỔ PHIẾU HCM",xlab = "HCM", ylab = "frequency price",col = "#4682B4")
\(H_0\): Biến HCM có phân phối chuẩn
\(H_1\): Biến HCM không có phân phối chuẩn
shapiro.test(gia$HCM)
##
## Shapiro-Wilk normality test
##
## data: gia$HCM
## W = 0.92774, p-value = 8.361e-13
Với p-value < 0.05 , bác bỏ \(H_0\) nên dãy số liệu này không có phân phối chuẩn
\(H_0\): Biến HCM có phân phối loga chuẩn
\(H_1\): Biến HCM không có phân phối loga chuẩn
ks.test(gia$HCM,y="plnorm")
## Warning in ks.test.default(gia$HCM, y = "plnorm"): ties should not be present
## for the Kolmogorov-Smirnov test
##
## Asymptotic one-sample Kolmogorov-Smirnov test
##
## data: gia$HCM
## D = 1, p-value < 2.2e-16
## alternative hypothesis: two-sided
Với p-value < 0.05 , bác bỏ \(H_0\) nên dãy số liệu này không có phân phối loga chuẩn
\(H_0\): Biến HCM có phân phối mũ
\(H_1\): Biến HCM không có phân phối mũ
ks.test(gia$HCM,y="pexp")
## Warning in ks.test.default(gia$HCM, y = "pexp"): ties should not be present for
## the Kolmogorov-Smirnov test
##
## Asymptotic one-sample Kolmogorov-Smirnov test
##
## data: gia$HCM
## D = 1, p-value < 2.2e-16
## alternative hypothesis: two-sided
Với p-value < 0.05 , bác bỏ \(H_0\) nên dãy số liệu này không có phân phối mũ
hist(gia$SSI, main = "BIỂU ĐỒ GIÁ CỔ PHIẾU SSI",xlab = "SSI", ylab = "frequency price",col = "#4682B4")
\(H_0\): Biến SSI có phân phối chuẩn
\(H_1\): Biến SSI không có phân phối chuẩn
shapiro.test(gia$SSI)
##
## Shapiro-Wilk normality test
##
## data: gia$SSI
## W = 0.85647, p-value < 2.2e-16
Với p-value < 0.05 , bác bỏ \(H_0\) nên dãy số liệu này không có phân phối chuẩn
\(H_0\): Biến BSI có phân phối loga chuẩn
\(H_1\): Biến BSI không có phân phối loga chuẩn
ks.test(gia$SSI, "plnorm")
## Warning in ks.test.default(gia$SSI, "plnorm"): ties should not be present for
## the Kolmogorov-Smirnov test
##
## Asymptotic one-sample Kolmogorov-Smirnov test
##
## data: gia$SSI
## D = 1, p-value < 2.2e-16
## alternative hypothesis: two-sided
Với p-value < 0.05 , bác bỏ \(H_0\) nên dãy số liệu này không có phân phối loga chuẩn
\(H_0\): Biến BSI có phân phối mũ
\(H_1\): Biến BSI không có phân phối mũ
ks.test(gia$SSI,y="pexp")
## Warning in ks.test.default(gia$SSI, y = "pexp"): ties should not be present for
## the Kolmogorov-Smirnov test
##
## Asymptotic one-sample Kolmogorov-Smirnov test
##
## data: gia$SSI
## D = 1, p-value < 2.2e-16
## alternative hypothesis: two-sided
Với p-value < 0.05 , bác bỏ \(H_0\) nên dãy số liệu này không có phân phối mũ
library(fPortfolio)
## Warning: package 'fPortfolio' was built under R version 4.3.1
## Loading required package: timeDate
## Loading required package: timeSeries
## Warning: package 'timeSeries' was built under R version 4.3.1
## Loading required package: fBasics
## Warning: package 'fBasics' was built under R version 4.3.1
## Loading required package: fAssets
## Warning: package 'fAssets' was built under R version 4.3.1
#Quy định dữ liệu là chuỗi thời gian
gia <-as.timeSeries(gia)
#Tính chuỗi lợi nhuận
loinhuan<-head(gia,-1)/tail(gia,-1)-1
datatable(loinhuan)
Minh họa biên hiệu quả
mohinh = portfolioSpec()
bien <- portfolioFrontier(loinhuan, mohinh)
frontierPlot(bien,col = c('black', 'blue'), pch=19)
#Giả lập các danh mục khác
monteCarloPoints(bien, mcSteps = 10000, cex = 0.25,pch = 19)
Danh mục có phương sai nhỏ nhất:
minriskPortfolio(loinhuan, mohinh)
##
## Title:
## MV Minimum Risk Portfolio
## Estimator: covEstimator
## Solver: solveRquadprog
## Optimize: minRisk
## Constraints: LongOnly
##
## Portfolio Weights:
## AGR APG BSI CTS FTS HCM SSI
## 0.3017 0.1989 0.0441 0.0000 0.0000 0.0666 0.3886
##
## Covariance Risk Budgets:
## AGR APG BSI CTS FTS HCM SSI
## 0.3017 0.1989 0.0441 0.0000 0.0000 0.0666 0.3886
##
## Target Returns and Risks:
## mean Cov CVaR VaR
## -0.0008 0.0297 0.0681 0.0632
##
## Description:
## Mon Aug 14 02:59:15 2023 by user: ASUS
Danh mục có phương sai nhỏ nhất trong các danh mục có lợi nhuận
setTargetReturn(mohinh) <- mean(colMeans(loinhuan))
efficientPortfolio(loinhuan, mohinh)
##
## Title:
## MV Efficient Portfolio
## Estimator: covEstimator
## Solver: solveRquadprog
## Optimize: minRisk
## Constraints: LongOnly
##
## Portfolio Weights:
## AGR APG BSI CTS FTS HCM SSI
## 0.2229 0.0292 0.2297 0.0000 0.0777 0.1234 0.3171
##
## Covariance Risk Budgets:
## AGR APG BSI CTS FTS HCM SSI
## 0.2143 0.0258 0.2474 0.0000 0.0830 0.1238 0.3057
##
## Target Returns and Risks:
## mean Cov CVaR VaR
## -0.0004 0.0304 0.0678 0.0634
##
## Description:
## Mon Aug 14 02:59:15 2023 by user: ASUS
Tỷ trọng đầu tư cổ phiếu trong danh mục tối ưu
Cổ phiếu AGR: 0.2143 => đầu tư: 214 cổ phiếu
Cổ phiếu APG: 0.0258 => đầu tư: 26 cổ phiếu
Cổ phiếu BSI: 0.2474 => đầu tư: 247 cổ phiếu
Cổ phiếu CTS: 0.0000 => đầu tư: 0 cổ phiếu
Cổ phiếu FTS: 0.0830 => đầu tư: 83 cổ phiếu
Cổ phiếu HCM: 0.1238 => đầu tư: 124 cổ phiếu
Cổ phiếu SSI: 0.3057 => đầu tư: 306 cổ phiếu
Khi các biến không có theo phân phối nào và ta muốn mô phỏng dữ liệu ta có thể thực hiện các bước sau đây:
Cắt dữ liệu: ta sẽ cắt dãy số liệu ban đầu thành các đoạn có cùng độ rộng hoặc có cùng số lượng quan sát trong mỗi đoạn.
Tạo bảng tần suất: Sau khi đã cắt dữ liệu thành các đoạn, ta tính số lượng quan sát nằm trong mỗi đoạn để tạo bảng tần suất.
Mô phỏng dữ liệu từ bảng tần suất: Dựa trên bảng tần suất đã tính, ta sẽ mô phỏng dữ liệu mới bằng cách lấy ngẫu nhiên các giá trị từ mỗi đoạn với xác suất phù hợp.
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.3.1
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:timeSeries':
##
## filter, lag
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
a <- 10
breaks <- quantile(gia$AGR, probs = seq(0, 1, length.out = a + 1), type = 1, na.rm = TRUE)
agr <- sapply(2:length(breaks), function(i) sample(gia$AGR[gia$AGR >= breaks[i-1] & gia$AGR <= breaks[i]], 10, replace = TRUE))
A <- table(agr)
AA <- as.data.frame(A) %>%
mutate(Tansuat = Freq / sum(Freq))
AA
prob1 <- AA$Tansuat
AR1 <- sample(AA$agr, 10000, replace = TRUE, prob = prob1)
AR2 <- as.character(AR1)
ar <- as.numeric(AR2)
hist(ar)
library(dplyr)
b <- 10
breaks <- quantile(gia$APG, probs = seq(0, 1, length.out = b + 1), type = 1, na.rm = TRUE)
apr <- sapply(2:length(breaks), function(i) sample(gia$APG[gia$APG >= breaks[i-1] & gia$APG <= breaks[i]], 10, replace = TRUE))
B <- table(apr)
BB <- as.data.frame(B) %>%
mutate(Tansuat = Freq / sum(Freq))
BB
prob2 <- BB$Tansuat
AP1 <- sample(BB$apr, 10000, replace = TRUE, prob = prob2)
AP2 <- as.character(AP1)
ap <- as.numeric(AP2)
hist(ap)
library(dplyr)
c <- 10
breaks <- quantile(gia$BSI, probs = seq(0, 1, length.out = c + 1), type = 1, na.rm = TRUE)
bsi <- sapply(2:length(breaks), function(i) sample(gia$BSI[gia$BSI >= breaks[i-1] & gia$BSI <= breaks[i]], 10, replace = TRUE))
C <- table(bsi)
CC <- as.data.frame(C) %>%
mutate(Tansuat = Freq / sum(Freq))
CC
prob3 <- CC$Tansuat
BS1 <- sample(CC$bsi, 10000, replace = TRUE, prob = prob3)
BS2 <- as.character(BS1)
bs <- as.numeric(BS2)
hist(bs)
library(dplyr)
d <- 10
breaks <- quantile(gia$CTS, probs = seq(0, 1, length.out = d + 1), type = 1, na.rm = TRUE)
cts <- sapply(2:length(breaks), function(i) sample(gia$CTS[gia$CTS >= breaks[i-1] & gia$CTS <= breaks[i]], 10, replace = TRUE))
D <- table(cts)
DD <- as.data.frame(D) %>%
mutate(Tansuat = Freq / sum(Freq))
DD
prob4 <- DD$Tansuat
CT1 <- sample(DD$cts, 10000, replace = TRUE, prob = prob4)
CT2 <- as.character(CT1)
ct <- as.numeric(CT2)
hist(ct)
library(dplyr)
e <- 10
breaks <- quantile(gia$FTS, probs = seq(0, 1, length.out = e + 1), type = 1, na.rm = TRUE)
fts <- sapply(2:length(breaks), function(i) sample(gia$FTS[gia$FTS >= breaks[i-1] & gia$FTS <= breaks[i]], 10, replace = TRUE))
E <- table(fts)
EE <- as.data.frame(E) %>%
mutate(Tansuat = Freq / sum(Freq))
EE
prob5 <- EE$Tansuat
FT1 <- sample(EE$fts, 10000, replace = TRUE, prob = prob5)
FT2 <- as.character(FT1)
ft <- as.numeric(FT2)
hist(ft)
library(dplyr)
h <- 10
breaks <- quantile(gia$HCM, probs = seq(0, 1, length.out = h + 1), type = 1, na.rm = TRUE)
hcm <- sapply(2:length(breaks), function(i) sample(gia$HCM[gia$HCM >= breaks[i-1] & gia$HCM <= breaks[i]], 10, replace = TRUE))
H <- table(hcm)
HH <- as.data.frame(H) %>%
mutate(Tansuat = Freq / sum(Freq))
HH
prob6 <- HH$Tansuat
HC1 <- sample(HH$hcm, 10000, replace = TRUE, prob = prob6)
HC2 <- as.character(HC1)
hc <- as.numeric(HC2)
hist(hc)
library(dplyr)
s <- 10
breaks <- quantile(gia$SSI, probs = seq(0, 1, length.out = s + 1), type = 1, na.rm = TRUE)
ssi <- sapply(2:length(breaks), function(i) sample(gia$SSI[gia$SSI >= breaks[i-1] & gia$HCM <= breaks[i]], 10, replace = TRUE))
S <- table(ssi)
SS <- as.data.frame(S) %>%
mutate(Tansuat = Freq / sum(Freq))
SS
prob7 <- SS$Tansuat
SS1 <- sample(SS$ssi, 10000, replace = TRUE, prob = prob7)
SS2 <- as.character(SS1)
ss <- as.numeric(SS2)
hist(ss)
Cổ phiếu AGR: 0.2143 => đầu tư: 214 cổ phiếu
Cổ phiếu APG: 0.0258 => đầu tư: 26 cổ phiếu
Cổ phiếu BSI: 0.2474 => đầu tư: 247 cổ phiếu
Cổ phiếu CTS: 0.0000 => đầu tư: 0 cổ phiếu
Cổ phiếu FTS: 0.0830 => đầu tư: 83 cổ phiếu
Cổ phiếu HCM: 0.1238 => đầu tư: 124 cổ phiếu
Cổ phiếu SSI: 0.3057 => đầu tư: 306 cổ phiếu
Kết quả mô hình đề xuất
DMDT <- 214*ar + 26*ap + 247*bs + 0*ct + 83*ft + 124*hc + 306*ss
hist(DMDT)
plot(DMDT, type = 'l', col = '#4682B4', main = "Tổng giá trị danh mục đầu tư 6 cổ phiếu trong rổ VN30", ylab = "VNĐ", xlab = "Ngày")
summary(DMDT)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 14072588 20514621 22642348 22924284 25053529 34585340
Sau khi mô phỏng tổng giá trị danh mục đầu tư tối ưu, ta thấy rằng trong 10000 ngày tới trung bình giá trị danh mục đầu tư tối ưu là 22.641.329 đồng, lớn nhất là 35.489.460 đồng