Bài mẫu cho sinh viên thực hành

cat("\014")  # Lệnh này gửi mã để clear console
rm(list = ls()) # xoá all các biến
  1. Đọc dữ liệu từ link google sheet
#install.packages("googlesheets4")
library(googlesheets4)
gs4_deauth()
df <- read_sheet("https://docs.google.com/spreadsheets/d/10nZIVWn3i5djs0tRZbI--8nntNbfbGoNvYKX8yI7Eeo/edit?gid=1870826978#gid=1870826978", sheet = "hose2")
  1. Lấy dữ liệu mã cổ phiếu mình cần, ví dụ: VNINDEX
df # xem toàn bộ dataframe hose2
# A tibble: 3,293 × 241
   Date                  AAA   AAM    ABT   ACB   ACC   ACL   ADP   AGR   ANV
   <dttm>              <dbl> <dbl>  <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
 1 2012-04-11 00:00:00 4582. 9448. 10913. 3583. 2760. 5507.  422. 7418. 1115.
 2 2012-04-12 00:00:00 4560. 9557. 10972. 3681. 2851. 5446.  461. 7418. 1115.
 3 2012-04-13 00:00:00 4476. 9557. 10972. 3681. 2851. 5446.  505. 7339. 1094.
 4 2012-04-16 00:00:00 4624. 9557. 11300. 3681. 2967. 5538.  477. 7655. 1115.
 5 2012-04-17 00:00:00 4624. 9703. 11420. 3667. 2993. 5660.  521. 7971. 1126.
 6 2012-04-18 00:00:00 4560. 9849. 11330. 3611. 3110. 5568.  532. 8208. 1115.
 7 2012-04-19 00:00:00 4348. 9849. 11390. 3555. 3226. 5844.  581. 7813. 1061.
 8 2012-04-20 00:00:00 4370. 9885. 11420. 3569. 3071. 6119.  581. 7497. 1105.
 9 2012-04-23 00:00:00 4370. 9885. 11420. 3611. 3006. 6241.  581. 7339. 1159.
10 2012-04-24 00:00:00 4433. 9995. 11539. 3611. 3110. 6241.  526. 7418. 1207.
# ℹ 3,283 more rows
# ℹ 231 more variables: APG <dbl>, ASM <dbl>, ASP <dbl>, BCE <dbl>, BIC <dbl>,
#   BMC <dbl>, BMI <dbl>, BMP <dbl>, BRC <dbl>, BSI <dbl>, BTP <dbl>,
#   BTT <dbl>, BVH <dbl>, C32 <dbl>, C47 <dbl>, CCI <dbl>, CCL <dbl>,
#   CDC <dbl>, CHP <dbl>, CIG <dbl>, CII <dbl>, CLC <dbl>, CLW <dbl>,
#   CMG <dbl>, CMV <dbl>, CMX <dbl>, CNG <dbl>, COM <dbl>, CSM <dbl>,
#   CTD <dbl>, CTG <dbl>, CTI <dbl>, CTS <dbl>, CVT <dbl>, D2D <dbl>, …
vn <- df[, c("Date", "VNINDEX")]
vn # xem dataframe VNINDEX
# A tibble: 3,293 × 2
   Date                VNINDEX
   <dttm>                <dbl>
 1 2012-04-11 00:00:00    459.
 2 2012-04-12 00:00:00    465.
 3 2012-04-13 00:00:00    463.
 4 2012-04-16 00:00:00    468.
 5 2012-04-17 00:00:00    473.
 6 2012-04-18 00:00:00    472.
 7 2012-04-19 00:00:00    467.
 8 2012-04-20 00:00:00    466.
 9 2012-04-23 00:00:00    465.
10 2012-04-24 00:00:00    466.
# ℹ 3,283 more rows
  1. Kiểm tra dữ liệu
