http://www.web008.net

时间序列分析工具箱

目录

目录

  • 时间序列分析工具箱——tibbletime
    • tibbletime 的用途
    • 加载包
    • 数据
    • 教程:tibbletime
      • 初始化一个 tbl_time 对象
      • 时间序列函数
  • 时间序列分析工具箱——timetk
    • timetk 的主要用途
    • 加载包
    • 数据
    • timetk 教程:
      • PART 1:时间序列机器学习
      • PART 2:转换

翻译自《Demo Week: Tidy Time Series Analysis with tibbletime》

原文链接:www.business-science.io/code-tools/2017/10/26/demo_week_tibbletime.html

注意:由于软件包的版本变化,部分代码被修改,文字有删减

翻译自《Demo Week: Time Series Machine Learning with timetk》

原文链接:www.business-science.io/code-tools/2017/10/24/demo_week_timetk.html

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

美高梅163888 1

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

美高梅163888 2

tibbletime 的用途

  1. tidy 时间序列分析的未来:基于 tbl 的新类——tbl_time,为 tibble 对象添加时间轴,赋予处理时间的能力。
  2. 时间序列函数:为 tbl_time 对象专门设计的一系列函数,例如:
    • filter_time():根据日期简便快捷地过滤一个 tbl_time 对象。
    • as_period():转换时间周期(例如月度变为年度),让用户能将数据聚合到低粒度水平上。
    • time_collapse():当使用 time_collapse 时,tbl_time 对象中落入相同周期的索引将被修改成相同的日期。
    • rollify():修改一个函数,使其能够在特定时间区间上计算一个或一组值。可以用来计算滚动均值,或其他 tidyverse 框架下的滚动计算。
    • create_series():根据规则时间序列,用简化标记快速初始化一个带有 datetbl_time 对象。

timetk 的主要用途

三个主要用途:

  1. 时间序列机器学习:使用回归算法进行预测;
  2. 构造时间序列索引:基于时间模式提取、探索和扩展时间序列索引;
  3. 转换不同类型的时间序列数据(例如 tblxtszoots 之间):轻松实现不同类型的时间序列数据之间的相互转换。

我们今天将讨论时间序列机器学习和数据类型转换。第二个议题(提取和构造未来时间序列)将在时间序列机器学习中涉及,因为这对预测准确性非常关键。

加载包

tibbletime 目前还在活跃开发阶段,可以用常规方法安装,也可以借助 devtools 从 github 上安装最新开发版。

# Get tibbletime version with latest features
devtools::install_github("business-science/tibbletime")

安装完成后,加载下面的包:

  • tibbletime:创建带时间轴的 tibble美高梅163888, 对象,可以使用 tbl_time 函数。
  • tidyquant:加载 tidyverse 框架,用 tq_get() 获取数据。
# Load libraries
library(tibbletime) # Version: 0.1.1, Future of tidy time series analysis
library(tidyquant)  # Loads tidyverse, tq_get()

加载包

需要加在两个包:

  • tidyquant:用于获取数据并在后台加载 tidyverse
  • timetk:R 中用于处理时间序列的工具包

如果还没有安装过,请用下面的命令安装:

# Install packagesinstall.packagesinstall.packages("tidyquant")

加载包。

# Load librarieslibrary     # Toolkit for working with time series in Rlibrary(tidyquant)  # Loads tidyverse, financial pkgs, used to get data

数据

tq_get() 下载 FANG(脸书、亚马逊、网飞、谷歌)每天的股票价格。

# Stock Prices from Yahoo! Finance
FANG_symbols <- c("FB", "AMZN", "NFLX", "GOOG")

FANG_tbl_d <- FANG_symbols %>%
    tq_get(
        get = "stock.prices",
        from = "2014-01-01",
        to = "2016-12-31") 

FANG_tbl_d <- FANG_tbl_d %>%
    group_by(symbol)

FANG_tbl_d

## # A tibble: 3,024 x 8
## # Groups:   symbol [4]
##    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 对象,它通过指定数据框、x、y 和 group(如果存在)等要素来创建根据“symbol”分块的信息图。

# Setup plotting function that can be reused later
ggplot_facet_by_symbol <- function(data,
                                   mapping)
{
    if (is.null(mapping$group))
    {
        # No groups
        g <- data %>%
            ggplot(
                mapping = mapping) +
            labs(x = quo_name(mapping$x),
                 y = quo_name(mapping$y))
    }
    else
    {
        # Deal with groups
        g <- data %>%
            ggplot(
                mapping = mapping)  +
            labs(x = quo_name(mapping$x),
                 y = quo_name(mapping$y),
                 group = quo_name(mapping$group))
    }

    # Add faceting and theme
    g <- g +
        geom_line() +
        facet_wrap(
            ~ symbol, ncol = 2, scales = "free_y") +
        scale_color_tq() +
        theme_tq()

    return(g)
}

