Ngoài ra, hàm pie() cho phép vẽ biểu đồ hình tròn, hàm barplot() vẽ biểu đồ cột, hàm stripchart() vẽ biểu đồ strip, hàm boxplot() vẽ biểu đồ hộp,... Hình 3-3, Hình 3-4, Hình 3-5 dưới đây minh họa một số loại biểu đồ được vẽ bởi các hàm trong R.
Hình 3-4: Biểu đồ hộp
Hình 3-5: Biểu đồ cột
Với những ưu điểm và sự phù hợp của ngôn ngữ R cho bài toán khai phá dữ liệu, dự đoán chứng khoán, chúng tôi sử dụng ngôn ngữ R để cài đặt, thử nghiệm cho kết quả của nghiên cứu này.
Chương 4. XÂY DỰNG CHƯƠNG TRÌNH VÀ ĐÁNH GIÁ 4.1. Chuẩn bị dữ liệu
Yêu cầu đầu tiên cần phải thực hiện được ở bất cứ công cụ xử lý dữ liệu nào đó là nạp dữ liệu vào hệ thống. Các xử lý, phân tích, đánh giá chỉ có thể thực hiện được khi có dữ liệu. Với ngôn ngữ R, việc nạp dữ liệu vào có thể được thực hiện một cách dễ dàng bởi các hàm có sẵn. R hỗ trợ lấy dữ liệu từ nhiều nguồn khác nhau như từ file văn bản, file dữ liệu chuẩn của R, file theo định dạng của Microsoft Excel, cơ sở dữ liệu SQL và thậm chí là trực tiếp trên Internet.
Ví dụ dưới đây là các lệnh của R dùng để nạp dữ liệu chuỗi thời gian trực tiếp từ Interrnet. Có thể sử dụng hàm getSymbols() từ thư viện quantmod (do Ryan phát triển năm 2009) để tải dữ liệu chứng khoán từ internet:
> library(DMwR) > library(xts) > data(GSPC)
> getSymbols('^GSPC',src='yahoo',from='1970-01-02') > colnames(GSPC) <- c("Open", "High", "Low", "Close", + "Volume", "Adjusted")
Trong đoạn mã lệnh trên, chúng ta tải dữ liệu chứng khoáng S&P500 trực tiếp trên yahoo từ ngày 02-01-1970.
Dữ liệu tải về có thể lưu và sử dụng lại bằng hàm write.zoo():
> write.zoo(GSPC, file = "GSPC-2013.csv")
Với cách thức lấy và ghi dữ liệu ở trên, lần sau ta có thể đọc lại tệp dữ liệu
GSPC-2013.csv đó bằng lệnh:
> GSPC <- as.xts(read.zoo('GSPC-2013.CSV',header=T))
S&P500 (Standard & Poor's 500 Stock Index) là một chỉ số chứng khoán bao gồm 500 loại chứng khoán được lựa chọn từ 500 công ty có mức vốn lớn nhất của Mỹ. S&P 500 được thiết kế để trở thành một công cụ hàng đầu của thị trường chứng khoán Mỹ và có ý nghĩa phản ánh những đặc điểm rủi ro/lợi nhuận của các công ty hàng đầu. Chỉ số S&P 500 là một trong những chuẩn đánh giá thông thường nhất dành cho thị trường chứng khoán Mỹ. Chỉ số trung bình công nghiệp Dow Jones đã
ty, vì vậy hầu hết mọi người tin rằng S&P 500 sẽ phản ánh thị trường tốt hơn và đầy đủ hơn. Trong nghiên cứu này chúng ta sẽ sử dụng dữ liệu chứng khoán S&P500 (^GSPC) được tải trực tiếp trên Yahoo Finance từ năm 1970 để phân tích thử nghiệm và dự đoán xu thế (tham khảo thêm về chứng khoán S&P500 tại địa chỉ: http://finance.yahoo.com/q?s=^GSPC ).
4.2. Xây dựng hàm và thực hiện tính toán
Trong phần này, chúng ta sẽ trình bày một số xử lý cần thiết phục vụ cho việc xây dựng mô hình dự báo biến động giá của S&P500 trong tương lai ở một thời điểm cụ thể dựa trên dữ liệu giao dịch đã có trong quá khứ. Qua đó giúp nhà đầu tư có được các tín hiệu trợ giúp ra quyết định mua vào, bán ra, hay giữ lại phù hợp.
Trước hết ta thực hiện tính toán tỷ lệ biến đổi giá p% (mức cáo hơn hay thấp hơn so với giá hiện hành). Giá trung bình hàng ngày tính theo công thức (4.1) bên dưới.
= (4.1)
Trong đó Ci, Hi và Li lần lượt là giá đóng cửa (Close), giá cao nhất (High), và giá thấp nhất (Low) cho ngày thứ i.
Gọi Vi là tỷ lệ biến đổi giá trung bình so với giá đóng cửa ngày thứ i của k
ngày:
=
(4.2)
Gọi T là biến chỉ báo có giá trị là tổng các biến đổi trên só với tỷ lệ biến đổi biên p%.
= ∑ { ∈ : > % ∨ < − %} (4.3)
Giá trị T là tín hiệu trong khoảng k ngày. Giá trị dương của T tương ứng với một số ngày có biến động giá lớn hơn giá đóng cửa. Trong tình huống đó là tín hiệu tốt để mua vào (giá sẽ biến đổi tăng trong tương lai). Trường hợp ngược lại, T âm là tín hiệu tốt cho việc bán ra (giá sẽ có xu hướng giảm). Trường hợp có biến động nhỏ
xung quanh 0 tín hiệu cho thấy giá sẽ giữ ổn định, khi đó nên giữ, không bán ra hay mua vào.
Hàm dưới đây được lập trong R sẽ biểu diễn cài đặt của các công thức trên:
> Technicals <- function(stocks,p=0.0025,day=7) { + v <- apply(HLC(stocks),1,mean)
+ r <- matrix(NA,ncol=day,nrow=NROW(stocks)) + for(x in 1:day) r[,x] <- Next(Delt(v,k=x),x)
+ x <- apply(r,1,function(x) sum(x[x > p | x < -p])) + if (is.xts(stocks)) xts(x,time(stocks)) else x + }
Hàm Technicals được xây dựng ở trên sử dụng hàm HLC() có sẵn để lấy ra thành phần giá cao nhất (High), thấp nhất (Low) và giá đóng cửa trong ngày (Close). Hàm Next() cho phép mỗi lần chuyển một giá trị kế tiếp trong chuỗi dữ liệu thời gian xử lý. Hàm Delt() dùng để tính toán tỷ lệ phần trăm biến đổi theo hàm log của chuỗi giá. Cuối cùng hàm thực hiện tính tổng và trả về giá trị tuyệt đối vượt ngoài biên p. Trong nghiên cứu này, chúng tôi dựa vào lịch sử giao dịch của 7 ngày trước đó để dự đoán xu hướng cho ngày tiếp theo, với giá trị biên p= 0.0025.
4.3. Vẽ biểu đồ
Như đã trình bày ở trên, để quan sát tổng thể và phục vụ cho nhà đầu tư dễ dàng hơn trong ra quyết định thì các chỉ báo nên thể hiện kết quả dưới dạng biểu đồ. Biểu đồ nến Nhật Bản (Candlesticks Chart) [16] là dạng biểu đồ cải tiến của biểu đồ dạng then chắn (Bar Chart). Dạng biểu đồ này có thể phản ánh rõ nét nhất về sự biến động của giá chứng khoán và được sử dụng rất hiệu quả trong việc xác định thời điểm mua/bán. Để vẽ biểu đồ dạng này, chúng ta sử dụng hàm chartSeries() như sau (xem kết quả minh họa ở Hình 4-1):
> chartSeries(last(GSPC,'6 months'),theme='white',TA=NULL, + name='Candle Chart (S&P500)')
Hình 4-1:Biểu đồ dạng nến Nhật Bản (Candlesticks Chart)
Để vẽ đường giá trung bình - Average Directional Index (ADX) ta thực hiện như sau (xem kết quả minh họa ở Hình 4-2):
> avgPrice <- function(p) apply(HLC(p),1,mean)
> addAvgPrice <- newTA(FUN=avgPrice,col=1,legend='AvgPrice') > addAvgPrice(on=1)
Hình 4-2: Đường chỉ số giá trung bình (SMA)
Để vẽ đồ thị cho hàm Technicals() định nghĩa ở trên, ta sử dụng hàm newTA().
> addTechnicals <- newTA(FUN=Technicals,col='red', + legend='Technicals')
> addTechnicals()
Hình 4-3: Đồ thị của hàm Technicals()
4.4. Xây dựng mô hình và kết quả thử nghiệm
Để xây dựng mô hình dự báo dựa trên các hàm chỉ số, trước tiên chúng ta định nghĩa các hàm chỉ số, sau đó sử dụng rừng ngẫu nhiên (random forest) để đánh giá mức độ ảnh hưởng của các hàm chỉ số và quyết định chọn các hàm chỉ số phù hợp với mô hình [17]. Thư viện randomForest được Liaw và Wiener phát triển từ năm
2002. Trong thư viện quantmod có hàm buildModel() hỗ trợ việc đánh giá mô hình [18].
Trong nghiên cứu này, chúng tôi sử dụng mạng nơron với 6 tham số đầu vào, 1 lớp ẩn (single-hidden-layer), 10 nút (size=10) cho lớp ẩn. Khi ứng dụng máy véctơ hỗ trợ, tôi thử nghiệm với phân lớp hồi quy eplison =0.1 (eps-regression), hàm nhân (kernel) radial (gamma=0.00001). Chúng ta sử dụng bộ dữ liệu lịch sử giao dịch của chứng khoán S&P500 ở trên để huấn luyện (train) và đánh giá (test) mô hình. Bộ dữ liệu train sử dụng các giao dịch từ năm 1970 đến hết năm 2007, bộ dữ liệu test là các giao dịch từ năm 2008 đến 2013.
Để đánh giá kết quả thực nghiệm, chúng ta sử dụng phương pháp đánh giá Precision & Recall (độ chính xác và độ phủ). Bảng 4.1 thống kê kết quả dự đoán so với thực tế.
Bảng 4.1: Ma trận thống kê dự đoán các tín hiệu mua vào, bán ra và giữ lại
Dự báo s h b Th ự c t ế s ns,s ns,h ns,b Ns,. h nh,s nh,h nh,b Nh,. b nb,s nb,h nb,b Nb,. N.,s N.,h N.,b N
Trong đó s là tín hiệu bán ra (sell), h là tín hiệu giữ lại (hold), b là tín hiệu
mua vào (buy).
Precision được tính theo công thức:
= , ,
., ., (4.4)
Recall được tính theo công thức:
= , ,
,. ,. (4.5)
Precision và recall của s (sell – bán ra) lần lượt được tính theo công thức:
( ) = ,
., (4.6)
( ) = ,
,. (4.7)
Precision và recall của b (buy – mua vào) lần lượt được tính theo công thức:
( ) = ,
( ) = ,
,. (4.9)
Đánh giá Precision & Recall có thể được kết hợp với nhau thành F- measure (do Rijsbergen đề xuất năm 1979 [19]) như sau:
− =( ∗ )∗ ∗ (4.10)
Trong đó 0 ≤ ≤ 1.
Trong nghiên cứu này, chúng tôi đã xây dựng hàm sigs.PRF() để đánh giá Precision & Recall và F-measure (với = 1). Bảng 4.2 và Bảng 4.3 dưới đây thể hiện kết quả thực nghiệm khi dự đoán bằng mạng nơron và máy véctơ hỗ trợ (từ năm 1/2008 đến 4/2013).
Bảng 4.2: Kết quả dự đoán bằng mô hình ANN
precision recall F-measure s 0.5071770 0.3539232 0.4169125
b 0.5355805 0.4068279 0.4624091
s+b 0.5231092 0.3824885 0.4418811
Bảng 4.3: Kết quả dự đoán bằng mô hình SVM
precision recall F-measure s 0.5487805 0.1502504 0.2359109
b 0.5570265 0.7780939 0.6492582
s+b 0.5558464 0.4892473 0.5204248
Khi áp dụng mạng nơron ta thấy kết quả Precision tương đối tốt, nhưng Recall lại chưa cao nên F-measure chưa cao. Khi áp dụng mạng véctơ hỗ trợ kết quả Precision & Recall và F-measure khả quan hơn rất nhiều. Qua đó nhận thấy, với bài toán dự đoán bằng phương pháp này thì áp dụng SVM cho kết quả tốt hơn khi áp dụng ANN.
Tuy nhiên, kết quả dự đoán trên chỉ mang tính chất hỗ trợ cho các chuyên gia phân tích chứng khoán, chuyên gia về thị trường và tài chính tham khảo để đưa ra
quyết định tốt hơn. Chưa thể áp dụng nguyên kết quả đó để quyết định giao dịch mua/bán ngay, vì giá chứng khoán còn phụ thuộc vào nhiều yếu tố khác (như trong phân tích cơ bản đã chỉ ra). Nghiên cứu này, chúng tôi chưa đề cập tới ảnh hưởng của kinh tế vĩ mô nói chung, của thực trạng công ty nói riêng, cũng như các tác động của chính trị xã hội vào chứng khoán. Trong thời gian tới, chúng tôi tiếp tục phân tích đánh giá theo hướng nghiên cứu xu thế dựa trên mạng xã hỗi (blog, facebook, twitter…) để có dự báo chính xác hơn.
KẾT LUẬN
Luận văn cung cấp một số nội dung về khai phá dữ liệu và học máy, đã đạt được một số kết quả như sau:
- Giới thiệu khái quát về dự báo và bài toán dự đoán chứng khoán; trong đó chú ý tới phương pháp phân tích kỹ thuật trong dự đoán chứng khoán. - Nghiên cứu các kỹ thuật khai phá dữ liệu và các kỹ thuật học máy; luận
văn đã ứng dụng 2 phương pháp học máy tiên tiến là mạng nơron nhân tạo và máy hỗ trợ véctơ cho lớp bài toán dự đoán chứng khoán.
- Nghiên cứu, ứng dụng ngôn ngữ R để xây dựng phần mềm thử nghiệm dự đoán chứng khoán theo 2 kỹ thuật học máy ở trên. Kết quả có độ chính xác tương đối cao, tuy nhiên, cũng chưa thể lấy kết quả đó để ra quyết định mua/bán chứng khoán ngay. Trên thực tế, giá chứng khoán còn phục thuộc vào nhiều yếu tố kinh tế, chính trị và lịch sử khác. Kết quả này sẽ là một tham khảo quan trọng cho các nhà phân tích thị trường, phân tích chứng khoán, các nhà đầu tư có thêm cơ sở khoa học để ra quyết sách trong đầu tư phù hợp.
- Nghiên cứu này đã mở ra một hướng đi mới trong phân tích chứng khoán trên ngôn ngữ R.
Trong thời gian tới, chúng tôi tiếp tục cải thiện hàm dự đoán và kết hợp với khai phá dữ liệu trên mạng xã hội để có kết quả tốt hơn. Đặc biệt, chúng tôi định hướng nghiên cứu cho chứng khoán Việt Nam để áp dụng được trong nước và mang lại những ý nghĩa thiết thực hơn nữa.
DANH MỤC CÔNG TRÌNH KHOA HỌC CỦA TÁC GIẢ LIÊN QUAN ĐẾN LUẬN VĂN
[1] Báo cáo khoa học “Sử dụng ngôn ngữ R trong bài toán phân tích chứng khoán” tại Hội thảo quốc gia “Những tiến bộ của kỹ thuật Máy tính, Điện – Điện tử, Công
nghệ thông tin trong khoa học và cuộc sống (ACEIT 2012)” của nhóm tác giả
Phạm Quốc Hùng, Phạm Ngọc Hưng, Nguyễn Thị Thanh Vân; đăng trên tạp chí
Nghiên cứu Khoa học & Công nghệ Quân sự (ISSN 1859-1043), số đặc san 11-
TÀI LIỆU THAM KHẢO
[1] J. J. Murphy (1999), Technical Analysis of the Financial Markets: A Comprehensive Guide to Trading Methods and Applications, New York
Institute of Finance.
[2] J. D. Hamilton (1994), Time Series Analysis, Princeton University Press. [3] D. Ruppert (2010), Statistics and Data Analysis for Financial Engineering,
Springer.
[4] J. W. Wilder (1978), New Concepts in Technical Trading Systems, Trend
Research.
[5] L. Stevens (2002), Essential Technical Analysis: Tools and Techniques to Spot
Market Trends, Wiley.
[6] J. A. Bollinger (2001), Bollinger on Bollinger Bands, McGraw-Hill. [7] FM. lab (2013), http://www.fmlabs.com/reference.
[8] Stockcharts.com (2013), http://stockcharts.com.
[9] T. Mitchel (1999), Machine Learning and Data Mining, Communications of
the ACM, vol. 42.
[10] U. M. Fayyad, G. Piatetsky-Shapiro, P. Smyth, R. Uthurusamy (1996),
Advances in Knowledge Discovery and Data Mining, AAAI Press, Menlo Park,
CA.
[11] Kenneth Collier, Bernard Carey, Ellen Grusy, Curt Marjaniemi, Donald Sautter (1998), A Perspective on Data Mining, Technical Reporrt, Northern Arizona University.
[12] Vladimir Vapnik, Corinna Cortes (1995), Support-vector networks, Machine Learning, vol. 20, no. 3.
[13] W. N. Venables, D. M. Smith, R Core Team (2013), An Introduction to R, ISBN 3-900051-12-7.
[15] Kdnuggets (8/2012), http://www.kdnuggets.com/polls/2012/analytics-data- mining-programming-languages.html.
[16] S. Nison (2001), Japanese Candlestick Charting Techniques (Second Edition), Prentice Hall Press.
[17] Y. Zhao (2012), R and Data Mining: Examples and Case Studies, Elsevier Inc. [18] L. Torgo (2011), Data Mining with R, CRC press.