str(vn) # structure → dùng để xem cấu trúc bên trong của object
tibble [3,293 × 2] (S3: tbl_df/tbl/data.frame)
 $ Date   : POSIXct[1:3293], format: "2012-04-11" "2012-04-12" ...
 $ VNINDEX: num [1:3293] 459 465 463 468 473 ...
head(vn) # xem 6 dòng đầu
# A tibble: 6 × 2
  Date                VNINDEX
  <dttm>                <dbl>
1 2012-04-11 00:00:00    459.
2 2012-04-12 00:00:00    465.
3 2012-04-13 00:00:00    463.
4 2012-04-16 00:00:00    468.
5 2012-04-17 00:00:00    473.
6 2012-04-18 00:00:00    472.
tail(vn) # xem 6 dòng cuối
# A tibble: 6 × 2
  Date                VNINDEX
  <dttm>                <dbl>
1 2026-03-26 00:00:00   1645.
2 2026-03-27 00:00:00   1673.
3 2026-03-30 00:00:00   1663.
4 2026-03-31 00:00:00   1674.
5 2026-04-01 00:00:00   1703.
6 2026-04-02 00:00:00   1695.
summary(vn) # thống kê mô tả toàn bộ dataframe
      Date                        VNINDEX      
 Min.   :2012-04-11 00:00:00   Min.   : 375.3  
 1st Qu.:2015-09-01 00:00:00   1st Qu.: 592.7  
 Median :2019-03-18 00:00:00   Median : 952.1  
 Mean   :2019-03-31 18:12:21   Mean   : 929.7  
 3rd Qu.:2022-11-14 00:00:00   3rd Qu.:1218.1  
 Max.   :2026-04-02 00:00:00   Max.   :1902.9  

4.1. Thống kê mô tả dữ liệu giá chứng khoán

library(fBasics)
basicStats(vn$VNINDEX) # cách 1
            X..vn.VNINDEX
nobs         3.293000e+03
NAs          0.000000e+00
Minimum      3.752600e+02
Maximum      1.902930e+03
1. Quartile  5.926600e+02
3. Quartile  1.218090e+03
Mean         9.296591e+02
Median       9.521400e+02
Sum          3.061367e+06
SE Mean      6.142648e+00
LCL Mean     9.176153e+02
UCL Mean     9.417029e+02
Variance     1.242519e+05
Stdev        3.524938e+02
Skewness     3.525550e-01
Kurtosis    -7.347740e-01
summary(vn$VNINDEX) # cách 2
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  375.3   592.7   952.1   929.7  1218.1  1902.9 

4.2. Thống kê mô tả dữ liệu return của giá chứng khoán

return_vn <- diff(log(vn$VNINDEX)) # chuyển giá thành return
head(return_vn) # xem 6 giá trị đầu 
[1]  0.014112788 -0.005906590  0.012333898  0.009733368 -0.001439154
[6] -0.010817362
tail(return_vn) # xem 6 giá trị cuối
[1] -0.008211211  0.016983434 -0.006152316  0.007162088  0.016841656
[6] -0.004773756
library(fBasics)
basicStats(return_vn)
              return_vn
nobs        3292.000000
NAs            0.000000
Minimum       -0.069102
Maximum        0.077067
1. Quartile   -0.004558
3. Quartile    0.006701
Mean           0.000397
Median         0.001194
Sum            1.306848
SE Mean        0.000210
LCL Mean      -0.000014
UCL Mean       0.000808
Variance       0.000145
Stdev          0.012033
Skewness      -0.772220
Kurtosis       4.925740
summary(return_vn)
     Min.   1st Qu.    Median      Mean   3rd Qu.      Max. 
-0.069102 -0.004558  0.001194  0.000397  0.006701  0.077067 

5.1. Vẽ đồ thị và hàm mật độ giá chứng khoán

ts.plot(vn$VNINDEX)

plot(vn)

plot(vn, type = 'l') # hoặc gõ plot(vn$Date, vn$VNINDEX, type = "l")

hist(vn$VNINDEX)

