cat("\014") # Lệnh này gửi mã để clear console
rm(list = ls()) # xoá all các biến
#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")
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
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")
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
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
# 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
# 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