Chuỗi thời gian là một chủ đề khá rộng và có ứng dụng rất nhiều trong thực tế,
đặc biệt là chuỗi thời gian mờ. Trong R có không ít package hỗ trợ phân tích chuỗi
thời gian. Tuy nhiên còn 2 vấn đề (theo tìm hiểu của chúng tôi) mà các package ấy
chưa hỗ trợ là tìm một mô hình tối ưu từ rất nhiều mô hình dự tuyển thuộc lớp mô
hình “ARIMA”, “ARIMAX” và “GARCH”, thứ hai là các mô hình chuỗi thời gian
mờ. Package AnalyzeTS được nhóm chúng tôi xây dựng trong quá trình thực hiện đề
tài luận văn tốt nghiệp của mình. Công dụng chính của package là giải quyết 2 vấn
đề nêu trên.
62 trang |
Chia sẻ: Mr Hưng | Lượt xem: 1029 | Lượt tải: 0
Bạn đang xem trước 20 trang nội dung tài liệu Phân tích chuỗi thời gian với sự hỗ trợ của package analyzets, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
ndex
da
ta
0 10 20 30 40
10
0
15
0
20
0
ts
forecast
Chen-Hsu 10 fuzzy set
index
da
ta
0 10 20 30 40
10
0
15
0
20
0
ts
forecast
Chen-Hsu 12 fuzzy set
index
da
ta
0 10 20 30 40
10
0
15
0
20
0
ts
forecast
Chen-Hsu 15 fuzzy set
index
da
ta
0 10 20 30 40
10
0
15
0
20
0
ts
forecast
Phân tích chuỗi thời gian với sự hỗ trợ của package AnalyzeTS
44
> goc<-data.frame(ban)
> chen.hsu.density<-data.frame(chen.hsu8.density,
+chen.hsu10.density,chen.hsu12.density,chen.hsu15.density)
> av.res(Y=goc,F=chen.hsu.density)
chen.hsu8.density chen.hsu10.density chen.hsu12.density
ME 1.431 0.065 0.586
MAE 5.09 3.635 3.75
MPE 0.9 -0.109 0.478
MAPE 3.989 2.761 2.941
MSE 42.539 21.814 20.911
RMSE 6.522 4.671 4.573
U 0.093 0.066 0.065
chen.hsu15.density min.model
ME 0.227 chen.hsu10.density
MAE 3.069 chen.hsu15.density
MPE 0.062 chen.hsu10.density
MAPE 2.389 chen.hsu15.density
MSE 13.764 chen.hsu15.density
RMSE 3.71 chen.hsu15.density
U 0.053 chen.hsu15.density
Theo tiêu chuẩn MAPE mô hình Chen-Hsu với 15 tập mờ (chen.hsu15.density)
là tốt nhất.
Mô hình Chen-Hsu với bin != NULL
Nếu bin = NULL thì số tập mờ sẽ được R chia lại lần hai theo giá trị của tham
số‘divide’. Khi đó, số lượng phần tử có trong các tập mờ iA , ni ,1 có thể không như
ý muốn. Để R chia lại số tập mờ theo ý muốn, ta dùng tham số ‘bin’ của hàm. Cho
‘bin’ một vector số mà các phần tử của vector là các điểm chia của các tập mờ (không
có giá trị của điểm đầu và điểm cuối) khi đó R sẽ chia số tập mờ theo tham số ‘bin’.
Trong lần phân tập mờ đầu tiên, chúng tôi cho số tập mờ là 8 và được kết quả
của 8 tập mờ.
> fuzzy.ts1(ban,n=8,type="Chen-Hsu",trace=1)$table1
set dow up mid num
1 A1 61.94 84.30625 73.12313 5
2 A2 84.30625 106.6725 95.48937 5
3 A3 106.6725 129.0388 117.8556 7
4 A4 129.0388 151.405 140.2219 8
5 A5 151.405 173.7713 162.5881 9
6 A6 173.7713 196.1375 184.9544 5
7 A7 196.1375 218.5038 207.3206 5
8 A8 218.5038 240.87 229.6869 3
Từ bảng kết quả ta thấy, các phần tử trong tập mờ thứ 4 và 5 nhiều hơn số
Phân tích chuỗi thời gian với sự hỗ trợ của package AnalyzeTS
45
phần tử của các tập mờ còn lại rất nhiều. Do đó, ta sẽ chia như sau
> chen.hsu.bin<-fuzzy.ts1(ban,type="Chen-Hsu",bin=c(84.30625,106.6725,129.0388,
+ 140.2219,151.405,162.5882,173.7713,196.1375,218.5038),plot=TRUE)
Chen-Hsu 5 fuzzy set
index
d
a
ta
0 10 20 30 40
1
0
0
1
5
0
2
0
0
ts
forecast
Đoạn Số phần tử trong đoạn
A1 = [61.94; 84.30625] 5
A2 = [84.30625; 106.6725] 5
A3 = [106.6725; 129.0388] 7
A4.1 = [129.0388;140.2219] 3
A4.2 = [140.2219;151.405] 5
A5.1 = [151.405; 162.5882] 5
A5.2 = [162.5882; 173.7713] 4
A6 = [173.7713; 196.1375] 5
A7 = [196.1375; 218.5038] 5
A8 = [218.5038; 240.87] 3
Phân tích chuỗi thời gian với sự hỗ trợ của package AnalyzeTS
46
e) Tìm mô hình mờ tốt nhất và xây dựng mô hình ARIMA
> goc<-data.frame(ban)
> mo<-data.frame(chen15,singh15,heuristic15,chen.hsu15.dt,
+ chen.hsu15.density,chen.hsu.bin)
> av.res(Y=goc,F=mo)
chen15 singh15 heuristic15 chen.hsu15.dt
ME 1.54 -0.126 0.235 0.235
MAE 27.27 3.033 23.24 3.04
MPE -6.067 -0.206 -5.049 0.068
MAPE 22.048 2.365 18.091 2.37
MSE 1193.914 13.928 943.975 13.661
RMSE 34.553 3.732 30.724 3.696
U 0.491 0.053 0.437 0.053
chen.hsu15.density chen.hsu.bin min.model
ME 0.227 1.831 singh15
MAE 3.069 4.868 singh15
MPE 0.062 1.191 chen15
MAPE 2.389 3.829 singh15
MSE 13.764 37.641 chen.hsu15.dt
RMSE 3.71 6.135 chen.hsu15.dt
U 0.053 0.087 chen.hsu15.dt
Theo tiêu chuẩn MAPE mô hình Singh với 15 tập mờ (singh15) là tốt nhất trong
tất cả các mô hình mờ. Chúng ta chọn chuỗi này để đi xây dựng mô hình ARIMA.
Các bước xây dựng mô hình ARIMA tương tự mục 2.3.3 sau khi đã tìm được
chuỗi làm trơn tốt nhất. Sau khi thực hiện qua các bước 1 và 2 ta tìm được mô hình
tối ưu là SARIMA(1,1,0)x(0,0,1)[5]. Tuy nhiên khi thực hiện bước 3 để kiểm định,
ta lại thấy chuỗi phần dư không là ngẫu nhiên trắng. Do đó mô hình này không thích
hợp để dự báo cho tương lai.
2.4. Mô hình chuỗi thời gian mờ Abbasov-Mamedova
> ban<-ts(dat$sales)
> w2<-fuzzy.ts2(ban,n=5,r=7,w=2,C=0.00001,trace=TRUE,forecast=15,plot=TRUE)
Phân tích chuỗi thời gian với sự hỗ trợ của package AnalyzeTS
47
> w2
$type
[1] "Abbasov-Manedova"
$table1
U low up Bw
1 u1 -140.76 -81.026 -110.893
2 u2 -81.026 -21.292 -51.159
3 u3 -21.292 38.442 8.575
4 u4 38.442 98.176 68.309
5 u5 98.176 157.91 128.043
$table2
point ts diff.ts
1 1 199.95 NA
2 2 195.74 -4.21
Abbasov-Mamedova, C = 1e-05 w = 2 n = 5
index
d
a
ta
0 10 20 30 40
1
0
0
1
5
0
2
0
0
ts
forecast
Phân tích chuỗi thời gian với sự hỗ trợ của package AnalyzeTS
48
3 3 102.68 -93.06
45 45 82.96 8.83
46 46 240.87 157.91
47 47 151.52 -89.35
$table3
[1] NA
[2] "A[2]={(0.9999989/u1),(0.9999998/u2),(1/u3),(0.9999995/u4),(0.9999983/u5)}"
[3] "A[3]={(1/u1),(0.9999998/u2),(0.999999/u3),(0.9999974/u4),(0.9999951/u5)}"
[45] "A[45]={(0.9999986/u1),(0.9999996/u2),(1/u3),(0.9999996/u4),(0.9999986/u5)}"
[46] "A[46]={(0.9999928/u1),(0.9999956/u2),(0.9999978/u3),(0.9999992/u4),(0.9999999/u5)}"
[47] "A[47]={(1/u1),(0.9999999/u2),(0.999999/u3),(0.9999975/u4),(0.9999953/u5)}"
$table4
point interpolate diff.interpolate
1 4 111.25488 8.574882
2 5 171.45494 8.574937
3 6 110.33498 8.574979
42 45 82.7049 8.5749
43 46 91.53489 8.574894
44 47 249.44518 8.575181
$table5
point forecast diff.forecast
1 48 258.0203 8.575082
2 49 266.5952 8.574896
3 50 275.1702 8.575
4 51 283.7452 8.575
5 52 292.3202 8.575
$table6
[1] "A[48]={(0.9999986/u1),(0.9999996/u2),(1/u3),(0.9999996/u4),(0.9999986/u5)}"
[2] "A[49]={(0.9999986/u1),(0.9999996/u2),(1/u3),(0.9999996/u4),(0.9999986/u5)}"
[3] "A[50]={(0.9999986/u1),(0.9999996/u2),(1/u3),(0.9999996/u4),(0.9999986/u5)}"
[4] "A[51]={(0.9999986/u1),(0.9999996/u2),(1/u3),(0.9999996/u4),(0.9999986/u5)}"
[5] "A[52]={(0.9999986/u1),(0.9999996/u2),(1/u3),(0.9999996/u4),(0.9999986/u5)}"
$accuracy
ME MAE MPE MAPE MSE RMSE U
Abbasov.Mamedova -7.465 59.492 -19.668 48.1 5031.496 70.933 1.005
> w3<-fuzzy.ts2(ban,n=5,r=7,w=3,C=0.00001,trace=TRUE,forecast=5)
> w4<-fuzzy.ts2(ban,n=5,r=7,w=4,C=0.00001,trace=TRUE,forecast=5)
Phân tích chuỗi thời gian với sự hỗ trợ của package AnalyzeTS
49
> w5<-fuzzy.ts2(ban,n=5,r=7,w=5,C=0.00001,trace=TRUE,forecast=5)
> w6<-fuzzy.ts2(ban,n=5,r=7,w=6,C=0.00001,trace=TRUE,forecast=5)
> sosanh<-rbind(w2$accuracy,w3$accuracy,w4$accuracy,w5$accuracy,
+ w6$accuracy)
> dimnames(sosanh)[[1]]<-c("w2","w3","w4","w5","w6")
> sosanh
ME MAE MPE MAPE MSE RMSE U
w2 -7.465 59.492 -19.668 48.1 5031.496 70.933 1.005
w3 -8.839 59.675 -20.862 48.482 5086.53 71.32 1.008
w4 -7.39 59.437 -19.728 48.005 5091.986 71.358 1.005
w5 -9.439 59.018 -21.209 48.177 5073.051 71.225 1.009
w6 -7.791 58.61 -20.172 47.814 5057.993 71.12 1.006
Theo tiêu chuẩn MAPE chúng ta thấy mô hình w6 (mô hình với tham số w = 6)
có giá trị nhỏ nhất, ta nói mô hình Abbasov-Mamedova với tham số w=6 là đáng tin
cậy nhất.
Truy xuất giá trị dự báo và vẽ đồ thị dự báo của mô hình như sau:
> dubao.abbasov<- w6$table5
point forecast diff.forecast
1 48 258.0201 8.57486
2 49 266.5951 8.575
3 50 275.1701 8.575
4 51 283.7451 8.575
5 52 292.3201 8.575
> plot(dubao.abbasov [,2],type="o",pch=18,col=2,xlab="point",ylab="sales",
+ main="Đồ thị dự báo bằng mô hình Abbasov-Mamedova")
> grid.on(v=FALSE)
1 2 3 4 5
2
6
0
2
7
5
2
9
0
Ðồ thị dự báo bằng mô hình Abbasov-Mamedova
point
s
a
le
s
Phân tích chuỗi thời gian với sự hỗ trợ của package AnalyzeTS
50
2.5. Tổng hợp và so sánh các mô hình dự báo
Sau khi phân tích qua các mô hình, ta có được 3 mô hình có thể dự báo được là
mô hình với biến giả nhiệt độ, mô hình với số liệu làm trơn và mô hình Abbasov-
Mamedova. Ta có kết quả dự báo từ 3 mô hình này lại thành một data frame để tiện
quan sát.
> kqth<-data.frame(bien.gia=dubao.bgia$pred,tron=dubao.tron$pred,
+ chuoi.mo=dubao.abbasov$forecast)
> kqth
bien.gia tron chuoi.mo
1 120.6013 150.7967 258.0201
2 146.9638 132.7841 266.5951
3 138.5314 122.5042 275.1701
4 143.7891 138.9585 283.7451
5 139.8764 156.1941 292.3201
Nhìn chung ngoài mô hình Abbasov-Mamedova có giá trị dự báo tăng liên tục,
thì 2 mô hình còn lại đều có giá trị tăng giảm không đều trong 5 ngày tiếp theo.
> bien.gia<-fitted(fit.bgia)
> lam.tron<-c(NA,NA,fitted(fit.tron))
> abbasov<-c(rep(NA,7),w6$table4$interpolate)
> noisuy<-data.frame(bien.gia,lam.tron,abbasov)
> goc<-data.frame(ban)
> av.res(Y=goc,F=noisuy)
bien.gia lam.tron abbasov min.model
ME -3.628 -1.087 -7.791 abbasov
MAE 33.414 37.92 58.61 bien.gia
MPE -12.893 -11.267 -20.172 abbasov
MAPE 28.259 30.344 47.814 bien.gia
MSE 1771.301 2061.165 5057.993 bien.gia
RMSE 42.087 45.4 71.12 bien.gia
U 0.605 0.638 1.006 bien.gia
Theo tiêu chuẩn MAPE thì mô hình bien.gia (mô hình ARIMA với biến giả
nhiệt độ) là đáng tin cậy nhất. Các lệnh bên dưới giúp vẽ một đồ thị tổng hợp cho kết
quả dự báo.
> plot(kqth$bien.gia,type="o",pch=16,col="blue",xlab="point",ylab="sales",
+ main="Kết quả dự báo từ các mô hình",ylim=c(min(kqth),max(kqth)))
> lines(kqth$tron~c(48:52),pch=17,type="o",col="green")
> lines(kqth$chuoi.mo~c(48:52),pch=18,type="o",col="red")
> legend(51,250,c("biến giả","làm trơn","chuỗi mờ"),lty=c(1,1,1),
+ pch=c(16,17,18),col=c("blue","green","red"))
> grid.on()
Phân tích chuỗi thời gian với sự hỗ trợ của package AnalyzeTS
51
3. Bài toán tỷ xuất sinh lợi giá cổ phiếu
3.1. Nguồn số liệu
Trong phân tích tài chính, nếu kí hiệu một loại giá cả thay đổi hàng ngày là
,tGia để thuận tiện cho việc phân tích các yếu tố ngẫu nhiên của các chỉ số, người ta
hay xét các đại lượng
1
1
t t
t
t
Gia Gia
SST
Gia
Hay 1ln lnt t tSSL Gia Gia được xem là tỷ suất sinh lợi (lợi nhuận) hay lợi
nhuận logarit (t 1) , tGia là giá tại thời điểm t.
Giả thiết thường được ưa chuộng nhất là giả thiết cho rằng 1,..., tSSL SSL tuân
theo luật phân phối chuẩn. Thế nhưng, theo sự phân tích các chuỗi thời gian tài chính,
giả thiết đó rất nhiều khi không phù hợp với thực tế diễn biến của giá cả tài chính.
Ta có thể phân tích chuỗi giá chứng khoán thông qua việc phân tích chuỗi .tSSL
Dữ liệu phân tích cho bài toán này là giá cổ phiếu ACB – mã cổ phiếu của Ngân
hàng Á Châu.
Nguồn dữ liệu được lấy từ thời điểm 21/11/2006 đến 29/09/2015 tại địa chỉ
www.Cophieu68.com/export/excel.php?id=ACB
Kết quả dự báo từ các mô hình
point
sa
le
s
48 49 50 51 52
1
5
0
2
0
0
2
5
0
biến giả
làm tron
chuỗi mờ
Phân tích chuỗi thời gian với sự hỗ trợ của package AnalyzeTS
52
Giá cổ phiếu được tính lúc đóng cửa (đơn vị ngàn đồng).
3.1. Mô hình ARMA–GARCH
Bước 1: Thiết lập suất sinh lợi và xác định mô hình dự báo
Ta tạo ra chuỗi dữ liệu suất sinh lợi với 2199 quan sát, trong đó suất sinh lợi của
chỉ số giá chứng khoán ACB được tính theo công thức SSL(t)=ln(Gia(t)/Gia(t-1)).
> data<-read.csv(file.choose(),header=TRUE)
> names(data)
[1] "X.Ticker." "X.DTYYYYMMDD." "X.OpenFixed." "X.HighFixed."
[5] "X.LowFixed." "X.CloseFixed." "X.Volume." "X.Open."
[9] "X.High." "X.Low." "X.Close." "X.VolumeDeal."
[13] "X.VolumeFB." "X.VolumeFS." "date" "month"
> head(data1)
X.DTYYYYMMDD. X.CloseFixed. date month
1 20150929 19.4 29 9
2 20150928 19.3 28 9
3 20150925 19.7 25 9
4 20150924 19.5 24 9
5 20150923 19.3 23 9
6 20150922 19.2 22 9
Đây là file số liệu gốc, nên bộ số liệu có khá nhiều cột và thứ tự các ngày không
đúng với thứ tự chuỗi thời gian. Nên ta cần đảo lại thứ tự của dữ liệu và trích lọc
chuỗi giá đóng cửa (cột X.CloseFixed) để phân tích. Đoạn code phía sau làm 2 công
việc này.
> temp<-data1
> data2<-temp
> for(i in 1:dim(data2)[1]) data2[i,]<-temp[length(data[,6])-i+1,]
> head(data2)
X.DTYYYYMMDD. X.CloseFixed. date month
1 20061121 26.3 21 11
2 20061122 27.2 22 11
3 20061123 27.9 23 11
4 20061124 29.6 24 11
5 20061127 29.6 27 11
6 20061128 28.9 28 11
> close<-ts(data2[,2],start=1,frequency=5)
Chuỗi giá đóng của đã được lưu trữ trong đối tượng close dưới dạng chuỗi thời
gian, ta có thể dùng nó để phân tích.
> #Suất sinh lợi
> ln.close<-log(close)
> SSL<-diff(ln.close)
> Descriptives(SSL,plot="TRUE",r=0,answer=2)
Phân tích chuỗi thời gian với sự hỗ trợ của package AnalyzeTS
53
N: NaN: Min: 1sq QU: Median: Mean: 3rd QU: Max: VAR: SD: SE:
x 2198 0 0 0 0 0 0 0 0 0 0
> library(urca)
> summary(ur.df(SSL,type="none",lags=5,selectlag="BIC"))
Tóm tắt kết quả kiểm định ADF.
Test value
Giá trị tới hạn tau
1% 5% 10%
-32.0015 -2.58 -1.95 -1.62
Chuỗi SSL dao động quanh giá trị 0, kiểm định ADF cho giá trị thống kê
|tau| = |-32.0015| > |-1.95| (giá trị tới hạn tau 5%). Ta có đủ bằng chứng để kết luận
chuỗi SSL là chuỗi dừng.
Từ biểu đồ ACF và PACF chúng ta xác định được mô hình cần tìm là SARIMA
với các bậc là p = 2, d = 0, q = 1, P = 1, D = 0, Q = 1.
Time
x
0 100 200 300 400
-0
.1
0
0
.0
0
0
.1
0
Histogram of x
x
D
e
n
s
it
y
-0.10 0.00 0.10
0
1
0
2
0
3
0
4
0
5
0
Skewness: 0
Kurtosis: 4
0 1 2 3 4 5 6
0
.0
0
0
.0
5
0
.1
0
0
.1
5
Series x
Lag
A
C
F
0 1 2 3 4 5 6
-0
.0
5
0
.0
5
0
.1
5
Lag
P
a
rt
ia
l
A
C
F
Series x
Phân tích chuỗi thời gian với sự hỗ trợ của package AnalyzeTS
54
Bước 2: Tìm mô hình tối ưu
> PrintAIC(SSL,order=c(2,0,1),seas=list(order=c(1,0,1),frequency=5),type="SARIMA")
$mohinh
Mo hinh Gia tri AIC Xep loai
mo hinh 1 SARIMA(0,0,1)*(0,0,1),s=5 ...AIC = -10306.5 .......... 1
mo hinh 2 SARIMA(0,0,1)*(1,0,0),s=5 ...AIC = -10305.59 .......... 4
mo hinh 3 SARIMA(0,0,1)*(1,0,1),s=5 ...AIC = -10306.31 .......... 2
mo hinh 4 SARIMA(1,0,0)*(0,0,1),s=5 ...AIC = -10304.28 .......... 9
mo hinh 5 SARIMA(1,0,0)*(1,0,0),s=5 ...AIC = -10303.32 ......... 15
mo hinh 6 SARIMA(1,0,0)*(1,0,1),s=5 ...AIC = -10304.18 ......... 11
mo hinh 7 SARIMA(1,0,1)*(0,0,1),s=5 ...AIC = -10304.54 .......... 7
mo hinh 8 SARIMA(1,0,1)*(1,0,0),s=5 ...AIC = -10303.64 ......... 13
mo hinh 9 SARIMA(1,0,1)*(1,0,1),s=5 ...AIC = -10304.35 .......... 8
mo hinh 10 SARIMA(2,0,0)*(0,0,1),s=5 ...AIC = -10305.6 .......... 3
mo hinh 11 SARIMA(2,0,0)*(1,0,0),s=5 ...AIC = -10304.74 .......... 6
mo hinh 12 SARIMA(2,0,0)*(1,0,1),s=5 ...AIC = -10305.35 .......... 5
mo hinh 13 SARIMA(2,0,1)*(0,0,1),s=5 ...AIC = -10304.18 ......... 10
mo hinh 14 SARIMA(2,0,1)*(1,0,0),s=5 ...AIC = -10303.34 ......... 14
mo hinh 15 SARIMA(2,0,1)*(1,0,1),s=5 ...AIC = -10303.89 ......... 12
$best
Mo hinh toi uu
SARIMA(0,0,1)*(0,0,1),s=5 ...AIC = -10306.5
Mô hình tối ưu là SARIMA(0,0,1)*(0,0,1)[5]. Ước lượng hệ số cho mô hìnhtối
ưu.
> fit1<-arima(SSL,order=c(0,0,1),seas=list(order=c(0,0,1),5))
> fit1
Call:
arima(x = SSL, order = c(0, 0, 1), seasonal = list(order = c(0, 0, 1), 5))
Coefficients:
ma1 sma1 intercept
0.1514 0.0903 -1.00E-04
s.e. 0.0211 0.0219 6.00E-04
sigma^2 estimated as 0.0005364: log likelihood = 5157.25, aic = -10308.5
Bước 3: Kiểm tra hiệu ứng ARCH
> Descriptives(res,answer=2,plot=TRUE)
N: NaN: Min: 1sq QU: Median: Mean: 3rd QU: Max: VAR: SD: SE:
x 2198 0 -0.12 -0.01 0 0 0.01 0.13 0 0.02 0
Phân tích chuỗi thời gian với sự hỗ trợ của package AnalyzeTS
55
> Box.test(res,lag=32,type="Ljung")
Box-Ljung test
data: res
X-squared = 47.459, df = 32, p-value = 0.03855
Chuỗi phần dư có các giá trị dao động quanh giá trị 0, nhưng có phương sai
không bằng nhau.
Trên biểu đồ ACF có nhiều độ trễ lớn hơn 0, kiểm định Ljung – Box cho giá trị
p–value = 1.00e-04< 0.05, cho thấy có hiện tượng tương quan chuỗi trong chuỗi phần
dư. Ta thực hiện kiểm định nhân tử Lagrange để xem có ảnh hưởng ARCH/GARCH
hay không.
Time
x
0 100 200 300 400
-0
.1
0
0
.0
0
0
.1
0
Histogram of x
x
D
e
n
s
it
y
-0.10 0.00 0.10
0
1
0
2
0
3
0
4
0
Skewness: 0.15
Kurtosis: 3.74
0 1 2 3 4 5 6
-0
.0
4
0
.0
0
0
.0
4
Series x
Lag
A
C
F
0 1 2 3 4 5 6
-0
.0
4
0
.0
0
0
.0
4
Lag
P
a
rt
ia
l
A
C
F
Series x
Phân tích chuỗi thời gian với sự hỗ trợ của package AnalyzeTS
56
> library(FinTS)
> ArchTest(res,30)
ARCH LM-test; Null hypothesis: no ARCH effects
data: res
Chi-squared = 418.5, df = 30, p-value < 2.2e-16
Giá trị p-value < 2.2e-16 (rất nhỏ hơn so với mức ý nghĩa 5%) chúng ta bác bỏ
giả thuyết, tức là chuỗi phần dư có ảnh hưởng ARCH/GARCH.
Bước 4: Xác định bậc của ARCH
> tsnew<-res^2
> par(mfrow=c(2,1))
> acf(tsnew,lag=100)
> pacf(tsnew,lag=100)
0 5 10 15 20
-0
.0
5
0
.1
5
0
.3
0
Series tsnew
Lag
A
C
F
0 5 10 15 20
-0
.0
5
0
.1
0
0
.2
5
Lag
P
a
rt
ia
l
A
C
F
Series tsnew
Phân tích chuỗi thời gian với sự hỗ trợ của package AnalyzeTS
57
Từ biểu đồ trên ta thấy, biểu đồ ACF tắt dần về 0 nên ta khẳng định chuỗi phần
dư có ảnh hưởng ARCH. Chọn bậc q = 9, ta tìm mô hình tối ưu từ các mô hình
dự tuyển.
> PrintAIC(res,order=9,type="ARCH")
$mohinh
Mo hinh Gia tri AIC Xep loai
mo hinh 1 ARCH(1) ...AIC = -10845.84 .......... 9
mo hinh 2 ARCH(2) ...AIC = -11186.86 .......... 8
mo hinh 3 ARCH(3) ...AIC = -11230.91 .......... 7
mo hinh 4 ARCH(4) ...AIC = -11345.73 .......... 6
mo hinh 5 ARCH(5) ...AIC = -11386.54 .......... 5
mo hinh 6 ARCH(6) ...AIC = -11402.35 .......... 4
mo hinh 7 ARCH(7) ...AIC = -11406.84 .......... 3
mo hinh 8 ARCH(8) ...AIC = -11451.1 .......... 2
mo hinh 9 ARCH(9) ...AIC = -11451.65 .......... 1
$best
Mo hinh toi uu
ARCH(9) ...AIC = -11451.65
Warning messages:
1: In sqrt(pred$e) : NaNs produced
2: In sqrt(pred$e) : NaNs produced
3: In sqrt(pred$e) : NaNs produced
4: In sqrt(pred$e) : NaNs produced
5: In sqrt(pred$e) : NaNs produced
6: In sqrt(pred$e) : NaNs produced
7: In sqrt(pred$e) : NaNs produced
8: In sqrt(pred$e) : NaNs produced
Mô hình tối ưu là ARCH(8). Tuy nhiên bậc 8 là khá lớn nên ta xét thêm mô hình
của GARCH(1,1) để xem chỉ số AIC của mô hình có tốt hơn không.
> PrintAIC(res,order=c(1,1),type="GARCH")
$mohinh
Mo hinh Gia tri AIC Xep loai
mo hinh 1 GARCH(1,0) ...AIC = -10306.93 .......... 2
mo hinh 2 GARCH(1,1) ...AIC = -11478.51 .......... 1
$best
Mo hinh toi uu
GARCH(1,1) ...AIC = -11478.51
Warning messages:
Phân tích chuỗi thời gian với sự hỗ trợ của package AnalyzeTS
58
1: In garch(DataTimeSeries, order = c(i1, i2), trace = FALSE) :
singular information
2: In sqrt(pred$e) : NaNs produced
Chỉ số AIC của GARCH(1,1) nhở hơn só với mô hình ARCH(8). Ta chọn mô
hình GARCH(1,1) để dự báo cho phương sai.
Bước 5: Ước lượng mô hình
Ta có bảng kết quả ước lượng của mô hình như sau:
> fit2<-garch(res,order=c(1,1),trace=0)
Warning message:
In sqrt(pred$e) : NaNs produced
> summary(fit2)
Call:
garch(x = res, order = c(1, 1), trace = 0)
Model:
GARCH(1,1)
Residuals:
Min 1Q Median 3Q Max
-9.67232 -0.55306 -0.00464 0.538362 6.086255
Coefficient(s):
Estimate Std. Error t value Pr(>|t|)
a0 1.32E-05 6.76E-07 19.55 <2e-16 ***
a1 2.69E-01 2.00E-02 13.46 <2e-16 ***
b1 7.43E-01 1.28E-02 58.01 <2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Diagnostic Tests:
Jarque Bera Test
data: Residuals
X-squared = 7449.6, df = 2, p-value < 2.2e-16
Box-Ljung test
data: Squared.Residuals
X-squared = 0.093516, df = 1, p-value = 0.7598
Phân tích chuỗi thời gian với sự hỗ trợ của package AnalyzeTS
59
Tất cả các hệ số của mô hình đều có ý nghĩa thống kê. Giá trị p-value của kiểm
định Ljung-Box là 0.7598 > 0.05 ta nói chuỗi sai số của mô hình là nhiễu trắng. Mô
hình là đầy đủ và có thể dùng để dự báo.
Bước 6: Dự báo
> forecastGARCH(fitGARCH=fit2,fitARMA=fit1,trace=TRUE,r=7)
$ARCH
a0 a1 b1
1.32e-05 2.69e-01 7.43e-01
$ARMA
ma1 sma1 intercept
0.151356 0.090348 -0.00014
$forecast
Point res res^2 SSL.forecast VAR.forecast
1 (440,4) 0.00892 7.96E-05 0.0002482
2 (440,5) 0.0017134 0.0002189
> sqrt( 0.0002189)
[1] 0.01479527
Theo kết quả dự báo vào ngày 30/09/2015 (ngày tiếp theo của chuỗi) suất sinh
lợi kỳ vọng của chỉ số chứng khoáng ACB sẽ tăng khoảng 0.17% với độ lệch chuẩn
dự kiến sẽ là 1.48%.
3.2. Mô hình ARMAX–GARCH
Sử dụng nguồn số liệu chỉ số chứng khoán ACB để phân tích mô hình, xem các
ngày lễ có ảnh hưởng như thế nào đến biến động của thị trường chứng khoáng ta tiến
hành kiểm định mô hình ARMAX – GARCH như sau:
Ta tạo ra chuỗi dữ liệu suất sinh lợi với 2199 quan sát và biến giả dummy được
hiểu là các ngày lễ lớn trong năm. Theo các dòng lệnh bên dưới để tính chuỗi tỷ suất
sinh lợi và chuỗi biến giả dummy.
> #Load dữ liệu
> event<-read.csv(file.choose(),header=TRUE)
> data<-read.csv(file.choose(),header=TRUE)
> temp<-data[,c(2,6,15,16)]
> close<-temp
> for(i in 1:dim(close)[1]) close[i,]<-temp[length(data[,6])-i+1,]
> #Tạo biến giả
> dummy<-rep(0,dim(close)[1])
> for(i in 1:length(dummy)){
Phân tích chuỗi thời gian với sự hỗ trợ của package AnalyzeTS
60
+ for(j in 1:dim(event)[1]){
+ if(close[i,3]==event[j,1] & close[i,4]==event[j,2])
+ dummy[i]<-1
+ }}
> dummy<-dummy[-1]
> dt<-ts(close[,2],start=c(1,1),frequency=5)
> ln.dt<-log(dt)
> SSL<-diff(ln.dt)
Sau khi thực hiện các dòng lệnh trên, chuỗi tỷ suất sinh lợi được gán trong đối
tượng SSL và chuỗi biến giả được gán trong đối tượng dummy.
Ta tìm một mô hình ARMAX cho chuỗi SSL với biến giả là dummy. Thực hiện
các bước phân tích tương tự như mục 2.3.2 ta tìm được mô hình tối ưu là
SARIMAX(0,0,1)x(0,0,1),s=5.
> fit1<-arimax(SSL,order=c(0,0,1),sea=list(order=c(0,0,1),5),xreg=dummy)
> res<-resid(fit1)
> tsnew<-res^2
Thực hiện tương tự mục 3.1 ta thấy chuỗi có hiệu ứng ARCH và tìm được mô
hình tối ưu là ARCH(8).
> fit2<-garch(res,order=c(0,8),trace=0)
Warning message:
In sqrt(pred$e) : NaNs produced
Dự báo
Ngày tiếp theo của chuỗi là ngày 30/09/2015 không trùng vào ngày lễ nào trong
năm nên giá trị biến giả sẽ là 0.
> forecastGARCH(fitGARCH=fit2,fitARMA=fit1,trace=TRUE,r=7,newxreg=0)
$ARCH
a0 a1 a2 a3 a4 a5
5.57e-05 3.59e-01 2.64e-01 7.51e-02 6.82e-02 7.64e-02
a6 a7 a8
5.56e-02 1.70e-02 1.65e-01
$ARMA
ma1 sma1 intercept xreg
0.151617 0.091441 -0.00031 0.001522
$forecast
Point res res^2 SSL.forecast VAR.forecast
1 (439,2) 0.008095 8.21E-05
2 (439,3) -0.00038 0.000464
3 (439,4) -0.00347 6.84E-05
4 (439,5) 0.004703 6.11E-05
5 (440,1) 0.007817 2.21E-05
6 (440,2) 0.008268 1.20E-05
Phân tích chuỗi thời gian với sự hỗ trợ của package AnalyzeTS
61
7 (440,3) -0.02154 1.00E-07
8 (440,4) 0.009061 6.55E-05
9 (440,5) 0.0014507 0.00023
> sd<-sqrt( 0.0012795)
> sd
[1] 0.0357701
Theo kết quả mô hình ARCH(8), vào ngày 30/09/2015 không trùng vào ngày lễ
nào trong năm nên ta có suất sinh lợi kỳ vọng của chỉ số chứng khoán ACB thay đổi
không đáng kể (giảm khoảng 0.33%) với độ lệch chuẩn dự kiến sẽ là 3.58%.
Phân tích chuỗi thời gian với sự hỗ trợ của package AnalyzeTS
62
TÀI LIỆU THAM KHẢO
[1] Hồng Việt Minh, Luận văn tốt nghiệp Đại học: Phân tích số liệu thống kê
với ngôn ngữ R.
[2] Mai Thị Hồng Diễm, Luận văn tốt nghiệp Đại học: Phân tích chuỗi tài chính
bằng mô hình chuỗi thời gian.
Các file đính kèm theo tài liệu này:
- phan_tich_chuoi_thoi_gian_voi_su_ho_tro_cua_package_analyzets_5969.pdf