d1 = density(vn$VNINDEX)
plot(d1, type = "l")

5.2. Vẽ đồ thị và hàm mật độ return của giá chứng khoán

ts.plot(return_vn)

plot(return_vn)

plot(vn$Date[-1], return_vn, type = 'l')

hist(return_vn)

d2 = density(return_vn)
plot(d2, type = "l")

  1. Kiểm tra tính dừng, kiểm tra phân phối chuẩn
library(tseries)
adf.test(vn$VNINDEX)

    Augmented Dickey-Fuller Test

data:  vn$VNINDEX
Dickey-Fuller = -2.5484, Lag order = 14, p-value = 0.3462
alternative hypothesis: stationary
adf.test(return_vn)

    Augmented Dickey-Fuller Test

data:  return_vn
Dickey-Fuller = -14.644, Lag order = 14, p-value = 0.01
alternative hypothesis: stationary
kpss.test(return_vn) # H0: stationary

    KPSS Test for Level Stationarity

data:  return_vn
KPSS Level = 0.035401, Truncation lag parameter = 9, p-value = 0.1
normalTest(vn$VNINDEX, method = c("jb")) # H0: normal distribution

Title:
 Jarque-Bera Normality Test

Test Results:
  STATISTIC:
    X-squared: 142.0801
  P VALUE:
    Asymptotic p Value: < 2.2e-16 
normalTest(return_vn, method = c("jb")) # H0: normal distribution

Title:
 Jarque-Bera Normality Test

Test Results:
  STATISTIC:
    X-squared: 3662.0575
  P VALUE:
    Asymptotic p Value: < 2.2e-16 
  1. Kiểm tra tự tương quan bằng đồ thị và bằng kiểm định
acf(return_vn) # MA: chọn lag q (tổng ảnh hưởng)

pacf(return_vn) # AR: chọn lag p (ảnh hưởng trực tiếp)

# Đọc kết quả: từ đồ thị PACF, ta thấy lag 1 có TTQ rõ rệt (vượt khỏi ngưỡng xanh)
Box.test(return_vn, lag = 10) # H0: no autocorrelation

    Box-Pierce test

data:  return_vn
X-squared = 26.292, df = 10, p-value = 0.003367
Box.test(return_vn, lag = 10, type = c("Ljung-Box")) # H0: no autocorrelation

    Box-Ljung test

data:  return_vn
X-squared = 26.335, df = 10, p-value = 0.003314
  1. Ước lượng mô hình ARIMA
# 8.1 Xây dựng mô hình AR
# Chọn bậc thích hợp PACF, AIC
pacf(return_vn)

m1 <- ar(return_vn, method = c("mle"))
m1 # mô hình chọn AR(2)

Call:
ar(x = return_vn, method = c("mle"))

Coefficients:
     1       2  
0.0615  0.0309  

Order selected 2  sigma^2 estimated as  0.000144
names(m1) 
 [1] "order"        "ar"           "var.pred"     "x.mean"       "aic"         
 [6] "n.used"       "n.obs"        "order.max"    "partialacf"   "resid"       
[11] "method"       "series"       "frequency"    "call"         "asy.var.coef"
m1$aic
          0           1           2           3           4           5 
12.44488454  1.14589157  0.00000000  1.99949891  2.96556444  2.73769156 
          6           7           8           9          10          11 
 3.89132794  5.81912822  7.79591063  6.57171264  5.76780331  6.83151555 
         12 
 0.07373593 
# Ước lượng AR(p)
m21 <- arima(return_vn, order = c(1, 0, 0))
m21

Call:
arima(x = return_vn, order = c(1, 0, 0))

Coefficients:
         ar1  intercept
      0.0635      4e-04
s.e.  0.0174      2e-04

sigma^2 estimated as 0.0001442:  log likelihood = 9887.1,  aic = -19768.21
m22 <- arima(return_vn, order = c(2, 0, 0))
m22

