時間序列分析工具箱——tidyquant


時間序列分析工具箱——tidyquant

本文翻譯自《Demo Week: class(Monday) <- tidyquant》

原文鏈接:http://www.business-science.io/code-tools/2017/10/23/demo_week_tidyquant.html

tidyquant 的用途

使用 tidyquant 的六大理由:

  1. 直接從 Yahoo! Finance、FRED Database、Quandl 等數據源獲得網絡數據
  2. 簡化 xts、zoo、quantmod、TTR 和 PerformanceAnalytics 中金融及時間序列函數的調用
  3. 可視化: 漂亮的主題以及針對金融的 geom(例如 geom_ma
  4. 構建投資組合
  5. 財務分析以及投資組合歸因方法
  6. 為金融與時間序列分析提供堅實的基礎tidyquant 會自動加載 tidyverse 和各種金融、時間序列分析包,這使得它成為任何金融或時間序列分析的理想起點。

該教程將會介紹前兩個主題。其他主題請查看 tidyquant 的文檔

加載包

請先安裝 tidyquant

# Install libraries
install.packages("tidyquant")

加載 tidyquant

# Load libraries
library(tidyquant) # Loads tidyverse, financial pkgs, used to get and manipulate data

tq_get:獲得數據

使用 tq_get() 獲得網絡數據。tidyquant 提供了大量 API 用於連接包括 Yahoo! Finance、FRED Economic Database、Quandl 等等在內的數據源。

從 Yahoo! Finance 獲得股票數據

將一列股票代碼傳入 tq_get(),同時設置 get = "stock.prices"。可以添加 fromto 參數設置數據的起始和結束日期。

# Get Stock Prices from Yahoo! Finance

# Create a vector of stock symbols
FANG_symbols <- c("FB", "AMZN", "NFLX", "GOOG")

# Pass symbols to tq_get to get daily prices
FANG_data_d <- FANG_symbols %>%
    tq_get(
        get = "stock.prices",
        from = "2014-01-01", to = "2016-12-31")

# Show the result
FANG_data_d
## # A tibble: 3,024 x 8
##    symbol       date  open  high   low close   volume adjusted
##     <chr>     <date> <dbl> <dbl> <dbl> <dbl>    <dbl>    <dbl>
##  1     FB 2014-01-02 54.83 55.22 54.19 54.71 43195500    54.71
##  2     FB 2014-01-03 55.02 55.65 54.53 54.56 38246200    54.56
##  3     FB 2014-01-06 54.42 57.26 54.05 57.20 68852600    57.20
##  4     FB 2014-01-07 57.70 58.55 57.22 57.92 77207400    57.92
##  5     FB 2014-01-08 57.60 58.41 57.23 58.23 56682400    58.23
##  6     FB 2014-01-09 58.65 58.96 56.65 57.22 92253300    57.22
##  7     FB 2014-01-10 57.13 58.30 57.06 57.94 42449500    57.94
##  8     FB 2014-01-13 57.91 58.25 55.38 55.91 63010900    55.91
##  9     FB 2014-01-14 56.46 57.78 56.10 57.74 37503600    57.74
## 10     FB 2014-01-15 57.98 58.57 57.27 57.60 33663400    57.60
## # ... with 3,014 more rows

可以使用 ggplot2 畫出上述結果。使用 tidyquant 提供的主題(調用 theme_tq()scale_color_tq())實現金融、商務風格的可視化效果。

# Plot data
FANG_data_d %>%
    ggplot(aes(x = date, y = adjusted, color = symbol)) + 
    geom_line() +
    facet_wrap(~ symbol, ncol = 2, scales = "free_y") +
    theme_tq() +
    scale_color_tq() +
    labs(title = "Visualize Financial Data")

從 FRED 獲得經濟數據

下面的例子來自房地美副首席經濟學家 Leonard Kieffer 近期的文章——《A (TIDYQUANT)UM OF SOLACE》。我們將使用 tq_get() 並設置參數 get = "economic.data" 來從 FRED 經濟數據庫獲取數據。

將一列 FRED 代碼傳遞到 tq_get()

# Economic Data from the FRED

# Create a vector of FRED symbols
FRED_symbols <- c('ETOTALUSQ176N',    # All housing units
                  'EVACANTUSQ176N',   # Vacant
                  'EYRVACUSQ176N',    # Year-round vacant
                  'ERENTUSQ176N')     # Vacant for rent

# Pass symbols to tq_get to get economic data
FRED_data_m <- FRED_symbols %>%
    tq_get(get="economic.data", from = "2001-04-01")

# Show results
FRED_data_m
## # A tibble: 260 x 3
##           symbol       date  price
##            <chr>     <date>  <int>
##  1 ETOTALUSQ176N 2001-04-01 117786
##  2 ETOTALUSQ176N 2001-07-01 118216
##  3 ETOTALUSQ176N 2001-10-01 118635
##  4 ETOTALUSQ176N 2002-01-01 119061
##  5 ETOTALUSQ176N 2002-04-01 119483
##  6 ETOTALUSQ176N 2002-07-01 119909
##  7 ETOTALUSQ176N 2002-10-01 120350
##  8 ETOTALUSQ176N 2003-01-01 120792
##  9 ETOTALUSQ176N 2003-04-01 121233
## 10 ETOTALUSQ176N 2003-07-01 121682
## # ... with 250 more rows

和金融數據一樣,使用 ggplot2 畫圖,使用 tidyquant 提供的主題(調用 theme_tq()scale_color_tq())實現金融、商務風格的可視化效果。

# Plot data
FRED_data_m %>%
    ggplot(aes(x = date, y = price, color = symbol)) + 
    geom_line() +
    facet_wrap(~ symbol, ncol = 2, scales = "free_y") +
    theme_tq() +
    scale_color_tq() +
    labs(title = "Visualize Economic Data")

使用 tq_transmutetq_mutate 轉換數據

函數 tq_transmute()tq_mutate() 可以使 xtszooquantmod 中的函數調用更“tidy”。這里直接介紹使用,“可用函數”一節羅列了已經整合進 tidyquant 的若干其他函數。

tq_transmute

tq_transmute()tq_mutate() 之間的區別在於 tq_transmute() 將返回一個新的數據框對象,而 tq_mutate() 則在原有數據框的基礎上橫向添加數據(例如,增加一列)。當數據因為改變周期而改變行數時,tq_transmute() 特別有用。

改變周期與 tq_transmute

下面的例子將改變數據的周期,從每日數據變為月度數據。這時,你需要使用 tq_transmute() 來完成這一操作,因為數據的行數改變了。

# Change periodicity from daily to monthly using to.period from xts
FANG_data_m <- FANG_data_d %>%
    group_by(symbol) %>%
    tq_transmute(
        select      = adjusted,
        mutate_fun  = to.period,
        period      = "months")

FANG_data_m
## # A tibble: 144 x 3
## # Groups:   symbol [4]
##    symbol       date adjusted
##     <chr>     <date>    <dbl>
##  1     FB 2014-01-31    62.57
##  2     FB 2014-02-28    68.46
##  3     FB 2014-03-31    60.24
##  4     FB 2014-04-30    59.78
##  5     FB 2014-05-30    63.30
##  6     FB 2014-06-30    67.29
##  7     FB 2014-07-31    72.65
##  8     FB 2014-08-29    74.82
##  9     FB 2014-09-30    79.04
## 10     FB 2014-10-31    74.99
## # ... with 134 more rows

改變數據周期可以縮減數據量。一些注意事項項:

  • theme_tq()scale_color_tq() 用來繪制商務風格的圖。
  • 如果要改變數據的周期或者進行其他基於時間的操作,請留意后續關於 tibbletime 包的教程,tibbletime 以另外一種標准處理基於時間的操作。

周期改變前,數據太多

# Daily data
FANG_data_d %>%
    ggplot(aes(date, adjusted, color = symbol)) +
    geom_point() +
    geom_line() +
    facet_wrap(~ symbol, ncol = 2, scales = "free_y") +
    scale_color_tq() +
    theme_tq() +
    labs(title = "Before transformation: Too Much Data")

周期改變后,容易理解

tq_transmute() 轉變成月度數據后容易理解多了。

# Monthly data
FANG_data_m %>%
    ggplot(aes(date, adjusted, color = symbol)) +
    geom_point() +
    geom_line() +
    facet_wrap(~ symbol, ncol = 2, scales = "free_y") +
    scale_color_tq() +
    theme_tq() +
    labs(title = "After transformation: Easier to Understand")

tq_mutate

tq_mutate() 函數基於 xts 包為數據添加新的列。正因為這樣,當返回數據不止一列時,tq_mutate() 顯得特別有用(dplyr::mutate() 就沒有這樣的功能)。

tq_mutate 與滯后數據

一個關於 lag.xts 的例子。通常我們需要不只一列滯后數據,這正是 tq_mutate() 擅長的。下面,為原數據添加五列滯后數據。

# Lags - Get first 5 lags

# Pro Tip: Make the new column names first, then add to the `col_rename` arg
column_names <- paste0("lag", 1:5)

# First five lags are output for each group of symbols
FANG_data_d %>%
    select(symbol, date, adjusted) %>%
    group_by(symbol) %>%
    tq_mutate(
        select     = adjusted,
        mutate_fun = lag.xts,
        k          = 1:5,
        col_rename = column_names)
## # A tibble: 3,024 x 8
## # Groups:   symbol [4]
##    symbol       date adjusted  lag1  lag2  lag3  lag4  lag5
##     <chr>     <date>    <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
##  1     FB 2014-01-02    54.71    NA    NA    NA    NA    NA
##  2     FB 2014-01-03    54.56 54.71    NA    NA    NA    NA
##  3     FB 2014-01-06    57.20 54.56 54.71    NA    NA    NA
##  4     FB 2014-01-07    57.92 57.20 54.56 54.71    NA    NA
##  5     FB 2014-01-08    58.23 57.92 57.20 54.56 54.71    NA
##  6     FB 2014-01-09    57.22 58.23 57.92 57.20 54.56 54.71
##  7     FB 2014-01-10    57.94 57.22 58.23 57.92 57.20 54.56
##  8     FB 2014-01-13    55.91 57.94 57.22 58.23 57.92 57.20
##  9     FB 2014-01-14    57.74 55.91 57.94 57.22 58.23 57.92
## 10     FB 2014-01-15    57.60 57.74 55.91 57.94 57.22 58.23
## # ... with 3,014 more rows

tq_mutate 與滾動函數

另一個例子,應用 xts 中的滾動函數 roll.apply()。讓我們借助函數 quantile() 得到滾動分位數。下面是每個函數的參數:

tq_mutate 的參數:

  • select = adjusted,只選擇復權修正過的數據列。該參數也可以不填,或選擇其他不同的列。
  • mutate_fun = rollapply,這是一個 xts 函數,將會以 “tidy” 的方式(分組)調用。

rollapply 的參數:

  • width = 5,告訴 rollapply 計算窗口的周期(長度)是多少。
  • by.column = FALSErollapply() 函數默認對每一列分別操作,然而我們要把所有列放在一起操作。
  • FUN = quantilequantile() 正是要被滾動調用的函數。

quantile 的參數:

  • probs = c(0, 0.025, ...),計算這些概率的分位數。
  • na.rm = TRUEquantile 會去掉遇到的 NA 值。
# Rolling quantile
FANG_data_d %>%
    select(symbol, date, adjusted) %>%
    group_by(symbol) %>%
    tq_mutate(
        select     = adjusted,
        mutate_fun = rollapply,
        width      = 5,
        by.column  = FALSE,
        FUN        = quantile,
        probs      = c(0, 0.025, 0.25, 0.5, 0.75, 0.975, 1),
        na.rm      = TRUE)
## # A tibble: 3,024 x 10
## # Groups:   symbol [4]
##    symbol       date adjusted   X0.  X2.5.  X25.  X50.  X75. X97.5.
##     <chr>     <date>    <dbl> <dbl>  <dbl> <dbl> <dbl> <dbl>  <dbl>
##  1     FB 2014-01-02    54.71    NA     NA    NA    NA    NA     NA
##  2     FB 2014-01-03    54.56    NA     NA    NA    NA    NA     NA
##  3     FB 2014-01-06    57.20    NA     NA    NA    NA    NA     NA
##  4     FB 2014-01-07    57.92    NA     NA    NA    NA    NA     NA
##  5     FB 2014-01-08    58.23 54.56 54.575 54.71 57.20 57.92 58.199
##  6     FB 2014-01-09    57.22 54.56 54.824 57.20 57.22 57.92 58.199
##  7     FB 2014-01-10    57.94 57.20 57.202 57.22 57.92 57.94 58.201
##  8     FB 2014-01-13    55.91 55.91 56.041 57.22 57.92 57.94 58.201
##  9     FB 2014-01-14    57.74 55.91 56.041 57.22 57.74 57.94 58.201
## 10     FB 2014-01-15    57.60 55.91 56.041 57.22 57.60 57.74 57.920
## # ... with 3,014 more rows, and 1 more variables: X100. <dbl>

可用函數

已經介紹了如何將 xts 函數和 tq_transmutetq_mutate 聯合使用。還有許多 xts 函數可以以 “tidy” 的方式使用!用 tq_transmute_fun_options() 查看其他可用函數。

# Available functions
# mutate_fun =
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"
##  [4] "apply.weekly"    "apply.yearly"    "diff.xts"       
##  [7] "lag.xts"         "period.apply"    "period.max"     
## [10] "period.min"      "period.prod"     "period.sum"     
## [13] "periodicity"     "to.daily"        "to.hourly"      
## [16] "to.minutes"      "to.minutes10"    "to.minutes15"   
## [19] "to.minutes3"     "to.minutes30"    "to.minutes5"    
## [22] "to.monthly"      "to.period"       "to.quarterly"   
## [25] "to.weekly"       "to.yearly"       "to_period"      
## 
## $quantmod
##  [1] "allReturns"      "annualReturn"    "ClCl"           
##  [4] "dailyReturn"     "Delt"            "HiCl"           
##  [7] "Lag"             "LoCl"            "LoHi"           
## [10] "monthlyReturn"   "Next"            "OpCl"           
## [13] "OpHi"            "OpLo"            "OpOp"           
## [16] "periodReturn"    "quarterlyReturn" "seriesAccel"    
## [19] "seriesDecel"     "seriesDecr"      "seriesHi"       
## [22] "seriesIncr"      "seriesLo"        "weeklyReturn"   
## [25] "yearlyReturn"   
## 
## $TTR
##  [1] "adjRatios"          "ADX"                "ALMA"              
##  [4] "aroon"              "ATR"                "BBands"            
##  [7] "CCI"                "chaikinAD"          "chaikinVolatility" 
## [10] "CLV"                "CMF"                "CMO"               
## [13] "DEMA"               "DonchianChannel"    "DPO"               
## [16] "DVI"                "EMA"                "EMV"               
## [19] "EVWMA"              "GMMA"               "growth"            
## [22] "HMA"                "KST"                "lags"              
## [25] "MACD"               "MFI"                "momentum"          
## [28] "OBV"                "PBands"             "ROC"               
## [31] "rollSFM"            "RSI"                "runCor"            
## [34] "runCov"             "runMAD"             "runMax"            
## [37] "runMean"            "runMedian"          "runMin"            
## [40] "runPercentRank"     "runSD"              "runSum"            
## [43] "runVar"             "SAR"                "SMA"               
## [46] "SMI"                "SNR"                "stoch"             
## [49] "TDI"                "TRIX"               "ultimateOscillator"
## [52] "VHF"                "VMA"                "volatility"        
## [55] "VWAP"               "VWMA"               "wilderSum"         
## [58] "williamsAD"         "WMA"                "WPR"               
## [61] "ZigZag"             "ZLEMA"             
## 
## $PerformanceAnalytics
## [1] "Return.annualized"        "Return.annualized.excess"
## [3] "Return.clean"             "Return.cumulative"       
## [5] "Return.excess"            "Return.Geltner"          
## [7] "zerofill"


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM