Nguyễn Mai Hà Quyên_2221000322
GVHD: Th.S Trần Đình Phụng
if(!require(forecast)) install.packages("forecast", dependencies=TRUE)
## Loading required package: forecast
## Registered S3 method overwritten by 'quantmod':
## method from
## as.zoo.data.frame zoo
set.seed(123)
# Tham số (chỉnh nếu cần)
T <- 200
A0 <- 100
D <- 80
mu <- 1
sigma <- 5
phi <- 0.5
# 1) Giả lập dữ liệu - rủi ro độc lập
eps_indep <- rnorm(T, mean = 0, sd = 1)
A_indep <- numeric(T)
A_indep[1] <- A0
for (t in 2:T) {
A_indep[t] <- A_indep[t-1] + mu + sigma * eps_indep[t]
}
# 2) Giả lập dữ liệu - rủi ro AR(1)
eps_ar1 <- numeric(T)
eps_ar1[1] <- rnorm(1, 0, 1)
for (t in 2:T) {
eps_ar1[t] <- phi * eps_ar1[t-1] + rnorm(1, 0, 1)
}
A_ar1 <- numeric(T)
A_ar1[1] <- A0
for (t in 2:T) {
A_ar1[t] <- A_ar1[t-1] + mu + sigma * eps_ar1[t]
}
# ---------------------------
# 3) Ước lượng mô hình và in bảng hệ số
# ---------------------------
# 3.1 Mô hình độc lập: hồi quy theo thời gian (trend)
model_indep <- lm(A_indep ~ I(1:T))
summary_indep <- summary(model_indep)
cat("\n===== SUMMARY - MÔ HÌNH ĐỘC LẬP (lm) =====\n")
##
## ===== SUMMARY - MÔ HÌNH ĐỘC LẬP (lm) =====
print(summary_indep) # in toàn bộ summary (coeff, R2, F, ...)
##
## Call:
## lm(formula = A_indep ~ I(1:T))
##
## Residuals:
## Min 1Q Median 3Q Max
## -31.457 -6.169 -0.538 5.007 42.825
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 116.50735 1.87825 62.03 <2e-16 ***
## I(1:T) 0.93861 0.01621 57.92 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 13.23 on 198 degrees of freedom
## Multiple R-squared: 0.9443, Adjusted R-squared: 0.944
## F-statistic: 3355 on 1 and 198 DF, p-value: < 2.2e-16
# Tạo bảng hệ số gọn (Estimate, Std. Error, t value, Pr(>|t|))
coef_indep_df <- as.data.frame(summary_indep$coefficients)
coef_indep_df$Parameter <- rownames(coef_indep_df)
rownames(coef_indep_df) <- NULL
coef_indep_df <- coef_indep_df[, c("Parameter", "Estimate", "Std. Error", "t value", "Pr(>|t|)")]
names(coef_indep_df) <- c("Parameter", "Estimate", "Std.Error", "t.value", "p.value")
cat("\nBảng hệ số (mô hình độc lập):\n")
##
## Bảng hệ số (mô hình độc lập):
print(coef_indep_df)
## Parameter Estimate Std.Error t.value p.value
## 1 (Intercept) 116.5073543 1.87824880 62.02978 1.100007e-131
## 2 I(1:T) 0.9386075 0.01620535 57.91959 4.267735e-126
# 3.2 Mô hình AR(1): ARIMA(1,0,0)
# Dùng stats::arima để dễ lấy var.coef
model_ar1 <- arima(A_ar1, order = c(1,0,0), include.mean = TRUE, method = "ML")
cat("\n===== SUMMARY - MÔ HÌNH AR(1) (arima) =====\n")
##
## ===== SUMMARY - MÔ HÌNH AR(1) (arima) =====
print(model_ar1) # in tóm tắt
##
## Call:
## arima(x = A_ar1, order = c(1, 0, 0), include.mean = TRUE, method = "ML")
##
## Coefficients:
## ar1 intercept
## 0.9991 240.4748
## s.e. 0.0012 126.8270
##
## sigma^2 estimated as 32.45: log likelihood = -634.9, aic = 1275.81
# Lấy hệ số, sai số chuẩn, t, p (nếu var.coef có sẵn)
if (!is.null(model_ar1$var.coef)) {
coefs_ar1 <- model_ar1$coef
se_ar1 <- sqrt(diag(model_ar1$var.coef))
t_ar1 <- coefs_ar1 / se_ar1
p_ar1 <- 2 * pnorm(-abs(t_ar1))
coef_ar1_df <- data.frame(Parameter = names(coefs_ar1),
Estimate = unname(coefs_ar1),
Std.Error = se_ar1,
t.value = t_ar1,
p.value = p_ar1,
row.names = NULL)
} else {
# Nếu không có var.coef (hiếm khi xảy ra), chỉ in ước lượng
coef_ar1_df <- data.frame(Parameter = names(model_ar1$coef),
Estimate = as.numeric(model_ar1$coef))
}
cat("\nBảng hệ số (mô hình AR(1)):\n")
##
## Bảng hệ số (mô hình AR(1)):
print(coef_ar1_df)
## Parameter Estimate Std.Error t.value p.value
## 1 ar1 0.9990757 1.228768e-03 813.071328 0.00000000
## 2 intercept 240.4747587 1.268270e+02 1.896086 0.05794873
# ---------------------------
# 4) Các chỉ số đánh giá mô hình (AIC, BIC, R^2 pseudo)
# ---------------------------
aic_indep <- AIC(model_indep)
bic_indep <- BIC(model_indep)
r2_indep <- summary_indep$r.squared
aic_ar1 <- AIC(model_ar1)
bic_ar1 <- BIC(model_ar1)
# pseudo-R2 cho ARIMA (1 - RSS/TSS)
r2_ar1 <- 1 - sum(residuals(model_ar1)^2) / sum((A_ar1 - mean(A_ar1))^2)
cat("\nAIC/BIC/R2:\n")
##
## AIC/BIC/R2:
print(data.frame(
Model = c("Independent (lm)", "AR(1) (arima)"),
AIC = c(aic_indep, aic_ar1),
BIC = c(bic_indep, bic_ar1),
R2 = c(r2_indep, r2_ar1)
))
## Model AIC BIC R2
## 1 Independent (lm) 1604.604 1614.499 0.9442674
## 2 AR(1) (arima) 1275.806 1285.701 0.9969780
# ---------------------------
# 5) (Tùy chọn) Xuất bảng hệ số ra CSV để copy vào Word
# ---------------------------
write.csv(coef_indep_df, file = "coef_indep.csv", row.names = FALSE)
write.csv(coef_ar1_df, file = "coef_ar1.csv", row.names = FALSE)
# ---------------------------
# 6) Tính xác suất phá sản (Monte Carlo) như trước
# ---------------------------
simulate_bankruptcy <- function(model_type, Nsim = 10000) {
bankrupt_count <- 0
for (i in 1:Nsim) {
A <- A0
if (model_type == "independent") {
eps <- rnorm(T, 0, 1)
} else {
eps <- numeric(T)
eps[1] <- rnorm(1, 0, 1)
for (t in 2:T) eps[t] <- phi * eps[t-1] + rnorm(1, 0, 1)
}
for (t in 1:T) {
A <- A + mu + sigma * eps[t]
if (A < D) {
bankrupt_count <- bankrupt_count + 1
break
}
}
}
bankrupt_count / Nsim
}
p_indep <- simulate_bankruptcy("independent", Nsim = 10000)
p_ar1 <- simulate_bankruptcy("ar1", Nsim = 10000)
cat("\nXác suất phá sản (Độc lập):", round(p_indep, 4),
"| Xác suất phá sản (AR(1)):", round(p_ar1, 4), "\n")
##
## Xác suất phá sản (Độc lập): 0.1584 | Xác suất phá sản (AR(1)): 0.5035
# Tổng hợp bảng kết quả tóm tắt
results <- data.frame(
Model = c("Rủi ro Độc lập", "Rủi ro AR(1)"),
AIC = c(aic_indep, aic_ar1),
BIC = c(bic_indep, bic_ar1),
R2 = c(round(r2_indep,6), round(r2_ar1,6)),
Bankruptcy_Prob = c(round(p_indep,4), round(p_ar1,4))
)
cat("\n===== BẢNG TÓM TẮT KẾT QUẢ =====\n")
##
## ===== BẢNG TÓM TẮT KẾT QUẢ =====
print(results)
## Model AIC BIC R2 Bankruptcy_Prob
## 1 Rủi ro Độc lập 1604.604 1614.499 0.944267 0.1584
## 2 Rủi ro AR(1) 1275.806 1285.701 0.996978 0.5035