Call:
arima(x = return_vn, order = c(2, 0, 0))

Coefficients:
         ar1     ar2  intercept
      0.0615  0.0309      4e-04
s.e.  0.0174  0.0174      2e-04

sigma^2 estimated as 0.000144:  log likelihood = 9888.67,  aic = -19769.35
AIC(m21, m22) # AR(2) tốt hơn AR(1) nhưng chênh lệch không đáng kể, nên vẫn chọn AR(1)
    df       AIC
m21  3 -19768.21
m22  4 -19769.35
# hàm tính p-value
coeftest <- function(model){
          coef <- model$coef
          se <- sqrt(diag(model$var.coef))
          t <- coef / se
          p <- 2 * (1 - pnorm(abs(t)))
          data.frame(coef, se, t, p)
        }
        
coeftest(m21)
                  coef           se        t            p
ar1       0.0634998121 0.0173939133 3.650692 0.0002615352
intercept 0.0003966277 0.0002241221 1.769695 0.0767780385
coeftest(m22)
                  coef          se        t            p
ar1       0.0615387707 0.017421055 3.532436 0.0004117492
ar2       0.0308979127 0.017424818 1.773213 0.0761934262
intercept 0.0003968176 0.000231111 1.717000 0.0859792103
# Kiểm định phần dư
plot(m21$residuals, type = 'l')

qqplot(m21$residuals, return_vn)

Box.test(m21$residuals, lag = 10) # H0: no autocorrelation ; # kiểm định phần dư phải không có TTQ => mô hình tốt

    Box-Pierce test

data:  m21$residuals
X-squared = 13.585, df = 10, p-value = 0.1928
# Dự báo return cho 5 ngày tiếp theo
predict(m21, 5)
$pred
Time Series:
Start = 3293 
End = 3297 
Frequency = 1 
[1] 6.830929e-05 3.757796e-04 3.953039e-04 3.965436e-04 3.966224e-04

$se
Time Series:
Start = 3293 
End = 3297 
Frequency = 1 
[1] 0.01200644 0.01203062 0.01203072 0.01203072 0.01203072
# 8.2. Xây dựng mô hình MA
# Chọn bậc thích hợp ACF
acf(return_vn)

# Ước lượng MA(q)
m3 <- arima(return_vn, order = c(1, 0, 1))
m3

Call:
arima(x = return_vn, order = c(1, 0, 1))

Coefficients:
         ar1      ma1  intercept
      0.3898  -0.3259      4e-04
s.e.  0.1896   0.1943      2e-04

sigma^2 estimated as 0.000144:  log likelihood = 9888.36,  aic = -19768.71
coeftest(m3) # chọn AR(1) vì MA(1) có hệ số coef p-value gần 0,1 => không đáng kể để dùng
                   coef           se         t          p
ar1        0.3897837692 0.1896085446  2.055729 0.03980865
ma1       -0.3258789401 0.1942814138 -1.677355 0.09347304
intercept  0.0003912239 0.0002317313  1.688265 0.09136031
# Kiểm định phần dư
plot(m3$residuals, type = 'l')

qqplot(m3$residuals, return_vn)

Box.test(m3$residuals, lag = 10)

    Box-Pierce test

data:  m3$residuals
X-squared = 11.218, df = 10, p-value = 0.3408

9.1. Kiểm định hiệu ứng ARCH (ARCH-LM test)

# Nếu không có ARCH effect => dùng ARIMA
# Nếu có ARCH effect => qua bước tiếp theo
# install.packages("fGarch")
library(fGarch)
m4 <- garchFit(~ arma(1,0) + garch(1,0), data = return_vn, trace = FALSE)
summary(m4)

Title:
 GARCH Modelling 

Call:
 garchFit(formula = ~arma(1, 0) + garch(1, 0), data = return_vn, 
    trace = FALSE) 

Mean and Variance Equation:
 data ~ arma(1, 0) + garch(1, 0)
