作者:徐瑞龙,量化分析师

博客专栏:

https://www.cnblogs.com/xuruilong100

前文推送

时间序列分析工具箱——timetk

基于 Keras 用深度学习预测时间序列

基于 Keras 用 LSTM 网络做时间序列预测

本文翻译自《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

# 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"。可以添加 from 和 to 参数设置数据的起始和结束日期。

# 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_transmute 和 tq_mutate 转换数据

函数 tq_transmute() 和 tq_mutate() 可以使 xtszoo 和 quantmod 中的函数调用更“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 dataFANG_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_transmute 与 tq_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"

大家都在看

2017年R语言发展报告(国内)

精心整理 | R语言中文社区历史文章合集(作者篇)

精心整理 | R语言中文社区历史文章整理(类型篇)

公众号后台回复关键字即可学习

回复 爬虫            爬虫三大案例实战  
回复 Python       1小时破冰入门

回复 数据挖掘     R语言入门及数据挖掘
回复 人工智能     三个月入门人工智能
回复 数据分析师  数据分析师成长之路 
回复 机器学习      机器学习的商业应用
回复 数据科学      数据科学实战
回复 常用算法      常用数据挖掘算法

时间序列分析工具箱——tidyquant相关推荐

  1. r软件时间序列分析论文_高度比较的时间序列分析-一篇论文评论

    r软件时间序列分析论文 数据科学 , 机器学习 (Data Science, Machine Learning) In machine learning with time series, using ...

  2. matlab在时间序列分...,matlab在时间序列分析

    ATLAB的时间序列建模与预测韩路跃 ,杜行检 (西安交通大学电子与信息工程学院 ,陕西 西安 710049) 摘要 : 该文介绍了 MATLAB 系统辨识工具箱在时间序列方面的应用...... 分析 ...

  3. 【组队学习】【30期】时间序列分析

    时间序列分析 航路开辟者:李岳昆.易远哲 领航员:王洲烽 航海士:李岳昆.易远哲 基本信息 开源内容:https://github.com/datawhalechina/team-learning-d ...

  4. Genome Biology:人体各部位微生物组时间序列分析Moving Pictures

    人体各部位微生物组初探 Moving pictures of the human microbiome Genome Biology, [14.028] 2011-05-30  Articles DO ...

  5. Genome Biology:人体各部位微生物组时间序列分析

    文章目录 人体各部位微生物组初探 摘要 背景 结果 结论 点评 主要结果 图1. 基于无权重UniFrac距离的PCoA 图2. 时间上的核心微生物组 图3. 群落中的成员关联 猜你喜欢 写在后面 人 ...

  6. 水稻微生物组时间序列分析4-随机森林回归

    写在前面 哪些菌可以作为生育时间的biomarkers? 回归分析 读取文件 随机森林回归 交叉验证 feature重要性 美化feature贡献度柱状图 图4.2. 绘制时间序列热图 猜你喜欢 写在 ...

  7. 水稻微生物组时间序列分析3-冲击图展示时间序序列变化

    写在前面 图3. 哪些菌门随时间呈现规律变化呢? 绘图实战 清空工作环境和加载包 读入实验设计.OTU表和物种注释 筛选高丰度门用于展示 数据交叉筛选 按样品绘图 按组绘图 绘制冲击图alluvium ...

  8. 水稻微生物组时间序列分析2b-散点图拟合

    写在前面 图2. 微生物组随时间变化的规律 图2. E-F散点图拟合展示距离变化 猜你喜欢 写在后面 写在前面 之前分享了3月底发表的的 <水稻微生物组时间序列分析>的文章,大家对其中图绘 ...

  9. 水稻微生物组时间序列分析2a-相关分析

    写在前面 图2. 微生物组随时间变化的规律 图2A-D. 相关性corrplot 猜你喜欢 写在后面 写在前面 之前分享了3月底发表的的 <水稻微生物组时间序列分析>的文章,大家对其中图绘 ...

  10. 水稻微生物组时间序列分析精讲1-模式图与主坐标轴分析

    写在前面 上周五我们分享了3月底发表的的 <水稻微生物组时间序列分析>的文章,大家对其中图绘制过程比较感兴趣.一上午收到了超30条留言,累计收到41个小伙伴的留言求精讲. 我们也争取花时间 ...

最新文章

  1. 有这么一群人,他们通过AI撬动世界!
  2. 无法打开文件“opencv_world410d.obj”
  3. 【C 语言】动态库封装与设计 ( 动态库调用环境搭建 | 创建应用 | 拷贝动态库相关文件到源码路径 | 导入头文件 | 配置动态库引用 | 调用动态库中的函数 )
  4. concat函数java_MySql中CONCAT(str1,str2,...)函数
  5. 数据库范式1NF 2NF 3NF BCNF
  6. OpenCV钻石Diamond 标记的检测
  7. ssm 异常捕获 统一处理_统一异常处理介绍及实战,看这篇就对了
  8. poi的sax模式读取xls_POI SAX 如何修改大excel 文件内容-问答-阿里云开发者社区-阿里云...
  9. 计算机主机温度,计算机的理想工作温度和湿度分别是多少
  10. Kinect v1在windows上的使用教程
  11. JS隐形数据类型转换注意事项
  12. D3DXVec3TransformCoord 函数
  13. 巨蟒django之CRM2 展示客户列表分页
  14. opecv-putText
  15. WIFI密码破解笔记
  16. 第一章:Html-超文本标记语言
  17. vr全景拍摄教程,怎样拍摄vr全景照片?
  18. 2010年3月份中国物流与采购联合会发布中国制造业采购经理指数为55.1%
  19. php guzzle,在PHP中实现使用Guzzle执行POST和GET请求
  20. 在2016年度山东省计算机技能大赛中,学院在2016年山东省职业院校技能大赛中再获佳绩...

热门文章

  1. Internet Download Manager互联网下载管理器(简称IDM)无广告弹窗,速度起飞,你值得拥有
  2. Wifi万能钥匙已经被淘汰了!Github这个开源工具太好用了!
  3. 阿里技术专家带你使用Spring框架快速搭建Web工程项目
  4. Android MVP 实例
  5. 为什么qt这么强大没人使用_浅析--懒懒口袋为什么得到这么多人的信任和使用?...
  6. Python3选择支持非ASCII码标识符的缘由
  7. 27.用webpack自搭react和vue框架
  8. 强化学习读书笔记 - 03 - 有限马尔科夫决策过程
  9. 160809312 王仲超 第四次作业
  10. bootstrap table 服务器端分页--ashx+ajax