1 CHƯƠNG 1: MỞ ĐẦU

1.1 Lý do chọn đề tài.

Trong bối cảnh công nghệ hiện đại 4.0 trên thế giới, việc có quá nhiều dữ liệu chúng ta cần phải sàng lọc, thống kê và phân tích thì ngôn ngữ lập trình là một trong những công cụ quan trọng và dễ khai thác nhất để sắp xếp dữ liệu. Thông thường, hướng phân tích dữ liệu thuận tiện và nhanh gọn mà mọi người tới là các ứng dụng phân tích dữ liệu trong thực tiễn như Excel, BI Tools, FineReport, R và Python, v.v.

Vì thế, nhóm chúng tôi chọn package “Tidyquant” trong phần mềm Rstudio để tìm hiểu rõ hơn các công dụng khi sử dụng chúng. Có nhiều lý do để chúng tôi chọn tìm hiểu package tidyquant trong RStudio. Tidyquant là một gói phần mềm mở rộng cho RStudio, được thiết kế đặc biệt để làm việc với dữ liệu tài chính. Nó cung cấp các công cụ và chức năng mạnh mẽ để phân tích và xử lý các dữ liệu tài chính phức tạp. Tidyquant tích hợp các chức năng của dplyr và ggplot2, hai gói phổ biến trong ngôn ngữ lập trình R. Điều này cho phép chúng tôi sử dụng các công cụ quen thuộc để thao tác và trực quan hóa dữ liệu tài chính một cách dễ dàng và linh hoạt. Tidyquant cung cấp các chức năng mạnh mẽ để truy vấn và tải dữ liệu tài chính từ các nguồn phổ biến như Google Finance, Financial Times, v.v. Ngoài ra, Tidyquant cung cấp các chức năng để thực hiện các phân tích tài chính phổ biến như phân tích biến động giá, phân tích hồi quy tuyến tính, và phân tích chuỗi thời gian hỗ trợ cho chúng tôi trong những môn học khác.

1.2 Mục tiêu nghiên cứu đề tài.

Mục tiêu của việc tìm hiểu tidyquant trong RStudio là để khám phá và nắm vững các khả năng và tính năng của gói dữ liệu tài chính này. Dưới đây là một số mục tiêu cụ thể bạn có thể theo đuổi khi tìm hiểu tidyquant trong RStudio:

Hiểu về cú pháp và cách sử dụng: Đầu tiên, chúng tôi cần tìm hiểu về cú pháp và cách sử dụng các hàm và công cụ trong tidyquant. Điều này bao gồm cách truy xuất dữ liệu tài chính từ các nguồn như Yahoo Finance, Quandl, hoặc Bitcoin, và cách xử lý và trực quan hóa dữ liệu tài chính.

Thực hiện các phân tích cơ bản: Tiếp theo, chúng tôi có thể tìm hiểu cách sử dụng tidyquant để thực hiện các phân tích cơ bản trên dữ liệu tài chính. Điều này có thể bao gồm tính toán chỉ số, tích hợp chuỗi thời gian, phân tích biến động giá cả và xây dựng mô hình.

Tùy chỉnh và mở rộng tính năng: Chúng tôi có thể tìm hiểu cách tùy chỉnh và mở rộng tính năng của tidyquant để đáp ứng nhu cầu phân tích cụ thể của mình. Điều này bao gồm việc tùy chỉnh các hàm và công cụ có sẵn, tạo ra các hàm mới dựa trên tidyquant hoặc kết hợp tidyquant với các gói phần mềm khác trong R để mở rộng khả năng phân tích.

Tạo tài liệu và báo cáo: Cuối cùng, chúng tôi có thể tìm hiểu cách sử dụng tidyquant trong RStudio để tạo tài liệu và báo cáo chất lượng cao. Chúng tôi có thể tận dụng tích hợp giữa tidyquant và RMarkdown để tạo ra tài liệu phân tích tài chính đẹp mắt và dễ đọc.

Mục tiêu cuối cùng của việc tìm hiểu tidyquant trong RStudio là trở thành một người sử dụng thành thạo của gói dữ liệu tài chính này, có khả năng áp dụng tidyquant vào công việc phân tích dữ liệu tài chính của mình một cách hiệu quả.

1.3 Đối tượng và phạm vi nghiên cứu.

Đối tượng nghiên cứu của tidyquant là các dữ liệu tài chính như giá cổ phiếu, chỉ số tài chính, tỷ giá, và các dữ liệu tài chính khác. Trong đề tài này, chúng tôi sử dụng dữ liệu cổ phiếu theo chuỗi thời gian cùa công ty Apple với mã cổ phiếu được niêm yết trên thị trường chứng khoán là AAPL

Phạm vi nghiên cứu của tidyquant: Dữ liệu được thu thập trực tiếp và theo thời gian thực thông qua nguồn của trang Yahoo Finance (https://finance.yahoo.com/). Đây là nguồn lấy dữ liệu chứng khoán và các thông tin khác về kinh tế khá uy tín, được cập nhật thường xuyên theo thời gian thực đối với tất cả các mã cổ phiếu đã được niêm yết.

1.4 Phương pháp nghiên cứu.

Tidyquant là một gói phần mềm trong ngôn ngữ lập trình R được sử dụng cho phân tích tài chính và nghiên cứu trên dữ liệu tài chính. Phương pháp nghiên cứu sử dụng tidyquant bao gồm các bước sau:

Chuẩn bị dữ liệu: Sử dụng các hàm trong tidyquant để tải và chuẩn bị dữ liệu tài chính cần thiết cho nghiên cứu. Các dữ liệu này có thể bao gồm giá cổ phiếu, chỉ số tài chính, thông tin về doanh nghiệp, v.v.

Trực quan hóa dữ liệu: Sử dụng các hàm trong tidyquant để tạo các biểu đồ và đồ thị để trực quan hóa dữ liệu tài chính. Các biểu đồ này có thể bao gồm biểu đồ thời gian, biểu đồ tương quan, biểu đồ phân phối, v.v.

Phân tích dữ liệu: Sử dụng các hàm trong tidyquant để thực hiện các phân tích dữ liệu tài chính như tính toán chỉ số tài chính, tính toán tỷ lệ sinh lợi, v.v.

2 CHƯƠNG 2: TỔNG QUAN VỀ TIDYQUANT

2.1 Giới thiệu tidyquant package

2.1.1 Khái niệm

Package “TIDYQUANT” - Phân tích tài chính định lượng gọn gàng.

Tidyquant là một gói (package) của ngôn ngữ lập trình R được sử dụng để làm việc với dữ liệu tài chính. Nó cung cấp một tập hợp các công cụ và chức năng để thu thập, xử lý, phân tích và trực quan hóa dữ liệu tài chính.

Khái niệm chính của tidyquant là sự kết hợp giữa các ưu điểm của gói dplyr và quantmod. Tidyquant cho phép người dùng thực hiện các hoạt động như truy vấn, lọc, biến đổi và tổng hợp dữ liệu tài chính một cách dễ dàng và hiệu quả, bằng cách sử dụng cú pháp dplyr đơn giản và dễ hiểu.Tidyquant cũng cung cấp các chức năng để thu thập dữ liệu tài chính từ các nguồn khác nhau, như Yahoo Finance, Quandl và Alpha Vantage.

Một trong những ưu điểm lớn của tidyquant là khả năng tích hợp với gói ggplot2 để tạo ra biểu đồ và biểu đồ đẹp mắt để trực quan hóa dữ liệu tài chính.

2.1.2 Lợi ích khi sử dụng tidyquant

Tidyquant là một gói phần mềm trong ngôn ngữ lập trình R, được thiết kế để tăng cường khả năng phân tích dữ liệu tài chính. Khi sử dụng tidyquant trong RMarkdown, chúng ta có thể tận dụng được nhiều lợi ích sau:

Tin cậy và linh hoạt: Tidyquant cho phép chúng ta truy cập vào nhiều dữ liệu tài chính từ các nguồn khác nhau như Yahoo Finance, Quandl hay tiền điện tử Bitcoin. Điều này mang lại sự linh hoạt khi phân tích dữ liệu tài chính và giúp bạn đáp ứng nhanh chóng với yêu cầu của khách hàng hoặc công việc phân tích.

Dễ sử dụng: Với tidyquant, chúng ta có thể truy xuất, xử lý và trực quan hóa dữ liệu tài chính một cách dễ dàng và hiệu quả. Cú pháp rõ ràng và giao diện trực quan của tidyquant giúp bạn nắm bắt nhanh chóng quy trình phân tích dữ liệu tài chính mà không cần mất nhiều thời gian để tìm hiểu.

Cung cấp tích hợp dữ liệu: Tidyquant cung cấp khả năng tích hợp dữ liệu tài chính từ nhiều nguồn khác nhau vào quy trình phân tích. Chúng ta có thể tổng hợp, lọc và xử lý các dữ liệu tài chính một cách thuận tiện, giúp cho việc phân tích và so sánh dữ liệu trở nên dễ dàng hơn.

Hỗ trợ công cụ phân tích: Tidyquant không chỉ cung cấp khả năng truy cập dữ liệu tài chính, mà còn tích hợp sẵn nhiều công cụ phân tích dữ liệu như xử lý chuỗi thời gian (time series), phân tích định lượng (quantitative analysis) và xây dựng mô hình (modeling). Điều này giúp chúng ta tiết kiệm thời gian và công sức khi thực hiện các phân tích phức tạp.

Trình bày linh hoạt: Khi sử dụng tidyquant trong RMarkdown, chúng ta có thể tạo ra báo cáo hoặc tài liệu phân tích tài chính với định dạng linh hoạt. RMarkdown cho phép chúng ta kết hợp mã R với văn bản và công cụ định dạng để tạo ra tài liệu đẹp mắt và dễ đọc. Qua đó, ta có thể trình bày kết quả phân tích của mình một cách chi tiết và rõ ràng.

Tóm lại, việc sử dụng tidyquant trong RMarkdown mang lại nhiều lợi ích, từ khả năng truy xuất và xử lý dữ liệu tài chính một cách thuận tiện đến tích hợp công cụ phân tích và trình bày linh hoạt. Điều này giúp chúng ta nhanh chóng thực hiện các phân tích dữ liệu tài chính và tạo ra tài liệu chất lượng cao để chia sẻ với người khác.

2.2 Các hàm thông dụng trong tidyquant

Trong tidyquant, có nhiều hàm hữu ích để làm việc với dữ liệu tài chính. Dưới đây là tóm tắt của một số hàm quan trọng:

  1. tq_get(): Lấy dữ liệu tài chính từ các nguồn khác nhau như Yahoo Finance, Alpha Vantage, Quantmod, vv.

  2. tq_transmute(): Biến đổi dữ liệu tài chính theo cách tùy chỉnh, bao gồm tính toán chỉ số kỹ thuật, lọc dữ liệu vv.

  3. tq_mutate(): Thêm cột mới vào dữ liệu tài chính dựa trên các biến có sẵn.

  4. tq_portfolio(): Tạo, quản lý và tính toán các chỉ số cho danh mục đầu tư.

  5. tq_strategy(): Xây dựng và kiểm tra các chiến lược giao dịch dựa trên dữ liệu tài chính.

  6. tq_performance(): Tính toán hiệu suất của danh mục đầu tư hoặc chiến lược giao dịch.

  7. tq_chart(): Tạo biểu đồ tài chính tương tác cho việc phân tích dữ liệu.

  8. tq_save(): Lưu dữ liệu tài chính vào tệp tin CSV hoặc RData.

Tidyquant chấp nhận các hàm mutate, nhân tử pipe (%>%) mà không cần import package tidyverse. Bên cạnh đó các hàm core functions trong hệ sinh thái tidyverse được sử dụng dễ dàng trong phân tích tài chính trong đó tiêu biểu với 2 hàm sau:

  • tq_transmute(): Trả về một tidy data frame mới từ đầu vào là data frame ban đầu mà không làm thay đổi data frame gốc, sử dụng đặc biệt nhiều khi thay đổi chu kì của chuổi.

  • tq_mutate(): Thêm vào tidy data frame gốc một trường mới được tạo thành từ từ các trường sẵn có trong tidy data frame đó.

Trong đó ta quan tâm đến 2 arguments chính gồm: select là trường dữ liệu input cho biến đổi. mutate_fun là các hàm được kế thừa từ QFA để thực hiện các biến đổi dữ liệu tài chính theo tư tưởng của QFA.

3 CHƯƠNG 3 : TÍCH HỢP TIDYQUANT VỚI MÃ CỔ PHIẾU APPLE

3.1 Giới thiệu về mã cổ phiếu Apple

Mã cổ phiếu của công ty Apple có thể nhận được thông qua Internet hoặc qua nguồn Yahoo Finance. Để thu thập dữ liệu về biến động cổ phiếu của công ty Apple chúng ta tiến hành thực hiện các lệnh trong R như sau:

install.packages(“quantmod”)- Cài đặt thư viện quantmock

library(quantmod)- Tải thư viện quantmod vào môi trường R và gọi tên nó ra (gọi mã cổ phiếu “AAPL” từ thư viện này)

Đồng thời cũng cài đặt và gọi tên các thư viện liên quan

library(quantmod)
library(tidyquant)
library(dplyr)
library(ggplot2)

3.2 Các hàm lấy giá

3.2.1 Cú pháp

tq_get(x, get = "stock.prices", complete_cases = TRUE, ...)
tq_get_options()

3.2.2 Giải thích các argument

AAPL <- data.framc(AAPL) - Chuyển đổi thành dữ liệu cấu trúc dataframe

symbol: Định dạng character, là mã chứng khoán cần lấy.

from <- today()-years()/today()-month(): Nội dung này cho phép phân tích giá trị cổ phiếu trong một thời gian nhất định

Lấy giá cổ phiếu công ty Apple

# Lấy giá cổ phiếu 1 năm gần nhất
from <- today()-years(1)
AAPL <- tq_get('AAPL', get = 'stock.prices', from = from)
AAPL
## # A tibble: 251 × 8
##    symbol date        open  high   low close   volume adjusted
##    <chr>  <date>     <dbl> <dbl> <dbl> <dbl>    <dbl>    <dbl>
##  1 AAPL   2022-08-03  161.  167.  161.  166. 82507500     165.
##  2 AAPL   2022-08-04  166.  167.  164.  166. 55474100     165.
##  3 AAPL   2022-08-05  163.  166.  163   165. 56697000     165.
##  4 AAPL   2022-08-08  166.  168.  164.  165. 60276900     164.
##  5 AAPL   2022-08-09  164.  166.  163.  165. 63135500     164.
##  6 AAPL   2022-08-10  168.  169.  167.  169. 70170500     168.
##  7 AAPL   2022-08-11  170.  171.  168.  168. 57149200     168.
##  8 AAPL   2022-08-12  170.  172.  169.  172. 68039400     171.
##  9 AAPL   2022-08-15  172.  173.  171.  173. 54091700     172.
## 10 AAPL   2022-08-16  173.  174.  172.  173. 56377100     172.
## # ℹ 241 more rows
#Lấy giá cổ phiếu 5 tháng gần nhất
from <- today()-month(5)
AAPL <- tq_get('AAPL', get = 'stock.prices', from = from)
AAPL
## # A tibble: 3 × 8
##   symbol date        open  high   low close   volume adjusted
##   <chr>  <date>     <dbl> <dbl> <dbl> <dbl>    <dbl>    <dbl>
## 1 AAPL   2023-07-31  196.  196.  195.  196. 38824100     196.
## 2 AAPL   2023-08-01  196.  197.  195.  196. 35175100     196.
## 3 AAPL   2023-08-02  195.  195.  192.  193. 50241600     193.

Quan sát các biến số của tập dữ liệu cổ phiếu AAPL, dữ liệu này là một tập dữ liệu chuỗi thời gian, gồm 6 biến số mô tả:

  • Open - Giá mở của cua phiên giao dịch.

  • High - Là giá cao nhất trong một phiên phiên giao dịch hoặc trong một chu kỳ theo dõi biến động giá.

  • Low - Là giá thấp nhất trong một phiên phiên giao dịch hoặc trong một chu kỳ theo dõi biến động giá.

  • Close - Giá đóng cửa là giá thực hiện tại lần khớp lệnh cuối cùng trong ngày giao dịch.

  • Volume - Khối lượng giao dịch.

  • Adjusted - Giá đóng cửa hiệu chỉnh

library(tidyquant)
library(tidyverse)
library(lubridate)
library(dplyr)

3.3 Tích hợp với dữ liệu mã cổ phiếu Apple

Bên cạnh các hàm đặc trưng của thị trường chứng khoán Việt Nam, AAPL hướng tới việc kế thừa các hàm phân tích của package tidyquant của hệ sinh thái tidyverse bởi 3 lý do chính:

  • tidyquant đã kế thừa lại hầu hết các hàm trong nhóm package của hệ sinh thái QFA (quantitative financial analytics package) như xts, zoo, quantmod, TTR và PerformanceAnalytics. Do đó thay vì kế thừa nhiều package rời rạc thì việc kế thừa theo tidyquant sẽ cover được nhiều chức năng phân tích hơn.

  • Đặc thù của hệ sinh thái tidyverse là làm việc với các tible object trong khi QFA là xts object và tible object là một định dạng trùng hợp với dữ liệu AAPL đang sử dụng.

  • Bên cạnh kế sử dụng các hàm phân tích của QFA, kế thừa theo tidyquant sẽ tận dụng được một hệ sinh thái rộng lớn của tidyverse bao gồm các phương thức data wrangling của dplyr, visualizatioin của ggplot2 và rất nhiều các package khác đang ngày một phình to của hệ sinh thái này.

library(tidyquant)
# Các hàm của hệ sinh thái QFA được kế thừa trong tidyquant
tq_transmute_fun_options()
## $zoo
##  [1] "rollapply"          "rollapplyr"         "rollmax"           
##  [4] "rollmax.default"    "rollmaxr"           "rollmean"          
##  [7] "rollmean.default"   "rollmeanr"          "rollmedian"        
## [10] "rollmedian.default" "rollmedianr"        "rollsum"           
## [13] "rollsum.default"    "rollsumr"          
## 
## $xts
##  [1] "apply.daily"     "apply.monthly"   "apply.quarterly" "apply.weekly"   
##  [5] "apply.yearly"    "diff.xts"        "lag.xts"         "period.apply"   
##  [9] "period.max"      "period.min"      "period.prod"     "period.sum"     
## [13] "periodicity"     "to.daily"        "to.hourly"       "to.minutes"     
## [17] "to.minutes10"    "to.minutes15"    "to.minutes3"     "to.minutes30"   
## [21] "to.minutes5"     "to.monthly"      "to.period"       "to.quarterly"   
## [25] "to.weekly"       "to.yearly"       "to_period"      
## 
## $quantmod
##  [1] "allReturns"      "annualReturn"    "ClCl"            "dailyReturn"    
##  [5] "Delt"            "HiCl"            "Lag"             "LoCl"           
##  [9] "LoHi"            "monthlyReturn"   "Next"            "OpCl"           
## [13] "OpHi"            "OpLo"            "OpOp"            "periodReturn"   
## [17] "quarterlyReturn" "seriesAccel"     "seriesDecel"     "seriesDecr"     
## [21] "seriesHi"        "seriesIncr"      "seriesLo"        "weeklyReturn"   
## [25] "yearlyReturn"   
## 
## $TTR
##  [1] "adjRatios"          "ADX"                "ALMA"              
##  [4] "aroon"              "ATR"                "BBands"            
##  [7] "CCI"                "chaikinAD"          "chaikinVolatility" 
## [10] "CLV"                "CMF"                "CMO"               
## [13] "CTI"                "DEMA"               "DonchianChannel"   
## [16] "DPO"                "DVI"                "EMA"               
## [19] "EMV"                "EVWMA"              "GMMA"              
## [22] "growth"             "HMA"                "keltnerChannels"   
## [25] "KST"                "lags"               "MACD"              
## [28] "MFI"                "momentum"           "OBV"               
## [31] "PBands"             "ROC"                "rollSFM"           
## [34] "RSI"                "runCor"             "runCov"            
## [37] "runMAD"             "runMax"             "runMean"           
## [40] "runMedian"          "runMin"             "runPercentRank"    
## [43] "runSD"              "runSum"             "runVar"            
## [46] "SAR"                "SMA"                "SMI"               
## [49] "SNR"                "stoch"              "TDI"               
## [52] "TRIX"               "ultimateOscillator" "VHF"               
## [55] "VMA"                "volatility"         "VWAP"              
## [58] "VWMA"               "wilderSum"          "williamsAD"        
## [61] "WMA"                "WPR"                "ZigZag"            
## [64] "ZLEMA"             
## 
## $PerformanceAnalytics
## [1] "Return.annualized"        "Return.annualized.excess"
## [3] "Return.clean"             "Return.cumulative"       
## [5] "Return.excess"            "Return.Geltner"          
## [7] "zerofill"

Các hàm chính của tidyquant gồm tq_mutate() và tq_transmute(). Tư tưởng của các hàm này giống với hàm mutate() và transmute() của dplyr . Trong đó:

tq_mutate: Tạo trường mới vào bảng sẵn có theo công thức được ta tự định nghĩa.

tq_transmute: Tạo thêm trường mới vào bảng sẵn có theo công thức được ta tự định nghĩa và drop các trường cũ trong bảng.

3.3.1 Cú pháp

tq_mutate(data, select = NULL, mutate_fun, col_rename = NULL, ...)

tq_mutate_(data, select = NULL, mutate_fun, col_rename = NULL, ...)

tq_mutate_xy(data, x, y = NULL, mutate_fun, col_rename = NULL, ...)

tq_mutate_xy_(data, x, y = NULL, mutate_fun, col_rename = NULL, ...)

tq_transmute(data, select = NULL, mutate_fun, col_rename = NULL, ...)

tq_transmute_(data, select = NULL, mutate_fun, col_rename = NULL, ...)

tq_transmute_xy(data, x, y = NULL, mutate_fun, col_rename = NULL, ...)

tq_transmute_xy_(data, x, y = NULL, mutate_fun, col_rename = NULL, ...)

các hàm có đuôi là _xy sẽ là những hàm có 2 input. Khi đó tham số input cho mutate_fun phải là x,y chứ không phải là select.

3.3.2 Giải thích argument

data: Một tibble object, chủ yếu được lấy từ hàm tq_get() (dữ liệu AAPL đã đồng bộ format theo tidyquant hàm này tq_get()).

select: Một hàm tương tự như dplyr::select(). Lựa chọn các chỉ số làm input cho mutate_fun. select có thể là tên trường khi có 1 trường hoặc vector vị trí các trường khi có nhiều trường. Chẳng hạn select = c(2:5) thức là sẽ lựa chọn các trường vị trí 2:5 trong dataframe làm input cho mutate_fun.

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().

col_rename: Tên của columns mới được tạo thành từ tq_mutate hoặc tq_transmute.

x,y: Tham số được sử dụng với các hàm có đuôi _xy. Đây là các input của các hàm mutate_fun trong các hàm có 2 biến. Chẳng hạn như EVWMA là chuỗi trung bình trượt của giá theo trọng số volume.

…: Các tham số khác được truyền thêm vào hàm.

3.3.3 Ví dụ về tích hợp AAPL và tidyquant

3.3.3.1 Các hàm trong TTR

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.

Kiểm tra danh sách các hàm của TTR được support trong tidyquant đã bao gồm SMA:

tq_mutate_fun_options()$TTR
##  [1] "adjRatios"          "ADX"                "ALMA"              
##  [4] "aroon"              "ATR"                "BBands"            
##  [7] "CCI"                "chaikinAD"          "chaikinVolatility" 
## [10] "CLV"                "CMF"                "CMO"               
## [13] "CTI"                "DEMA"               "DonchianChannel"   
## [16] "DPO"                "DVI"                "EMA"               
## [19] "EMV"                "EVWMA"              "GMMA"              
## [22] "growth"             "HMA"                "keltnerChannels"   
## [25] "KST"                "lags"               "MACD"              
## [28] "MFI"                "momentum"           "OBV"               
## [31] "PBands"             "ROC"                "rollSFM"           
## [34] "RSI"                "runCor"             "runCov"            
## [37] "runMAD"             "runMax"             "runMean"           
## [40] "runMedian"          "runMin"             "runPercentRank"    
## [43] "runSD"              "runSum"             "runVar"            
## [46] "SAR"                "SMA"                "SMI"               
## [49] "SNR"                "stoch"              "TDI"               
## [52] "TRIX"               "ultimateOscillator" "VHF"               
## [55] "VMA"                "volatility"         "VWAP"              
## [58] "VWMA"               "wilderSum"          "williamsAD"        
## [61] "WMA"                "WPR"                "ZigZag"            
## [64] "ZLEMA"

Chúng ta thấy đã bao gồm SMA ở vị trí thứ 47.

Tính chỉ số SMA cho chuỗi close và chuỗi adjusted

sử dụng hàm SMA() truyền vào mutate_fun để tính toán moving average cho giá đóng cửa với chu kì là n = 15 ngày và n = 50 ngày. Chúng ta sẽ cần truyền trường cần tính SMA vào select và hàm số cần tính vào SMA. Một điểm đặc biệt là chúng ta sử dụng nhân từ pipe nhưng không cần import dplyr bởi tidyquant gọi sẵn nhân tử này.

# Chu kì 15 ngày
AAPL %>% tq_mutate(select = close, 
                  mutate_fun  = SMA, 
                  n = day(15))
## # A tibble: 3 × 9
##   symbol date        open  high   low close   volume adjusted   SMA
##   <chr>  <date>     <dbl> <dbl> <dbl> <dbl>    <dbl>    <dbl> <dbl>
## 1 AAPL   2023-07-31  196.  196.  195.  196. 38824100     196.  196.
## 2 AAPL   2023-08-01  196.  197.  195.  196. 35175100     196.  196.
## 3 AAPL   2023-08-02  195.  195.  192.  193. 50241600     193.  193.

Khi chúng ta muốn moving average cho chuỗi giá điều chỉnh thì chỉ cần đưa vào argument select

AAPL %>% tq_mutate(select = adjusted, 
                  mutate_fun = SMA, 
                  n = day(50) ) 
## # A tibble: 3 × 9
##   symbol date        open  high   low close   volume adjusted   SMA
##   <chr>  <date>     <dbl> <dbl> <dbl> <dbl>    <dbl>    <dbl> <dbl>
## 1 AAPL   2023-07-31  196.  196.  195.  196. 38824100     196.  196.
## 2 AAPL   2023-08-01  196.  197.  195.  196. 35175100     196.  196.
## 3 AAPL   2023-08-02  195.  195.  192.  193. 50241600     193.  193.

Tính trung bình trượt có trọng EVWMA theo khối lượng của giá

AAPL %>% tq_mutate_xy(x=adjusted,y=volume, 
                  mutate_fun = EVWMA , 
                  n = day(50), col_rename = 'EVWMA')
## # A tibble: 3 × 9
##   symbol date        open  high   low close   volume adjusted EVWMA
##   <chr>  <date>     <dbl> <dbl> <dbl> <dbl>    <dbl>    <dbl> <dbl>
## 1 AAPL   2023-07-31  196.  196.  195.  196. 38824100     196.  196.
## 2 AAPL   2023-08-01  196.  197.  195.  196. 35175100     196.  196.
## 3 AAPL   2023-08-02  195.  195.  192.  193. 50241600     193.  193.

Tính volatility cho 260 phiên, sử dụng phương pháp close

AAPL %>% tq_mutate(select = close,
                  mutate_fun = volatility, 
                  n = 3, calc = "close", N = 260,
                  col_rename = "Volatility")
## # A tibble: 3 × 9
##   symbol date        open  high   low close   volume adjusted Volatility
##   <chr>  <date>     <dbl> <dbl> <dbl> <dbl>    <dbl>    <dbl>      <dbl>
## 1 AAPL   2023-07-31  196.  196.  195.  196. 38824100     196.     NA    
## 2 AAPL   2023-08-01  196.  197.  195.  196. 35175100     196.     NA    
## 3 AAPL   2023-08-02  195.  195.  192.  193. 50241600     193.      0.129

Tính Bollinger bands của chuỗi close

AAPL %>% tq_mutate(select = close,
                  n = day(20),
                  mutate_fun = BBands)
## # A tibble: 3 × 12
##   symbol date        open  high   low close   volume adjusted    dn  mavg    up
##   <chr>  <date>     <dbl> <dbl> <dbl> <dbl>    <dbl>    <dbl> <dbl> <dbl> <dbl>
## 1 AAPL   2023-07-31  196.  196.  195.  196. 38824100     196.  196.  196.  196.
## 2 AAPL   2023-08-01  196.  197.  195.  196. 35175100     196.  196.  196.  196.
## 3 AAPL   2023-08-02  195.  195.  192.  193. 50241600     193.  193.  193.  193.
## # ℹ 1 more variable: pctB <dbl>

3.3.3.2 Các hàm trong xts

# Danh sách các hàm thuộc xts sử dụng trong tidyquant
tq_transmute_fun_options()$xts
##  [1] "apply.daily"     "apply.monthly"   "apply.quarterly" "apply.weekly"   
##  [5] "apply.yearly"    "diff.xts"        "lag.xts"         "period.apply"   
##  [9] "period.max"      "period.min"      "period.prod"     "period.sum"     
## [13] "periodicity"     "to.daily"        "to.hourly"       "to.minutes"     
## [17] "to.minutes10"    "to.minutes15"    "to.minutes3"     "to.minutes30"   
## [21] "to.minutes5"     "to.monthly"      "to.period"       "to.quarterly"   
## [25] "to.weekly"       "to.yearly"       "to_period"

Trong đó chúng ta chia thành 2 nhóm chính:

  • Period apply function: Áp dụng các hàm thống kê theo time segment

  • Các hàm này được ứng dụng theo time segment (chẳng hạn như tính max, min, mean, … theo các time segment daily,weekly, monthly, quarterly, yearly).

  • Cú pháp: apply.daily(x, FUN, …). Trong đó FUN là hàm số áp dụng (min,max,mean,…)

Trường hợp chưa xác định periodic sử dụng hàm:

  • period.apply(x,INDEX,FUN,…). INDEX là điểm endpoints đánh dấu cho vị trí kết thúc chu kì. Chẳng hạn với chuỗi weekly thì INDEX là chuỗi 0,7,14,21,28,… cách nhau 7 ngày (nếu weekly tính cả thứ 7,chủ nhật).

  • Các lựa chọn sẵn có bao gồm: apply.daily, weekly, monthly, quarterly, yearly.

  • To-period apply function: Chuyển đổi dữ liệu theo chu kì

  • Chuyển từ chuỗi có chu kì nhỏ sang các chuỗi có chu kì lớn hơn (ví dụ convert chu kì daily to monthly).

  • Cú pháp: to.period(x, period = ‘months’, k = 1, indexAt, name = NULL, OHLC = TRUE, …).

  • Argument period xác định chu kì (minutes, hourly,daily, weekly, monthly, quarterly, yearly), argument k xác định step của chi kì trong chuỗi, indexAt là định dạng của index sau khi chuỗi mới được trả về (các options: ‘yearmon’, ‘yearqtr’, ‘firstof’, ‘lastof’, ‘startof’, or ‘endof’ tương ứng với tháng, quí, đầu chu kì, cuối chu kì, thời điểm bắt đầu trong data ứng với chu kì,thời điểm kết thúc trong data ứng với chu kì).

  • Các lựa chọn gồm to.minutes, hourly, daily, weekly, monthly, quarterly, yearly.

Chú ý quan trọng: Cấu trúc trả về là khác nhau đối với hàm to.period và to.monthly (to.weekly, to.quarterly,…). to.period trả về một ngày trong khi to.months trả về kí tự dạng MMM YYYY. Tốt nhất là sử dụng to.period khi làm việc với time-series thông qua package lubridate.

Chuyển chuỗi từ ngày sang tháng (‘to.monthly’)

AAPL %>% tq_transmute(select = c(2:5),
                  mutate_fun = to.period,
                  period = 'months')
## # A tibble: 2 × 4
##   date        open  high   low
##   <date>     <dbl> <dbl> <dbl>
## 1 2023-07-31  196.  196.  195.
## 2 2023-08-02  195.  195.  192.

Lấy giá trung bình trong tháng

AAPL %>% tq_transmute(select = c(2:5),
                  mutate_fun = apply.monthly,
                  period = 'months',
                  FUN = mean)
## # A tibble: 2 × 4
##   date        open  high   low
##   <date>     <dbl> <dbl> <dbl>
## 1 2023-07-31  196.  196.  195.
## 2 2023-08-02  196.  196.  194.

3.3.3.3 Các hàm trong quantmod

# Danh sách các function trong quantmod được kế thừa trong tidyquant:
tq_transmute_fun_options()$quantmod
##  [1] "allReturns"      "annualReturn"    "ClCl"            "dailyReturn"    
##  [5] "Delt"            "HiCl"            "Lag"             "LoCl"           
##  [9] "LoHi"            "monthlyReturn"   "Next"            "OpCl"           
## [13] "OpHi"            "OpLo"            "OpOp"            "periodReturn"   
## [17] "quarterlyReturn" "seriesAccel"     "seriesDecel"     "seriesDecr"     
## [21] "seriesHi"        "seriesIncr"      "seriesLo"        "weeklyReturn"   
## [25] "yearlyReturn"

Các hàm tăng extract và transfrorm OHLC object

  • Lớp các hàm tính chênh lệch giá trong phiên: ClCl, HiCl, LoCl, LoHi, OpCl, OpHi, OpLo, OpOp. Chẳng hạn khi sử dụng hàm OpCl(OHLC object) kết quả trả về là tăng trưởng trong ngày = Close/Open - 1.

  • Lớp các hàm Extract data: Op, Hi, Lo, Cl. Các hàm này sẽ lấy dữ liệu với các cột ứng với Open, High, Low, Close.

    Tính sai phân (Delt) và trễ (Lag):

  • Delt: Là sai phân của các chuỗi theo thời gian có thể sử dụng phương pháp chia số học hoặc log. Delt(x1, x2 = NULL, k = 0, type = c(“arithmetic”, “log”))

  • Lag/Next: Nhân tử trễ/ sớm tương ứng với Lag(x, k = 1) / Next: Next(x, k = 1) (Chúng ta cũng có thể sử dplyr::lag và dplyr::lead)

    Period Return:

  • Trả về lợi suất arithmetic hoặc logarithmic cho các chu kì khác nhau như daily, weekly, monthly, quarterly, and yearly.

  • Cú pháp: periodReturn(x, period = ‘monthly’, subset = NULL, type = ‘arithmetic’, leading = TRUE, …).

    Series Functions:

  • Trả về mô tả của chuỗi. Các lựa chọn bao gồm increases/decreases, acceleration/deceleration, and hi/low.

  • Cú pháp: seriesHi(x), seriesIncr(x, thresh = 0, diff. = 1L), seriesAccel(x)

Tính lợi nhuận theo tháng của AAPL

AAPL %>% tq_transmute(select = close,
                  mutate_fun = periodReturn,
                  period = 'monthly',
                  type = 'log')
## # A tibble: 2 × 2
##   date       monthly.returns
##   <date>               <dbl>
## 1 2023-07-31          0     
## 2 2023-08-02         -0.0199

Tính trễ của AAPL

AAPL %>% tq_transmute(select = close,
                  mutate_fun = Lag,
                  k = 1)
## # A tibble: 3 × 2
##   date       Lag.1
##   <date>     <dbl>
## 1 2023-07-31   NA 
## 2 2023-08-01  196.
## 3 2023-08-02  196.

Tính tăng/giảm của chuỗi AAPL

AAPL %>% tq_mutate(select = close,
                  mutate_fun = seriesIncr)
## # A tibble: 3 × 9
##   symbol date        open  high   low close   volume adjusted seriesIncr
##   <chr>  <date>     <dbl> <dbl> <dbl> <dbl>    <dbl>    <dbl> <lgl>     
## 1 AAPL   2023-07-31  196.  196.  195.  196. 38824100     196. NA        
## 2 AAPL   2023-08-01  196.  197.  195.  196. 35175100     196. FALSE     
## 3 AAPL   2023-08-02  195.  195.  192.  193. 50241600     193. FALSE

Nhưng tốt nhất là sử dụng hàm lag của dplyr

AAPL %>% transmute(Lag.1 = lag(close, n = 1L)) 
## # A tibble: 3 × 1
##   Lag.1
##   <dbl>
## 1   NA 
## 2  196.
## 3  196.

3.3.3.4 Các hàm trong PerformanceAnalytics

# Danh sách các hàm trong PerformanceAnalytics
tq_transmute_fun_options()$PerformanceAnalytics 
## [1] "Return.annualized"        "Return.annualized.excess"
## [3] "Return.clean"             "Return.cumulative"       
## [5] "Return.excess"            "Return.Geltner"          
## [7] "zerofill"

Các hàm của PerformanceAnalytics chủ yếu được sử dụng để tính toán các returns:

  • Return.annualized: Tính lợi suất theo năm.

  • Return.annualized.excess: Tính lợi suất theo năm chênh lệch giữa 2 giai đoạn.

  • Return.clean: Tính return sau khi loại bỏ các outlier khỏi return theo 3 phương pháp chính gồm: none, boudt, geltner

  • Return.excess: Loại bỏ các risk-free rate từ return của yield returns

  • zerofill: Replace các giá trị NA bằng zeros.

Tính lợi suất của AAPL theo năm

AAPL %>% tq_transmute(
                  mutate_fun = Return.annualized,
                  scale = 252,
                  geometric = FALSE)
##                       open    high      low    close      volume adjusted
## Annualized Return 49336.56 49425.6 48920.76 49109.76 10436227200 49109.76

Tính lợi suất của AAPL theo năm với độ tin cậy là 95%

AAPL %>% tq_transmute(select = close,
                  mutate_fun = Return.clean,
                  alpha = 0.05,
                  method = c("geltner"))
## # A tibble: 3 × 2
##   date       close
##   <date>     <dbl>
## 1 2023-07-31   NA 
## 2 2023-08-01  196.
## 3 2023-08-02  193.

3.4 Các hàm visualization

Những biểu đồ trong tidyquant bao gồm:

  • geom_barchart(): Biểu diễn xu hướng giá open, high, low, close qua từng phiên theo barchart.

  • geom_candlestick(): Biểu diễn xu hướng giá open, high, low, close qua từng phiên theo candlechart.

  • geom_ma(): Thêm các đường moving average dựa vào công thức được định nghĩa trong ma_fun. Chẳng hạn như moving average theo SMA, EMA, WMA,….

  • geom_bbands(): Biếu diễn đường bollinger bands dựa vào chu kì và range biến thiên được qui định theo cấp số nhân của standard deviation.

3.4.1 Cú pháp

geom_barchart(open,high,low,close)
geom_candlestick(open,high,low,close)
geom_bbands(ma_fun, sd, n)
geom_ma(ma_fun, n)

3.4.2 Giải thích các argument

open, high, low, close: Giá mở, cao nhất, thấp nhất và đóng cửa.

n: Số phiên được sử dụng trong các công thức tính moving average.

sd: Độ rộng range của đường bollinger bands.

ma_fun: Công thức tính moving average.

Ngoài ra trong các hàm số trên còn có những thành phân khác tương tự như ggplot2 thể hiện định dạng đồ thị như linetype, color, size,…

Biểu đồ line chart là một loại biểu đồ sử dụng các đường thẳng nối các điểm dữ liệu trong một hệ thống tọa độ để biểu diễn sự thay đổi và xu hướng của dữ liệu theo thời gian hoặc các giá trị liên quan. Đường thẳng nối các điểm dữ liệu tạo thành một đường cong liên tục, cho phép ta nhìn thấy sự biến đổi liên tục của dữ liệu qua thời gian hoặc các giá trị khác nhau.

# Biểu đồ line chart
AAPL %>%
    ggplot(aes(x = date, y = close)) +
    geom_line() +
    labs(title = "AAPL Line Chart", y = "Closing Price", x = "") + 
    theme_tq()

Biểu đồ barchart và candel chart là các loại biểu đồ thường được sử dụng trong phân tích dữ liệu và thị trường tài chính.

Barchart là một biểu đồ dùng để hiển thị các giá trị bằng các thanh hình chữ nhật, trong đó chiều dọc của thanh thể hiện giá trị của một biến. Barchart thường được sử dụng để so sánh các giá trị của các biến khác nhau hoặc để thể hiện xu hướng của một biến theo thời gian.

# Biếu đồ BarChart
AAPL %>%
    ggplot(aes(x = date, y = close)) +
    geom_barchart(aes(open = open, high = high, low = low, close = close)) +
    labs(title = "AAPL Bar Chart", y = "Closing Price", x = "") + 
    theme_tq()

So sánh với 3 mã chứng khoán khác:

  • CMG (Công ty cổ phần tập đoàn thế giới di động)

  • MSFT (Công ty công nghệ Microsoft)

  • GOOG (Công ty Google)

#Vẽ nhiều chart của các mã chứng khoán trên cùng một đồ thị


#Lấy 4 mã chứng khoán thuộc ngành chứng khoán đã được stack thành 1 bảng
(stocks <- tq_get(c('AAPL','GOOD','CMG','MSFT'), stack = TRUE))
## # A tibble: 10,656 × 8
##    symbol date        open  high   low close    volume adjusted
##    <chr>  <date>     <dbl> <dbl> <dbl> <dbl>     <dbl>    <dbl>
##  1 AAPL   2013-01-02  19.8  19.8  19.3  19.6 560518000     16.8
##  2 AAPL   2013-01-03  19.6  19.6  19.3  19.4 352965200     16.6
##  3 AAPL   2013-01-04  19.2  19.2  18.8  18.8 594333600     16.1
##  4 AAPL   2013-01-07  18.6  18.9  18.4  18.7 484156400     16.0
##  5 AAPL   2013-01-08  18.9  19.0  18.6  18.8 458707200     16.1
##  6 AAPL   2013-01-09  18.7  18.8  18.4  18.5 407604400     15.8
##  7 AAPL   2013-01-10  18.9  18.9  18.4  18.7 601146000     16.0
##  8 AAPL   2013-01-11  18.6  18.8  18.5  18.6 350506800     15.9
##  9 AAPL   2013-01-14  18.0  18.1  17.8  17.9 734207600     15.4
## 10 AAPL   2013-01-15  17.8  17.8  17.3  17.4 876772400     14.9
## # ℹ 10,646 more rows

Candle chart (hay còn gọi là biểu đồ nến) là một biểu đồ thể hiện thông tin giá cổ phiếu hoặc tài sản tài chính trong một khoảng thời gian nhất định. Mỗi cây nến trên biểu đồ bao gồm hai phần: thân nến và bóng. Thân nến thể hiện phạm vi giá mở và đóng trong một khoảng thời gian, trong khi bóng (cũng gọi là bóng trên và bóng dưới) thể hiện phạm vi giá cao nhất và thấp nhất trong khoảng thời gian đó. Candle chart thường được sử dụng để phân tích xu hướng giá và dự đoán biến động trong thị trường tài chính.

#Biểu đồ candel chart trên cùng 1 đồ thị
stocks %>%
    ggplot(aes(x = date, y = close, group = symbol)) +
    geom_candlestick(aes(open = open, high = high, low = low, close = close)) +
    labs(title = "Stock sector Candlestick Chart", 
         subtitle =  'Experimenting with Multiple Stocks',
         y = "Closing Price", 
         x = "") + 
    theme_tq()

face_wrap() là một hàm trong gói phần mềm dplyr trong ngôn ngữ lập trình R. Hàm này được sử dụng để tổ chức các biểu đồ dưới dạng lưới trong một trình tự nhất định. Khi áp dụng face_wrap() cho các biểu đồ barchart hoặc candle chart, nó giúp xếp chúng vào các cột hoặc hàng trong lưới để dễ quan sát và so sánh.

# Sử dụng hàm facet_wrap() để chia ra làm 4 đồ thị tương tự như trong ggplot2
endate <- Sys.Date()-1
stocks %>%
    ggplot(aes(x = date, y = close, group = symbol)) +
    geom_candlestick(aes(open = open, high = high, low = low, close = close)) +
    labs(title = "Stock sector Candlestick Chart", 
         subtitle =  'Experimenting with Multiple Stocks',
         y = "Closing Price", 
         x = "") + 
    coord_x_date(xlim = c(endate-180, endate)) +
    facet_wrap(~ symbol, ncol = 2, scale = "free_y") + 
    theme_tq()

#Thêm đường moving average có độ dài chu kì n = 15 cho các mã chứng khoán này bằng hàm geom_ma()
stocks %>%
    ggplot(aes(x = date, y = close, group = symbol)) +
    geom_candlestick(aes(open = open, high = high, low = low, close = close)) +
    geom_ma(ma_fun = SMA, n = 15, color = "darkgreen", size = 1) +
    labs(title = "Stock sector Candlestick Chart", 
         subtitle =  'Experimenting with Multiple Stocks',
         y = "Closing Price", 
         x = "") + 
    coord_x_date(xlim = c(endate-180, endate)) +
    facet_wrap(~ symbol, ncol = 2, scale = "free_y") + 
    theme_tq()

#Thêm đường moving average có độ dài chu kì n = 50   
stocks %>%
    ggplot(aes(x = date, y = close, group = symbol)) +
    geom_candlestick(aes(open = open, high = high, low = low, close = close)) +
    geom_ma(ma_fun = SMA, n = 15, color = "darkgreen", size = 1) +
    geom_ma(ma_fun = SMA, n = 50, color = "orange", size = 1) +
    labs(title = "Stock sector Candlestick Chart", 
         subtitle =  'Experimenting with Multiple Stocks',
         y = "Closing Price", 
         x = "") + 
    coord_x_date(xlim = c(endate-180, endate)) +
    facet_wrap(~ symbol, ncol = 2, scale = "free_y") + 
    theme_tq()

Như chúng ta đã biết Bollinger Band là một đường rất quan trọng cho biết ngưỡng giá trị của một chỉ số chứng khoán. Trong VNDS chúng ta có thể sử dụng geom_bbands() để add thêm đường này vào biểu đồ. Lưu ý là cả geom_candlestick() và geom_bbands() đều sử dụng các giá trị high, low, close prices để làm input nên chúng ta phải đặt các dữ liệu này ở ggplot() để geom_candlestick() và geom_bbands() có thể cùng sử dụng.

stocks %>%
    ggplot(aes(x = date, y = close, open = open, high = high, low = low, close = close, group = symbol)) +
    geom_candlestick() +
    geom_bbands(ma_fun = SMA, sd = 2, n=20) +
    labs(title = "Stock sector Candlestick Chart", 
         subtitle =  'Experimenting with Multiple Stocks',
         y = "Closing Price", 
         x = "") + 
    coord_x_date(xlim = c(endate-180, endate-40)) +
    facet_wrap(~ symbol, ncol = 2, scale = "free_y") + 
    theme_tq()

Trong phân tích chứng khoán, yếu tố mà nhà đầu tư quan tâm hàng đầu đó là trendline của các chuỗi chứng khoán. ChÚng ta có thể thêm các đường trendline của regression thông qua geom_smooth()

stocks %>%
    ggplot(aes(x = date, y = close, open = open, high = high, low = low, close = close, group = symbol)) +
    geom_candlestick() +
    geom_bbands(ma_fun = SMA, sd = 2, n=20) +
    geom_smooth(method='lm')+
    labs(title = "Stock sector Candlestick Chart", 
         subtitle =  'Experimenting with Multiple Stocks',
         y = "Closing Price", 
         x = "") + 
    coord_x_date(xlim = c(endate-180, endate-40)) +
    facet_wrap(~ symbol, ncol = 2, scale = "free_y") + 
    theme_tq()
## `geom_smooth()` using formula = 'y ~ x'

Lựa chọn cơ bản nhất là trendline dạng linear (lm). Ngoài ra còn có các lựa chọn khác như generalized multiple regession (glm), generalized addictive model (gam), local regression model (loess) hoặc tự qui định công thức thông qua argument formula của geom_smoothing()

#Sử dụng trend trong local regression model
stocks %>%
    ggplot(aes(x = date, y = close, open = open, high = high, low = low, close = close, group = symbol)) +
    geom_candlestick() +
    geom_bbands(ma_fun = SMA, sd = 2, n=20) +
    geom_smooth(method='loess')+
    labs(title = "Stock sector Candlestick Chart", 
         subtitle =  'Experimenting with Multiple Stocks',
         y = "Closing Price", 
         x = "") + 
    coord_x_date(xlim = c(endate-180, endate-40)) +
    facet_wrap(~ symbol, ncol = 2, scale = "free_y") + 
    theme_tq()
## `geom_smooth()` using formula = 'y ~ x'

#Sử dụng trend theo công thức hồi qui đa thức tự định nghĩa.
stocks %>%
    ggplot(aes(x = date, y = close, open = open, high = high, low = low, close = close, group = symbol)) +
    geom_candlestick() +
    geom_bbands(ma_fun = SMA, sd = 2, n=20) +
    geom_smooth(formula = y ~ poly(x,2)+x)+
    labs(title = "Stock sector Candlestick Chart", 
         subtitle =  'Experimenting with Multiple Stocks',
         y = "Closing Price", 
         x = "") + 
    coord_x_date(xlim = c(endate-180, endate-40)) +
    facet_wrap(~ symbol, ncol = 2, scale = "free_y") + 
    theme_tq()
## `geom_smooth()` using method = 'gam'

#Ta thấy công thức trend theo đa thức bậc 2 không chuẩn xác lắm vì đường trend không bám sát với giá. Sử dụng công thức y = log(x) để biểu diễn trend.

stocks %>%
    ggplot(aes(x = date, y = close, open = open, high = high, low = low, close = close, group = symbol)) +
    geom_candlestick() +
    geom_bbands(ma_fun = SMA, sd = 2, n=20) +
    geom_smooth(formula = y ~ log(x))+
    labs(title = "Stock sector Candlestick Chart", 
         subtitle =  'Experimenting with Multiple Stocks',
         y = "Closing Price", 
         x = "") + 
    coord_x_date(xlim = c(endate-180, endate-40)) +
    facet_wrap(~ symbol, ncol = 2, scale = "free_y") + 
    theme_tq()
## `geom_smooth()` using method = 'gam'

# Chúng ta cũng có thể thay đổi theme cho đồ thị để trông đẹp mắt hơn 
#theme_dark()
stocks %>%
    ggplot(aes(x = date, y = close, open = open, high = high, low = low, close = close, group = symbol)) +
    geom_candlestick() +
    geom_bbands(ma_fun = SMA, sd = 2, n=20) +
    geom_smooth(formula = y ~ log(x))+
    labs(title = "Stock sector Candlestick Chart", 
         subtitle =  'Experimenting with Multiple Stocks',
         y = "Closing Price", 
         x = "") + 
    coord_x_date(xlim = c(endate-180, endate-40)) +
    facet_wrap(~ symbol, ncol = 2, scale = "free_y") + 
    theme_dark()
## `geom_smooth()` using method = 'gam'

#theme_tq_green()    
stocks %>%
    ggplot(aes(x = date, y = close, open = open, high = high, low = low, close = close, group = symbol)) +
    geom_candlestick() +
    geom_bbands(ma_fun = SMA, sd = 2, n=20) +
    geom_smooth(formula = y ~ log(x))+
    labs(title = "Stock sector Candlestick Chart", 
         subtitle =  'Experimenting with Multiple Stocks',
         y = "Closing Price", 
         x = "") + 
    coord_x_date(xlim = c(endate-180, endate-40)) +
    facet_wrap(~ symbol, ncol = 2, scale = "free_y") + 
    theme_tq_green()    
## `geom_smooth()` using method = 'gam'

Như vậy chúng ta có thể thấy về mặt visualization tidyquant package đã có sự cải tiến hơn ở những điểm sau:

  • Visualize theo các dạng chart type khác nhau như candle chart, bar chart.

  • Biểu diễn nhiều chuỗi giá khác nhau trên cùng 1 đồ thị.

  • Biểu diễn các đường trend line theo các dạng moving average, bollinger band và đường trend line tự định nghĩa để theo dõi xu hướng trend của chuỗi giá.

  • Trên phương diện thẩm mỹ thì các đồ thị này có thể thay đổi được nhiều kiểu theme và màu sắc các phiên tăng giảm đã được tùy chỉnh theo ý người sử dụng.

4 CHƯƠNG 4: KẾT LUẬN

Các nhà khoa học dữ liệu dành gần 70% (nếu không muốn nói là nhiều hơn) thời gian của họ để làm sạch, sắp xếp và chuẩn bị dữ liệu. Nhiều cuộc khảo sát đã xác nhận con số đó. Đặc biệt trong ngành kinh doanh có rất nhiều dữ liệu để thống kê và sẽ thật khó để xây dựng các mô hình mạnh mẽ và chính xác mà có thể đảm bảo được dữ liệu bằng những cách thức thống kê thông thường. Vì vậy “tidyverse” package trong thế giới R đã được phát minh để làm việc với số liệu một cách hiệu quả và nhanh chóng nhất.

Tidyverse đã mang lại các gói R cần thiết cho khoa học dữ liệu với triết lý thiết kế chung để thao tác, khám phá và trực quan hoá dữ liệu. Sử dụng “tidyverse” giúp chúng ta thực hiện theo cách của mình trong hầu hết toàn bộ quá trình phân tích dữ liệu. Các gói trong “tidyverse” phối hợp với nhau một cách tự nhiên - quan trọng nhất là dplyr và thậm chí nó còn giúp dữ liệu gọn gàng hơn. Các gói này được duy trì tốt và đã được áp dụng rộng rãi trong cộng đồng R. Cú pháp rõ ràng và nhất quán của nó làm cho việc học trở nên dễ dàng. Hơn nữa, tất cả các hàm (hoặc động từ) phổ biến có thể được kết hợp bằng cách sử dụng toán tử %>%. Bộ tính năng của “tidyverse” để định hình lại dữ liệu và tham gia là vô song trong hệ sinh thái R. Thông qua các gói tiện ích mở rộng như dplyr và sparklyr, chúng ta thậm chí có thể viết các truy vấn cho cơ sở dữ liệu hoặc các đầu cuối của cụm hadoop. Các truy vấn tương ứng được dịch cho phần cuối cụ thể. Mặt khác, “tidyverse” có nhiều phần phụ thuộc gói và có thể khó cài đặt cũng như duy trì các phần phụ thuộc này trong các môi trường công nghệ thông tin và hệ thống sản xuất cụ thể.

Ngoài ra, tidyquant cung cấp các công cụ mạnh mẽ để tiền xử lý dữ liệu tài chính, bao gồm chuyển đổi dữ liệu hàng ngày sang dữ liệu hàng tuần, hàng tháng hoặc thu nhập thực hiện (income statements). Gói phần mềm này cũng cung cấp các chức năng phân tích kỹ thuật như tính toán các chỉ số kỹ thuật và tạo ra biểu đồ nến (candle charts) để phân tích xu hướng giá.

Cuối cùng, tidyquant cung cấp tích hợp hoàn hảo với dplyr và ggplot2 trong R, cho phép người dùng thực hiện các thao tác dữ liệu phức tạp và tạo ra biểu đồ một cách dễ dàng và linh hoạt.

Nhìn chung, tidyquant là một công cụ mạnh mẽ và tiện ích cho việc làm việc với dữ liệu tài chính trong RMarkdown. Nó cung cấp các công cụ và chức năng đáng giá để tiền xử lý, phân tích và trực quan hóa dữ liệu tài chính, giúp người dùng tạo ra báo cáo và biểu đồ chất lượng cao với một chuỗi lệnh đơn giản. Nếu chúng ta quan tâm đến phân tích dữ liệu tài chính và sử dụng RMarkdown, hãy thử sử dụng tidyquant để trải nghiệm các tính năng và tiện ích mà nó mang lại.

TÀI LIỆU THAM KHẢO:

  1. Tidy Quantitative Financial Analysis (https://cran.r-project.org/web//packages//tidyquant/tidyquant.pdf)

  2. ỨNG DỤNG NGÔN NGỮ R TRONG PHÂN TÍCH DỮ LIỆU CHỨNG KHOÁN (https://sti.vista.gov.vn/tw/Lists/TaiLieuKHCN/Attachments/349221/CVv477S222022078.pdf)