<environment: 0x11e0aa940>
 [data = return_vn]

Conditional Distribution:
 norm 

Coefficient(s):
        mu         ar1       omega      alpha1  
0.00051593  0.03757518  0.00010323  0.32212738  

Std. Errors:
 based on Hessian 

Error Analysis:
        Estimate  Std. Error  t value Pr(>|t|)    
mu     5.159e-04   1.902e-04    2.712  0.00668 ** 
ar1    3.758e-02   2.281e-02    1.648  0.09943 .  
omega  1.032e-04   3.443e-06   29.982  < 2e-16 ***
alpha1 3.221e-01   3.398e-02    9.481  < 2e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Log Likelihood:
 10017.93    normalized:  3.043114 

Description:
 Mon May 11 21:53:30 2026 by user:  



Standardised Residuals Tests:
                                   Statistic     p-Value
 Jarque-Bera Test   R    Chi^2  3275.3664061 0.000000000
 Shapiro-Wilk Test  R    W         0.9372351 0.000000000
 Ljung-Box Test     R    Q(10)    22.1890486 0.014169956
 Ljung-Box Test     R    Q(15)    34.8395774 0.002591675
 Ljung-Box Test     R    Q(20)    37.0318965 0.011599403
 Ljung-Box Test     R^2  Q(10)   209.4015148 0.000000000
 Ljung-Box Test     R^2  Q(15)   270.1685783 0.000000000
 Ljung-Box Test     R^2  Q(20)   279.5069169 0.000000000
 LM Arch Test       R    TR^2    166.5128845 0.000000000

Information Criterion Statistics:
      AIC       BIC       SIC      HQIC 
-6.083797 -6.076386 -6.083800 -6.081144 
# Jarque-Bera Test; Shapiro-Wilk Test: H0: normal distribution
# Ljung-Box Test: H0: no autocorrelation
# LM Arch Test: H0: no ARCH effect
# plot(m4)
# 1: Time Series (chuỗi return gốc)
# 2: Conditional SD (chuỗi sigma_t từ GARCH)
# 3: Series with 2 Conditional SD Superimposed (chuỗi return +/- 2*sigma)
# 4: ACF of Observations (ACF của return)
# 5: ACF of Squared Observations (ACF của return^2, kiểm tra ARCH effect (volatility clustering))
# 6: Cross Correlation (kiểm tra tương quan giữa r_t và r_{t-k}^2leverage effect (tin xấu vs tin tốt))
# 7: Residuals (sau fit model)
# 8: Conditional SDs (sau fit model)
# 9: Standardized Residuals
# 10: ACF of Standardized Residuals
# 11: ACF of Squared Standardized Residuals
# 12: Cross Correlation between r^2 and r
# 13: QQ-Plot of Standardized Residuals
# 14: Series with -VaR Superimposed
# 15: Series with -ES Superimposed
# 16: Series with -VaR & -ES Superimposed

9.2. Ước lượng ARIMA+GARCH (chọn bậc p, q hợp lý)

m5 <-garchFit(~ arma(1,0) + garch(1,1), data = return_vn, trace = FALSE)
summary(m5)

Title:
 GARCH Modelling 

Call:
 garchFit(formula = ~arma(1, 0) + garch(1, 1), data = return_vn, 
    trace = FALSE) 

Mean and Variance Equation:
 data ~ arma(1, 0) + garch(1, 1)
<environment: 0x11ff147f0>
 [data = return_vn]

Conditional Distribution:
 norm 

Coefficient(s):
        mu         ar1       omega      alpha1       beta1  
5.7996e-04  7.5049e-02  6.1547e-06  1.2663e-01  8.3734e-01  

Std. Errors:
 based on Hessian 

Error Analysis:
        Estimate  Std. Error  t value Pr(>|t|)    
