Tương quan

Dữ liệu sử dụng nghiên cứu là dữ liệu thời gian theo ngày của chỉ số đóng cửa các mã cổ phiếu NLG ( Công ty Cổ phần Địa ốc Nam Long), VIC (Tập đoàn Vingroup), PDR (Công ty Cổ phần Phát triển Bất động sản Phát Đạt) và VNI (chỉ số chứng khoán phản ánh biến động giá và thanh khoản của toàn thị trường chứng khoán Việt Nam). Dữ liệu giá cổ phiếu các tập đoàn và chỉ số thị trường chứng khoán được thu thập từ trang www.investing.com

library(PerformanceAnalytics)
## Loading required package: xts
## Loading required package: zoo
## 
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
## 
## Attaching package: 'PerformanceAnalytics'
## The following object is masked from 'package:graphics':
## 
##     legend
library(xlsx)
data <- read.xlsx("D:/Mô hình ngẫu nhiên/btvn1_mhnn.xlsx", sheetIndex = 1, header = TRUE)
data <- na.omit(data)
mydata <- data[,c(2:5)]
head(data,6)
##         Ngày     VNI   VIC     PDR   NLG
## 1 2023-12-29 1129.93 44600 25161.1 36650
## 2 2023-12-28 1128.93 44450 25025.6 37000
## 3 2023-12-27 1121.99 43600 24980.4 37100
## 4 2023-12-26 1122.25 43550 25116.0 37600
## 5 2023-12-25 1117.66 43400 24890.1 37700
## 6 2023-12-22 1103.06 43150 24212.5 36700

Dùng lệnh res() để hiển thị hệ số tương quan giữa các cặp biến. Sau đó dùng round() để làm tròn đến chữ số thập phân thứ 2.

res <- cor(mydata)
round(res, 2)
##      VNI  VIC  PDR  NLG
## VNI 1.00 0.67 0.81 0.94
## VIC 0.67 1.00 0.44 0.50
## PDR 0.81 0.44 1.00 0.82
## NLG 0.94 0.50 0.82 1.00

Nhìn vào kết quả, ta thấy mức độ tương quan giữa VNI và VIC là 0,67 > 0, vậy thì 2 biến này có mối quan hệ thuận, nếu biến VNI tăng thì VIC cũng tăng. Tương tự cho các cặp biến còn lại.

Lệnh rcorr() trong package Hmisc tính giá trị p của ma trận hệ số tương quan như Pearson hoặc là Spearman. Kết quả trả về bao gồm ma trận hệ số tương quan và giá trị p Của mối tương quan của các cặp biến tỏng dữ liệu.

Nếu chúng ta chỉ muốn kết quả hiển thị hoặc là hệ số tương quan hoặc là p_value thì có thể làm như sau:

library(Hmisc)
## 
## Attaching package: 'Hmisc'
## The following objects are masked from 'package:base':
## 
##     format.pval, units
res2<-rcorr(as.matrix(data[,2:5]))
res2 
##      VNI  VIC  PDR  NLG
## VNI 1.00 0.67 0.81 0.94
## VIC 0.67 1.00 0.44 0.50
## PDR 0.81 0.44 1.00 0.82
## NLG 0.94 0.50 0.82 1.00
## 
## n= 2461 
## 
## 
## P
##     VNI VIC PDR NLG
## VNI      0   0   0 
## VIC  0       0   0 
## PDR  0   0       0 
## NLG  0   0   0

Hệ số tương quan Pearson

res2$r
##           VNI       VIC       PDR       NLG
## VNI 1.0000000 0.6737855 0.8096184 0.9412304
## VIC 0.6737855 1.0000000 0.4409943 0.5043476
## PDR 0.8096184 0.4409943 1.0000000 0.8205259
## NLG 0.9412304 0.5043476 0.8205259 1.0000000

Tính p_value

res2$P
##     VNI VIC PDR NLG
## VNI  NA   0   0   0
## VIC   0  NA   0   0
## PDR   0   0  NA   0
## NLG   0   0   0  NA

