I. GIỚI THIỆU TIDYQUANT

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:

chấp nhận các hàm mutate, nhân tử pipe (%>%) mà không cần import package tidyverse.

II. DEMO SỬ DỤNG TIDYQUANT

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:

Sử dụng hàm tq_mutate()

tq_mutate có 2 arguments chủ yếu là: select và mutate_fun:

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)

II. VISUALIZATION CHUỖI 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.