作者:黄天元,复旦大学博士在读,目前研究涉及文本挖掘、社交网络分析和机器学习等。希望与大家分享学习经验,推广并加深R语言在业界的应用。

邮箱:huang.tian-yuan@qq.com

之前模拟风控模型的时候,曾经想要做滑动窗口模型。因为当时我相信一个前提假设(现在也相信着):随着时间的变化,每个变量的重要程度也会改变,而它们的组合关系的重要程度也会改变,符合的模型也会变化,模型参数最优值也会变化。时间窗口的确定,需要不断地尝试。模型哪些比较好,是否需要集成模型(发现有人把基于树的叫做集成模型,那好吧...但是集成本身的概念是多模型融合决策吧...),哪些变量应该放在一起做特征工程,这些事变化过程真的是太多了,这使得水越来越深。在科学研究中,往往称之为复杂性问题,也就是很难找到一个放之四海而皆准的规则(如果有,数据挖掘工程师或将失业)。

不过再复杂的东西,都是由简单的要素构成的。越是想要追求精准,就越是要忠实于基本的东西。因此就时间变动的特征,这里使用tidyquant进行滑动窗口建模。下面先举例说明,首先用之前介绍过的tq_get来下载股票信息。下面的FB代表Facebook的股票信息,包括2016年的每日行情(OHLC)。与此同时,我们还会下载XLK数据,它是Technology Select Sector SPDR® ETF的简称,中文译作高科技指数。

类似于指数基金的一篮子股票组合,那么XLK则是针对科技股的股票组合,最后构成一个指数基金(如果说得不够准确,请猛烈抨击指正)。下面,我们要根据Facebook和XLK的行情,判断两者之间是否存在线性关系。先下载数据:

library(tidyquant)

fb_returns <- tq_get("FB", get  = "stock.prices", from = "2016-01-01", to   = "2016-12-31") %>%  tq_transmute(select = adjusted,                mutate_fun = periodReturn,                period = "weekly",                col_rename = "fb.returns")

xlk_returns <- tq_get("XLK", from = "2016-01-01", to = "2016-12-31") %>%  tq_transmute(select = adjusted,                mutate_fun = periodReturn,                period = "weekly",                col_rename = "xlk.returns")

这里在下载的同时,我们直接用tq_transmute对得到的tibble进行修饰,具体来说就是把矫正的收盘价转化为周的数据,并重新命名。看看数据是什么样子的:

 fb_returns# A tibble: 52 x 2   date       fb.returns   <date>          <dbl> 1 2016-01-08   -0.0478  2 2016-01-15   -0.0242  3 2016-01-22    0.0313  4 2016-01-29    0.146   5 2016-02-05   -0.0725  6 2016-02-12   -0.0198  7 2016-02-19    0.0251  8 2016-02-26    0.0320  9 2016-03-04    0.0043610 2016-03-11    0.00941# ... with 42 more rows

 xlk_returns# A tibble: 52 x 2   date       xlk.returns   <date>           <dbl> 1 2016-01-08    -0.0516  2 2016-01-15    -0.0187  3 2016-01-22     0.0264  4 2016-01-29     0.0213  5 2016-02-05    -0.0422  6 2016-02-12    -0.00582 7 2016-02-19     0.0354  8 2016-02-26     0.0148  9 2016-03-04     0.0281 10 2016-03-11     0.0106 # ... with 42 more rows

都是一列日期,一列周均矫正收盘价。下面把两个数据框合在一起:

returns_combined <- left_join(fb_returns, xlk_returns, by = "date")returns_combined

# A tibble: 52 x 3   date       fb.returns xlk.returns   <date>          <dbl>       <dbl> 1 2016-01-08   -0.0478     -0.0516  2 2016-01-15   -0.0242     -0.0187  3 2016-01-22    0.0313      0.0264  4 2016-01-29    0.146       0.0213  5 2016-02-05   -0.0725     -0.0422  6 2016-02-12   -0.0198     -0.00582 7 2016-02-19    0.0251      0.0354  8 2016-02-26    0.0320      0.0148  9 2016-03-04    0.00436     0.0281 10 2016-03-11    0.00941     0.0106 # ... with 42 more rows

其实用cbind或者bind_columns也是一样的,因为日期的排布是一样的。下面我们来构造模型函数,这里用的是线性回归模型:

regr_fun <- function(data) {  coef(lm(fb.returns ~ xlk.returns, data = data))}

只用了一元线性回归,因此这个函数接收一个数据框,返回值包括两个,一个是截距,一个是回归系数。这里是最需要注意的地方,如果想用其他模型,返回其他的值,那么都是在这个函数中进行设置。

下面我们进行滑窗建模:

returns_combined %>%  tq_mutate(mutate_fun = rollapply,            width      = 12,            FUN        = regr_fun,            by.column  = FALSE,            col_rename = c("coef.0", "coef.1"))

讲讲上面干了什么:首先我们用了rollapply函数,设置窗口大小为12周(width = 12)。此外,在滑动建模的时候,采用我们之前设置好的线性模型(FUN = regr_fun),返回值是两个值,因此我们对其进行重新命名(col_rename = c("coef.0", "coef.1")))。至于by.column这个参数,是询问是否对每一列都进行这个操作,是rollapply中的一个参数,这里我们显然不需要,因此设置为FALSE。不过这是看不到结果的,前10行应该都是NA,因此我们换个方法来看结果:

returns_combined %>%  tq_mutate(mutate_fun = rollapply,            width      = 12,            FUN        = regr_fun,            by.column  = FALSE,            col_rename = c("coef.0", "coef.1")) %>%   print(n = 20)

# A tibble: 52 x 5   date       fb.returns xlk.returns    coef.0    coef.1   <date>          <dbl>       <dbl>     <dbl>     <dbl> 1 2016-01-08   -0.0478    -0.0516    NA        NA       2 2016-01-15   -0.0242    -0.0187    NA        NA       3 2016-01-22    0.0313     0.0264    NA        NA       4 2016-01-29    0.146      0.0213    NA        NA       5 2016-02-05   -0.0725    -0.0422    NA        NA       6 2016-02-12   -0.0198    -0.00582   NA        NA       7 2016-02-19    0.0251     0.0354    NA        NA       8 2016-02-26    0.0320     0.0148    NA        NA       9 2016-03-04    0.00436    0.0281    NA        NA      10 2016-03-11    0.00941    0.0106    NA        NA      11 2016-03-18    0.0186     0.0219    NA        NA      12 2016-03-24    0.0144     0.000688   0.00514   1.34   13 2016-04-01    0.0266     0.0248     0.00143   1.48   14 2016-04-08   -0.0468    -0.0181    -0.00167   1.60   15 2016-04-15   -0.00895    0.0103    -0.00307   1.62   16 2016-04-22    0.00839   -0.0203    -0.00632   1.11   17 2016-04-29    0.0635    -0.0302     0.00972   0.142  18 2016-05-06    0.0162     0.00285    0.0132    0.0601 19 2016-05-13    0.00268   -0.000947   0.0117   -0.0085320 2016-05-20   -0.0205     0.0123     0.00783  -0.145  # ... with 32 more rows

要求显示20行,我们发现,数据从第12周开始有。也就是说,自第12周开始,每次用包含当前周在内的前12周的数据构建回归模型,计算得到的模型参数附加在后面。

我们发现,在使用tq_mutate系列的时候,一般是使用select来告诉计算机我们要对那一列进行函数的处理。但是有两个参数的时候怎么办?可以考虑使用下面的函数:

FANG %>%    group_by(symbol) %>%    tq_mutate_xy(x = close, y = volume,                  mutate_fun = EVWMA, col_rename = "EVWMA")

# A tibble: 4,032 x 9# Groups:   symbol [4]   symbol date        open  high   low close    volume adjusted EVWMA   <chr>  <date>     <dbl> <dbl> <dbl> <dbl>     <dbl>    <dbl> <dbl> 1 FB     2013-01-02  27.4  28.2  27.4  28    69846400     28    NA   2 FB     2013-01-03  27.9  28.5  27.6  27.8  63140600     27.8  NA   3 FB     2013-01-04  28.0  28.9  27.8  28.8  72715400     28.8  NA   4 FB     2013-01-07  28.7  29.8  28.6  29.4  83781800     29.4  NA   5 FB     2013-01-08  29.5  29.6  28.9  29.1  45871300     29.1  NA   6 FB     2013-01-09  29.7  30.6  29.5  30.6 104787700     30.6  NA   7 FB     2013-01-10  30.6  31.5  30.3  31.3  95316400     31.3  NA   8 FB     2013-01-11  31.3  32.0  31.1  31.7  89598000     31.7  NA   9 FB     2013-01-14  32.1  32.2  30.6  31.0  98892800     31.0  NA  10 FB     2013-01-15  30.6  31.7  29.9  30.1 173242600     30.1  30.1# ... with 4,022 more rows

EVWMA这个函数接受两个参数,它会把x和y作为这个函数的前两个参数,然后进行计算,最后得到的结果保存在EVWMA列中。

简单介绍一下EVWMA:Elastic Volume Weighted Moving Average,弹性成交量加权移动平均线指标。

它是每股价格的逼近,而R中这个函数默认的时间窗口为10。

——————————————

往期精彩:

  • 今天,我改名了!

  • Oracle裁员补偿N+6,员工仍不满意,为何?

  • 被嫌弃的程序员的一生

R语言金融基础:tidyquant数据整理(滑窗建模)相关推荐

  1. 第4章 R语言编程基础——数据整理与预处理

    目录 4.1 经济/金融数据库 4.1.1 金融数据与数据库 4.1.2 国外金融数据库概况 4.1.3 国内金融数据库概况 4.1.4 数据的主要内容 4.2 数据格式 4.3 数据的导入 4.3. ...

  2. r语言quantmond_R语言金融基础:tidyquant数据整理(滑窗建模)

    原标题:R语言金融基础:tidyquant数据整理(滑窗建模) 作者:黄天元,复旦大学博士在读,目前研究涉及文本挖掘.社交网络分析和机器学习等.希望与大家分享学习经验,推广并加深R语言在业界的应用. ...

  3. R语言使用tidyquant包的tq_transmute函数计算持有某只股票的天、月、周收益率、ggplot2使用条形图(bar plot)可视化股票年收益率数据使用不同的色彩表征正收益率和负收益率

    R语言使用tidyquant包的tq_transmute函数计算持有某只股票的天.月.周收益率.ggplot2使用条形图(bar plot)可视化股票年收益率数据使用不同的色彩表征正收益率和负收益率( ...

  4. R语言处理表格数据(一)

    目录 写在前面 1. Excel有上百列数据,把每列数据首尾相接合并成一个向量(一列) 2. 合并多个数据表(.csv) 3. 实现2个Excel表相同数据的关联,并提取相同数据到新表 4. 获取Ex ...

  5. R语言把dataframe数据转化为tibble格式、查看每个数据列的缺失值个数、使用数据列的均值对数据列的缺失值进行填充

    R语言把dataframe数据转化为tibble格式.查看每个数据列的缺失值个数.使用数据列的均值对数据列的缺失值进行填充 目录

  6. R语言进行dataframe数据内连接(Inner join):使用R原生方法、data.table、dplyr等方案

    R语言进行dataframe数据内连接(Inner join):使用R原生方法.data.table.dplyr等方案 目录 R语言进行dataframe数据内连接(Inner join):使用R原生 ...

  7. R语言可视化dataframe数据、并自定义设置坐标轴各个标签使用不同的色彩

    R语言可视化dataframe数据.并自定义设置坐标轴各个标签使用不同的色彩 目录 R语言可视化dataframe数据.并自定义设置坐标轴各个标签使用不同的色彩

  8. R语言ggplot2可视化数据点注释、标签显示不全、发生边界截断问题解决实战

    R语言ggplot2可视化数据点注释.标签显示不全.发生边界截断问题解决实战 目录 R语言ggplot2

  9. R语言进行dataframe数据左连接(Left join):使用R原生方法、data.table、dplyr等方案

    R语言进行dataframe数据左连接(Left join):使用R原生方法.data.table.dplyr等方案 目录 R语言进行dataframe数据左连接(Left join):使用R原生方法 ...

  10. R语言将dataframe数据从宽表(wide)变为长表(long)实战:tidyr包的gather函数、cdata包的unpivot_to_blocks函数、data.table使用melt函数

    R语言将dataframe数据从宽表(wide)变为长表(long)实战:tidyr包的gather函数.cdata包的unpivot_to_blocks函数.data.table使用melt函数 目 ...

最新文章

  1. Pandas_transform的用法
  2. python使用matplotlib可视化、使用subplots函数将可视化的画布划分为网格状的若干子区、通过nrows和ncols参数设置设置行数和列数
  3. [Diary][pic]毕业聚餐-笑容灿烂
  4. IE, FireFox, Opera 浏览器支持CSS实现Alpha半透明的方法
  5. win7硬件要求_电脑硬件运行游戏测评
  6. 日常生活中怎样利用计算机的,数据存储与管理在日常生活中的三种方式
  7. Java代码计算一元二次方程
  8. 【Java学习笔记之二十六】深入理解Java匿名内部类
  9. 解决 No module named PyQt5.QtWebKitWidgets
  10. python装饰器Decorators
  11. Entity Framework 实践系列 —— 搞好关系 - 两情相悦(双向一对一)
  12. 【转】Sobel 算子
  13. 金融发展在经济结构调整中的重要作用
  14. linux编程:pthread
  15. vba 输出文本 m linux,VBA使用FileSystemObject将读取或写入文本文件(一)
  16. Computer programming and database - 方方面面入门
  17. Java Cryptography
  18. 计算计算机系统包括哪些内容,什么是MIPS计算机系统的运算器
  19. html做键盘,用html+js+css做一个模拟键盘
  20. 机顶盒开发助手Tvbox

热门文章

  1. init与clinit 与 类的初始化顺序
  2. inux快速修改文件夹及文件下所有文件与文件夹权限
  3. MySQL 亿级数据分页的优化
  4. Spring,SpringMVC,SpringBoot,SpringCloud有什么区别和联系?
  5. 你还在用 BeanUtils?试试 MapStruct,优雅的对象转换解决方案!
  6. 点击搜索到获得结果之间的零点几秒 都发生了什么?
  7. HTTPS性能优化实践
  8. 有时候,拒绝是为了更好的未来
  9. 「福利」Java Swing 编写的可视化算法工程,包含树、图和排序
  10. iOS最好用的弹出框