我们可以使用绘图函数 ggplot_facet_by_symbol 快速可视化我们的数据。让我们看一下“除权调整的”股票价格。

# Plot adjusted vs date
FANG_tbl_d %>%
    ggplot_facet_by_symbol(
        mapping = aes(
            x = date, y = adjusted, color = symbol)) +
    labs(
        title = "FANG Stocks: Adjusted Prices 2014 through 2016")

美高梅163888 3

上图所显示就是我们要处理的数据,下面让我们进入 tibbletime 的教程。

数据

我们将使用 tidyquant 中的 tq_get() 函数从 FRED 获取数据——啤酒、葡萄酒和蒸馏酒销售数据。

# Beer, Wine, Distilled Alcoholic Beverages, in Millions USDbeer_sales_tbl <- tq_get(    "S4248SM144NCEN",    get = "economic.data",    from = "2010-01-01",    to = "2016-12-31")beer_sales_tbl

## # A tibble: 84 x 2##          date price##        <date> <int>##  1 2010-01-01  6558##  2 2010-02-01  7481##  3 2010-03-01  9475##  4 2010-04-01  9424##  5 2010-05-01  9351##  6 2010-06-01 10552##  7 2010-07-01  9077##  8 2010-08-01  9273##  9 2010-09-01  9420## 10 2010-10-01  9413## # ... with 74 more rows

可视化数据是一个好东西,这有助于帮助我们了解正在使用的是什么数据。可视化对于时间序列分析和预测尤为重要。我们将使用 tidyquant 画图工具:主要是用 geom_ma(ma_fun = SMA,n = 12) 来添加一个周期为 12 的简单移动平均线来了解趋势。我们还可以看到似乎同时存在着趋势性(移动平均线以近似线性的模式增长)和季节性(波峰和波谷倾向于在特定月份发生)。

# Plot Beer Salesbeer_sales_tbl %>%    ggplot(aes(date, price)) +    geom_line(col = palette_light +    geom_point(col = palette_light +    geom_ma(ma_fun = SMA, n = 12, size = 1) +    theme_tq() +    scale_x_date(date_breaks = "1 year", date_labels = "%Y") +    labs(title = "Beer Sales: 2007 through 2016")

美高梅163888 4

现在你对我们要分析的时间序列有了直观的感受,那么让我们继续!

教程:tibbletime

本教程将介绍下列函数的用法:

  • filter_time:对时间索引的过滤
  • as_period:改变数据的周期
  • rollify:将任意函数转换成为滚动函数

timetk 教程:

教程分为两部分。首先,我们将遵循时间序列机器学习的工作流程。其次,我们将介绍数据转换工具。

初始化一个 tbl_time 对象

在我们使用这些新函数之前,我们需要创建一个 tbl_time 对象。新类的操作几乎与普通的 tibble 对象相同。然而,它会在背后自动跟踪时间信息。

使用 as_tbl_time() 函数初始化对象。指定 index = date,这告诉 tbl_time 对象要跟踪哪个索引。

# Convert to tbl_time
FANG_tbl_time_d <- FANG_tbl_d %>%
    as_tbl_time(index = date) 

我们可以打印 tbl_time 对象。看起来几乎与分组的 tibble 相同。请注意,“Index: date”通知我们“time tibble”已正确初始化。

# Show the tbl_time object we created
FANG_tbl_time_d

## # A time tibble: 3,024 x 8
## # Index:  date
## # Groups: symbol [4]
##    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

我们可以使用绘图函数 ggplot_facet_by_symbol() 绘制它,我们看到 tbl_time 对象与 tbl 对象的反应相同。

# Plot the tbl_time object
FANG_tbl_time_d %>%
    ggplot_facet_by_symbol(
        mapping = aes(
            x = date, y = adjusted, color = symbol)) +
    labs(
        title = "Working with tbltime: Reacts same as tbl class")

美高梅163888 5

PART 1:时间序列机器学习

时间序列机器学习是预测时间序列数据的一种很好的方法,但在我们开始之前,这里有几个注意点:

  • 关键洞察力:将时间序列签名(时间戳信息按列扩展到特征集)用于执行机器学习。
  • 目标:我们将使用时间序列签名预测未来 12 个月的时间序列数据。

我们将遵循可用于执行时间序列机器学习的工作流程。你将看到几个 timetk 函数如何帮助完成此过程。我们将使用简单的 lm() 线性回归进行机器学习,你将看到使用时间序列签名会使机器学习更强大和准确。此外,你还应该考虑使用其他更强大的机器学习算法,例如 xgboostglmnet等。

郑重声明:本文版权归美高梅163888所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。