时间序列分析工具箱——tidyquant
作者:徐瑞龙,量化分析师
博客专栏:
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
的六大理由:
直接从 Yahoo! Finance、FRED Database、Quandl 等数据源获得网络数据
简化 xts、zoo、quantmod、TTR 和 PerformanceAnalytics 中金融及时间序列函数的调用
可视化: 漂亮的主题以及针对金融的 geom(例如
geom_ma
)构建投资组合
财务分析以及投资组合归因方法
为金融与时间序列分析提供坚实的基础:
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()
可以使 xts
、zoo
和 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 = FALSE
,rollapply()
函数默认对每一列分别操作,然而我们要把所有列放在一起操作。FUN = quantile
,quantile()
正是要被滚动调用的函数。
quantile
的参数:
probs = c(0, 0.025, ...)
,计算这些概率的分位数。na.rm = TRUE
,quantile
会去掉遇到的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相关推荐
- r软件时间序列分析论文_高度比较的时间序列分析-一篇论文评论
r软件时间序列分析论文 数据科学 , 机器学习 (Data Science, Machine Learning) In machine learning with time series, using ...
- matlab在时间序列分...,matlab在时间序列分析
ATLAB的时间序列建模与预测韩路跃 ,杜行检 (西安交通大学电子与信息工程学院 ,陕西 西安 710049) 摘要 : 该文介绍了 MATLAB 系统辨识工具箱在时间序列方面的应用...... 分析 ...
- 【组队学习】【30期】时间序列分析
时间序列分析 航路开辟者:李岳昆.易远哲 领航员:王洲烽 航海士:李岳昆.易远哲 基本信息 开源内容:https://github.com/datawhalechina/team-learning-d ...
- Genome Biology:人体各部位微生物组时间序列分析Moving Pictures
人体各部位微生物组初探 Moving pictures of the human microbiome Genome Biology, [14.028] 2011-05-30 Articles DO ...
- Genome Biology:人体各部位微生物组时间序列分析
文章目录 人体各部位微生物组初探 摘要 背景 结果 结论 点评 主要结果 图1. 基于无权重UniFrac距离的PCoA 图2. 时间上的核心微生物组 图3. 群落中的成员关联 猜你喜欢 写在后面 人 ...
- 水稻微生物组时间序列分析4-随机森林回归
写在前面 哪些菌可以作为生育时间的biomarkers? 回归分析 读取文件 随机森林回归 交叉验证 feature重要性 美化feature贡献度柱状图 图4.2. 绘制时间序列热图 猜你喜欢 写在 ...
- 水稻微生物组时间序列分析3-冲击图展示时间序序列变化
写在前面 图3. 哪些菌门随时间呈现规律变化呢? 绘图实战 清空工作环境和加载包 读入实验设计.OTU表和物种注释 筛选高丰度门用于展示 数据交叉筛选 按样品绘图 按组绘图 绘制冲击图alluvium ...
- 水稻微生物组时间序列分析2b-散点图拟合
写在前面 图2. 微生物组随时间变化的规律 图2. E-F散点图拟合展示距离变化 猜你喜欢 写在后面 写在前面 之前分享了3月底发表的的 <水稻微生物组时间序列分析>的文章,大家对其中图绘 ...
- 水稻微生物组时间序列分析2a-相关分析
写在前面 图2. 微生物组随时间变化的规律 图2A-D. 相关性corrplot 猜你喜欢 写在后面 写在前面 之前分享了3月底发表的的 <水稻微生物组时间序列分析>的文章,大家对其中图绘 ...
- 水稻微生物组时间序列分析精讲1-模式图与主坐标轴分析
写在前面 上周五我们分享了3月底发表的的 <水稻微生物组时间序列分析>的文章,大家对其中图绘制过程比较感兴趣.一上午收到了超30条留言,累计收到41个小伙伴的留言求精讲. 我们也争取花时间 ...
最新文章
- 有这么一群人,他们通过AI撬动世界!
- 无法打开文件“opencv_world410d.obj”
- 【C 语言】动态库封装与设计 ( 动态库调用环境搭建 | 创建应用 | 拷贝动态库相关文件到源码路径 | 导入头文件 | 配置动态库引用 | 调用动态库中的函数 )
- concat函数java_MySql中CONCAT(str1,str2,...)函数
- 数据库范式1NF 2NF 3NF BCNF
- OpenCV钻石Diamond 标记的检测
- ssm 异常捕获 统一处理_统一异常处理介绍及实战,看这篇就对了
- poi的sax模式读取xls_POI SAX 如何修改大excel 文件内容-问答-阿里云开发者社区-阿里云...
- 计算机主机温度,计算机的理想工作温度和湿度分别是多少
- Kinect v1在windows上的使用教程
- JS隐形数据类型转换注意事项
- D3DXVec3TransformCoord 函数
- 巨蟒django之CRM2 展示客户列表分页
- opecv-putText
- WIFI密码破解笔记
- 第一章:Html-超文本标记语言
- vr全景拍摄教程,怎样拍摄vr全景照片?
- 2010年3月份中国物流与采购联合会发布中国制造业采购经理指数为55.1%
- php guzzle,在PHP中实现使用Guzzle执行POST和GET请求
- 在2016年度山东省计算机技能大赛中,学院在2016年山东省职业院校技能大赛中再获佳绩...
热门文章
- Internet Download Manager互联网下载管理器(简称IDM)无广告弹窗,速度起飞,你值得拥有
- Wifi万能钥匙已经被淘汰了!Github这个开源工具太好用了!
- 阿里技术专家带你使用Spring框架快速搭建Web工程项目
- Android MVP 实例
- 为什么qt这么强大没人使用_浅析--懒懒口袋为什么得到这么多人的信任和使用?...
- Python3选择支持非ASCII码标识符的缘由
- 27.用webpack自搭react和vue框架
- 强化学习读书笔记 - 03 - 有限马尔科夫决策过程
- 160809312 王仲超 第四次作业
- bootstrap table 服务器端分页--ashx+ajax