mu     5.800e-04   1.721e-04    3.369 0.000753 ***
ar1    7.505e-02   1.983e-02    3.785 0.000154 ***
omega  6.155e-06   1.104e-06    5.573  2.5e-08 ***
alpha1 1.266e-01   1.392e-02    9.097  < 2e-16 ***
beta1  8.373e-01   1.711e-02   48.952  < 2e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Log Likelihood:
 10208.39    normalized:  3.10097 

Description:
 Mon May 11 21:53:30 2026 by user:  



Standardised Residuals Tests:
                                   Statistic    p-Value
 Jarque-Bera Test   R    Chi^2  4474.8107926 0.00000000
 Shapiro-Wilk Test  R    W         0.9451217 0.00000000
 Ljung-Box Test     R    Q(10)    14.7405855 0.14180976
 Ljung-Box Test     R    Q(15)    24.5752549 0.05594663
 Ljung-Box Test     R    Q(20)    26.0669078 0.16361347
 Ljung-Box Test     R^2  Q(10)     9.0292754 0.52932751
 Ljung-Box Test     R^2  Q(15)     9.9976609 0.81988703
 Ljung-Box Test     R^2  Q(20)    12.7390015 0.88829935
 LM Arch Test       R    TR^2      9.8836206 0.62616989

Information Criterion Statistics:
      AIC       BIC       SIC      HQIC 
-6.198902 -6.189638 -6.198907 -6.195586 
# Kiểm định chẩn đoán (Ljung-Box, kiểm tra phần dư)
# plot(m5)
# Dự báo tỷ suất lợi nhuận và sigma
predict(m5, 5)
  meanForecast  meanError standardDeviation
1 0.0002216970 0.01547954        0.01547954
2 0.0005965989 0.01544306        0.01539930
3 0.0006247348 0.01536534        0.01532156
4 0.0006268464 0.01528980        0.01524625
5 0.0006270048 0.01521662        0.01517330
  1. Tính và dự báo VaR
# Chạy hàm loss để tính VaR
nreturn <- -return_vn
# 10.1. Ước tính VaR theo RISK METRICS (dùng iGARCH để ước lượng muy, sigma)
# Cách 1: tính thủ công
# Định dạng mô hình
# install.packages("rugarch")
library(rugarch)
spec1 <- ugarchspec(mean.model = list(armaOrder=c(1,0)),
                    variance.model = list(model="iGARCH", garchOrder=c(1,1)))
# Chạy mô hình ARIMA+iGARCH
m6 <- ugarchfit(spec=spec1,data = nreturn)
# Kiểm định phần dư: 
# plot(m6)
Box.test(residuals(m6, standardize=TRUE), lag=10, type="Ljung")

    Box-Ljung test

data:  residuals(m6, standardize = TRUE)
X-squared = 14.517, df = 10, p-value = 0.1507
# Dự báo mean và variance (1 ngày):
ugarchforecast(m6, n.ahead = 1)

*------------------------------------*
*       GARCH Model Forecast         *
*------------------------------------*
Model: iGARCH
Horizon: 1
Roll Steps: 0
Out of Sample: 0

0-roll forecast [T0=1979-01-06]:
        Series   Sigma
T+1 -0.0002152 0.01716
# Tính VaR (Phương pháp của JP Morgan xem mean = 0): 
var1 <- 0 + qnorm(0.95) * 0.01716
var1
[1] 0.02822569
# Cách 2: tính từ RMeasure.R
# Tạo đường dẫn tới file RMeasure.R: 
# setwd("đường dẫn")
setwd("~/Library/CloudStorage/OneDrive-Personal/0. Bai giang/QTRRTC/R")
# Gọi tên file ra: 
source("RMeasure.R")
# Tính VaR: RMeasure(mu, sigma)
var2 <- RMeasure(0, 0.01716)

 Risk Measures for selected probabilities: 
      prob        VaR         ES
[1,] 0.950 0.02822569 0.03539615
[2,] 0.990 0.03992013 0.04573508
[3,] 0.999 0.05302839 0.05777927
var2
$results
      prob        VaR         ES
[1,] 0.950 0.02822569 0.03539615
[2,] 0.990 0.03992013 0.04573508
[3,] 0.999 0.05302839 0.05777927
# 10.2. Ước tính VaR theo ECONOMICTRICS (dùng các model dòng nhà Garch để ước lượng mu, sigma)
# Chạy ARIMA+GARCH:
m7 <- garchFit(~ arma(1,0) + garch(1,1), data = nreturn, trace=F)
# Xem kết quả + kiểm định: 
summary(m7)

Title:
 GARCH Modelling 

Call:
 garchFit(formula = ~arma(1, 0) + garch(1, 1), data = nreturn, 
    trace = F) 

Mean and Variance Equation:
 data ~ arma(1, 0) + garch(1, 1)
<environment: 0x3046c1a50>
 [data = nreturn]

Conditional Distribution:
 norm 

Coefficient(s):
         mu          ar1        omega       alpha1        beta1  
-5.7996e-04   7.5048e-02   6.1547e-06   1.2663e-01   8.3734e-01  

Std. Errors:
 based on Hessian 

Error Analysis:
         Estimate  Std. Error  t value Pr(>|t|)    
mu     -5.800e-04   1.721e-04   -3.369 0.000753 ***
ar1     7.505e-02   1.983e-02    3.785 0.000154 ***
omega   6.155e-06   1.104e-06    5.573  2.5e-08 ***
alpha1  1.266e-01   1.392e-02    9.097  < 2e-16 ***
beta1   8.373e-01   1.711e-02   48.952  < 2e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Log Likelihood:
 10208.39    normalized:  3.10097 

Description:
 Mon May 11 21:53:31 2026 by user:  



Standardised Residuals Tests:
                                   Statistic    p-Value
 Jarque-Bera Test   R    Chi^2  4474.8029016 0.00000000
 Shapiro-Wilk Test  R    W         0.9451217 0.00000000
 Ljung-Box Test     R    Q(10)    14.7405995 0.14180921
 Ljung-Box Test     R    Q(15)    24.5752694 0.05594642
 Ljung-Box Test     R    Q(20)    26.0669243 0.16361293
 Ljung-Box Test     R^2  Q(10)     9.0292794 0.52932713
 Ljung-Box Test     R^2  Q(15)     9.9976625 0.81988693
 Ljung-Box Test     R^2  Q(20)    12.7389959 0.88829958
 LM Arch Test       R    TR^2      9.8836209 0.62616986

Information Criterion Statistics:
      AIC       BIC       SIC      HQIC 
-6.198902 -6.189638 -6.198907 -6.195586 
# Dự báo 1 ngày: 
predict(m7, 1)
   meanForecast  meanError standardDeviation
1 -0.0002216967 0.01547953        0.01547953
# Tính VaR: 
var3 <- -0.0002216967 + qnorm(0.95)*0.01547953
var3
[1] 0.02523986
# 10.3. Ước lượng QUANTILE ESTIMATION (ước lượng phân vị trực tiếp), còn gọi là phương pháp lịch sử
# Xác định mức xác suất: 
prob1 <- c(0.90, 0.95, 0.99)
# Tính VaR theo các mức xác suất: 
var4 <- quantile(nreturn, prob1)
# var4 <- quantile(nreturn, 0.95)
var4
       90%        95%        99% 
0.01234834 0.01911465 0.03971924 
# 10.4. Ước lượng MONTE CARLO SIMULATION
# Tính mean và standard deviation của nreturn:
mean_vn <- mean(nreturn)
sd_vn <- sd(nreturn)
# Tiến hành mô phỏng Monte Carlo
set.seed(42)
sim1 <- rnorm(10000, mean = mean_vn, sd = sd_vn)
ts.plot(sim1)

var5 <- quantile(sim1, prob1)
# var5 <- quantile(sim1, 0.95)
var5
       90%        95%        99% 
0.01504569 0.01941961 0.02761781