Phần này cung cấp một hàm đơn giản để định dạng ma trận tương quan vào bảng với 4 cột chứa:

Cột 1 : tên hàng

Cột 2 : tên cột

Cột 3 : các hệ số tương quan

Cột 4 : các giá trị p của các tương quan

flattenCorrMatrix <- function(cormat, pmat) {
  ut <- upper.tri(cormat)
  data.frame(
    row = rownames(cormat)[row(cormat)[ut]],
    column = rownames(cormat)[col(cormat)[ut]],
    cor  =(cormat)[ut],
    p = pmat[ut]
    )
}
flattenCorrMatrix(res2$r, res2$P)
##   row column       cor p
## 1 VNI    VIC 0.6737855 0
## 2 VNI    PDR 0.8096184 0
## 3 VIC    PDR 0.4409943 0
## 4 VNI    NLG 0.9412304 0
## 5 VIC    NLG 0.5043476 0
## 6 PDR    NLG 0.8205259 0
symnum(res, abbr.colnames = FALSE)
##     VNI VIC PDR NLG
## VNI 1              
## VIC ,   1          
## PDR +   .   1      
## NLG *   .   +   1  
## attr(,"legend")
## [1] 0 ' ' 0.3 '.' 0.6 ',' 0.8 '+' 0.9 '*' 0.95 'B' 1

Hàm symnum() là một trong hàm hiển thị ma trận tương quan trong phần mềm R. Nó thay thế cho các hệ số tương quan bằng các ký hiệu theo mức độ tương quan và lấy ma trận tương qaun làm đối số.

Trong đó:

res là ma trận tương quan muốn trực hóa

abbr.colnames là các giá trị logic. Nếu giá trị đúng thì các tên cột sẽ được viết tắt

library(corrplot)
## corrplot 0.92 loaded
corrplot(res, type = "upper", order = "hclust", 
         tl.col = "black", tl.srt = 45)

Biểu đồ tương quan (correlation plot) giúp chúng ta có thể sự tương quan của thị trường bất động sản và chứng Khoán của các tập đoàn NLG, VIC, PDR. Dựa vừa mô hình thì chúng ta thấy cả 2 thị trường này có sự tương quan chặt chẽ với nhau, nhìn chung thì hệ số hồi quy dương, thị trường bất động sản và chứng khoán tương quan mạnh ở các cặp VIC-PDR, VIC, VNI, VIC-NLG, PDR - VNI, PDR - NLG, VNI - NLG. Các giá trị này chỉ ra rằng các mã chứng khoán này có xu hướng biến động cùng chiều với nhau, nghĩa là khi giá của một mã chứng khoán tăng, các mã khác cũng có xu hướng tăng theo và ngược lại.

chart.Correlation(mydata, histogram=TRUE, pch=19)
## Warning in par(usr): argument 1 does not name a graphical parameter
## Warning in par(usr): argument 1 does not name a graphical parameter
## Warning in par(usr): argument 1 does not name a graphical parameter
## Warning in par(usr): argument 1 does not name a graphical parameter
## Warning in par(usr): argument 1 does not name a graphical parameter
## Warning in par(usr): argument 1 does not name a graphical parameter

Đường chéo trên biểu đồ thể hiện sự phân bố của từng biến

Ở dưới đường chéo là các ô đồ thị dạng scatter.

Ở trên đường chéo là các hệ số tương quan và mức ý nghĩa thống kê (p_value) được thể hiện dưới dạng ngôi sao. Mỗi mức ý nghĩa sẽ được liên kết với 1 ký hiệu : *** nghĩa là giá trị từ 0 đến 0.001.

library(ggplot2)
library(ggcorrplot)
df <- dplyr::select_if(mydata, is.numeric)
r <- cor(df, use="complete.obs")
ggcorrplot(r)

Tương quan của các thị trường trong giai đoạn này là ở mức cao. Mối tương quan cao nhất trong giai đoạn này là giữa NLG và PDR (0.82). Mức tương quan giữa các thị trường có xu hướng tăng.