là một package nằm trong hệ sinh thái tidyverse. tidyquant tích hợp được các hàm phân tích định lượng của các package phổ biến trong finance như quantmod, xts, TTR. tidyquant hỗ trợ người dùng lấy dữ liệu chứng khoán, báo cáo tài chính một cách dễ dàng từ các API public trên internet và đồng thời có những tiện ích phân tích và visualization dữ liệu tài chính. Do nằm trong hệ sinh thái tidyverse nên cách sử dụng tidyquant sẽ tận dụng được những đặc tính của các pagekage trong hệ sinh thái này như dplyr, tidyverse,….
tidyquant không làm việc với các xts object như các package QFA thông thường khác (QFA: quantitative financial analystic là các package chuyên phân tích tài chính) mà làm việc với tibble object theo đúng đặc trưng của hệ sinh thái tidyverse.
Một số hàm thông dụng trong tidyquant:
tq_get(): lấy dữ liệu về giá chứng khoán và các chuỗi tài chính khác dưới dạng tibble object.
tq_transform(): sử dụng các hàm trong quantmod, xts để thay đổi chu kì của chuỗi. Chẳng hạn như từ chuỗi daily sang weekly, monthly,…
tq_mutate(): kế thừa các hàm từ TTR tính toán moving averages, MACD’s,Bollinger Bands, …
chấp nhận các hàm mutate, nhân tử pipe (%>%) mà không cần import package tidyverse.
Lấy chuỗi giá chứng khoán
Sử dụng tq_get() lấy chuỗi chứng khoán Apple trong vòng 1 năm gần đây. Argument get = ‘stock.prices’ để nói với phương trình rằng chúng ta muốn lấy dữ liệu chuỗi giá lịch sử của AAPL. From và to để kí hiệu ngày bắt đầu và kết thúc với giá trị được chấp nhận có định dạng ‘YYYY-MM-DD’.
library(tidyquant)
library(lubridate)
from <- today()-years(1)
AAPL <- tq_get('AAPL', get = 'stock.prices', from = from)
AAPL
## # A tibble: 252 x 7
## date open high low close volume adjusted
## <date> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 2017-03-22 140 142 140 141 25860200 139
## 2 2017-03-23 141 142 141 141 20346300 139
## 3 2017-03-24 142 142 140 141 22395600 138
## 4 2017-03-27 139 141 139 141 23575100 139
## 5 2017-03-28 141 144 141 144 33374800 142
## 6 2017-03-29 144 144 143 144 29190000 142
## 7 2017-03-30 144 144 144 144 21207300 142
## 8 2017-03-31 144 144 143 144 19661700 141
## 9 2017-04-03 144 144 143 144 19985700 141
## 10 2017-04-04 143 145 143 145 19891400 143
## # ... with 242 more rows
Sử dụng tq_mutate thêm moving average
Giả sử chúng ta cần phân tích chuỗi moving average trong vòng 15 và 50 ngày để tìm ra xu hướng của chuỗi chứng khoán. Thông thường sẽ sử dụng hàm SMA() từ package TTR. Để sử dụng hàm số này trong hệ sinh thái tidyverse thì sẽ có một chút khác biệt như sau:
dplyr:mutate(): Chỉ tạo ra được 1 cột đơn. Với hàm SMA() hàm mutate sẽ hoạt động tuy nhiên sẽ gặp lỗi khi sử dụng các hàm BBands() và MACD vì các hàm này tạo ra nhiều hơn 1 cột.
tidyquant::tq_mutate(): Không giới hạn số lượng cột được thêm vào dataset. Các cột được sử dụng làm input cho các biến đổi dữ liệu phải nằm trong list các trường của tq_get() bao gồm open, close, high, low, volume, adjust. Số lượng dòng trả về phải khớp với số lượng dòng với bảng gốc nếu không sẽ không thế join bảng được sau cột mới được tạo.
tidyquant::tq_mutate_xy(): Tương tự như tq_mute() nhưng hoạt động khi sử dụng 2 trường đầu vào trở lên. Các đầu vào này phải từ các trường của tq_get().
tidyquant::tq_transmute(): Hoàn toàn tương tự như tq_mutate() nhưng chỉ trả về các cột mới được tạo thành không bao gồm dataset ban đầu. Được sử dụng đặc biệt nhiều trong các trường hợp chu kì thay đổi chẳng hạn day -> week hoặc day -> month.
tidyquant::tq_transmute_xy(): Hoàn toàn tương tự như tq_transmute() nhưng chỉ trả về các cột mới được tạo thành không bao gồm dataset ban đầu.
Sử dụng hàm tq_mutate()
tq_mutate có 2 arguments chủ yếu là: select và mutate_fun:
select: một hàm tương tự như dplyr::select() khi nó xác định sẵn các trường lựa chọn ứng với open, hight, low, close, volume, adjusted
mutate_fun: Có thể là bất kì hàm số nào trong quantmod,xts,TTR được list trong danh sách tq_mutate_fun_options().
tq_mutate_fun_options() %>%
str()
## List of 5
## $ zoo : chr [1:14] "rollapply" "rollapplyr" "rollmax" "rollmax.default" ...
## $ xts : chr [1:27] "apply.daily" "apply.monthly" "apply.quarterly" "apply.weekly" ...
## $ quantmod : chr [1:25] "allReturns" "annualReturn" "ClCl" "dailyReturn" ...
## $ TTR : chr [1:62] "adjRatios" "ADX" "ALMA" "aroon" ...
## $ PerformanceAnalytics: chr [1:7] "Return.annualized" "Return.annualized.excess" "Return.clean" "Return.cumulative" ...
Ví dụ chúng ta sẽ sử dụng hàm SMA() trong package TTR để tính toán moving average cho giá đóng cửa với chu kì là n = 15 ngày
AAPL %>% tq_mutate(select = close, mutate_fun = SMA, n = 15)
## # A tibble: 252 x 8
## date open high low close volume adjusted SMA
## <date> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 2017-03-22 140 142 140 141 25860200 139 NA
## 2 2017-03-23 141 142 141 141 20346300 139 NA
## 3 2017-03-24 142 142 140 141 22395600 138 NA
## 4 2017-03-27 139 141 139 141 23575100 139 NA
## 5 2017-03-28 141 144 141 144 33374800 142 NA
## 6 2017-03-29 144 144 143 144 29190000 142 NA
## 7 2017-03-30 144 144 144 144 21207300 142 NA
## 8 2017-03-31 144 144 143 144 19661700 141 NA
## 9 2017-04-03 144 144 143 144 19985700 141 NA
## 10 2017-04-04 143 145 143 145 19891400 143 NA
## # ... with 242 more rows
Nếu cần cả 2 giá trị moving average của 15 và 50 ngày thì chúng ta có thể sử dụng tq_mutate() 2 lần
AAPL %>% tq_mutate( select = close,mutate_fun = SMA, n = 15) %>%
rename(SMA.15 = SMA) %>%
tq_mutate(select = close, mutate_fun = SMA, n = 50 ) %>%
rename(SMA.50 =SMA)
## # A tibble: 252 x 9
## date open high low close volume adjusted SMA.15 SMA.50
## <date> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 2017-03-22 140 142 140 141 25860200 139 NA NA
## 2 2017-03-23 141 142 141 141 20346300 139 NA NA
## 3 2017-03-24 142 142 140 141 22395600 138 NA NA
## 4 2017-03-27 139 141 139 141 23575100 139 NA NA
## 5 2017-03-28 141 144 141 144 33374800 142 NA NA
## 6 2017-03-29 144 144 143 144 29190000 142 NA NA
## 7 2017-03-30 144 144 144 144 21207300 142 NA NA
## 8 2017-03-31 144 144 143 144 19661700 141 NA NA
## 9 2017-04-03 144 144 143 144 19985700 141 NA NA
## 10 2017-04-04 143 145 143 145 19891400 143 NA NA
## # ... with 242 more rows
Nếu chúng ta muốn lấy giá điều chỉnh chỉ cần thay thế select = adjust.
Sử dụng hàm tq_mutate_xy()
tq_mutate_xy() có 3 arguments chủ yếu là: x,y và mutate_fun. Trong đó x là tham số thứ nhất (bắt buộc), y là tham số thứ 2 (có thể null trong trường hợp chỉ có 1 input cho mutate_fun). mutate_fun là hàm số sử dụng để tính toán. Chúng ta cũng có thể sử dụng hàm tq_mutate_xy() để tính SMA khi chỉ truyền tham số cho x mà không truyền tham số cho y .
AAPL <- AAPL %>% tq_mutate_xy(x=close,mutate_fun = SMA, n = 15) %>%
rename(SMA.15 = SMA) %>%
tq_mutate_xy(x = close, mutate_fun = SMA, n = 50 ) %>%
rename(SMA.50 =SMA)
Để tiện cho việc visualization chúng ta phải đưa AAPL về dạng bảng stack. Bảng stack là dạng bảng chồng các chỉ số lên nhau và có một key để xác định loại chỉ số. Chẳng hạn ở bảng gốc chúng ta có 3 chỉ số: close, SMA.15, SMA.50. Bảng này có thể tách thành 3 bảng riêng biệt ứng với 3 chỉ số, mỗi bảng sẽ có date và value (giá trị của close, SMA.15, SMA.50 tùy thuộc vào bảng của chỉ tiêu nào). Chúng ta append 3 bảng này với nhau. Để đánh dấu quan sát là thuộc chỉ số nào ta sẽ tạo ra trường key là một biến phân loại có giá trị là label ứng với các chỉ tiêu. Như vậy bảng stack sẽ gồm 3 trường: Date, key, value. Sử dụng hàm gather() để tạo ra bảng stack trong đó gather() gồm 3 arguments chính: key, value, và một argument đặc biệt trong R kí hiệu là …
AAPL %>%
select(date, close, SMA.15, SMA.50) %>%
gather(key = type, value = price, close:SMA.50)
## # A tibble: 756 x 3
## date type price
## <date> <chr> <dbl>
## 1 2017-03-22 close 141
## 2 2017-03-23 close 141
## 3 2017-03-24 close 141
## 4 2017-03-27 close 141
## 5 2017-03-28 close 144
## 6 2017-03-29 close 144
## 7 2017-03-30 close 144
## 8 2017-03-31 close 144
## 9 2017-04-03 close 144
## 10 2017-04-04 close 145
## # ... with 746 more rows
Sử dụng ggplot2 để visualization
library(ggplot2)
my_palette <- c('black','red','blue')
AAPL %>% select(date, close, SMA.15, SMA.50) %>%
gather(key = type, value = price, close:SMA.50) %>%
ggplot(aes(x=date ,y=price, col = type)) +
geom_line() +
scale_colour_manual(values = my_palette) +
theme(legend.position = 'bottom') +
ggtitle('Simple Moving Averages') +
xlab('')+
ylab('Stock Price')
Căn cứ vào đồ thị này ta có thể xác định được đâu là đỉnh ngắn hạn và đâu là điểm support dựa vào vị trí giao nhau giữa đường SMA.15 và SMA.50 và khoảng cách giữa các đường SMA.15 và SMA.50 là lớn nhất tại cùng 1 thời điểm.