楼主: cheetahfly
2629 4

[学习分享] 从ts类向tibble类的转变(之二),时间类tibble数据的数据清洗 [推广有奖]

  • 2关注
  • 72粉丝

版主

已卖:1份资源

院士

11%

还不是VIP/贵宾

-

威望
0
论坛币
64169 个
通用积分
1679.3423
学术水平
489 点
热心指数
598 点
信用等级
336 点
经验
127454 点
帖子
2099
精华
1
在线时间
3991 小时
注册时间
2010-10-27
最后登录
2026-2-7

楼主
cheetahfly 在职认证  发表于 2018-2-28 14:48:40 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
时间类型的tibble类数据,数据清洗与一般的tibble数据会有不同,我们可以用不同的packages来尝试一下:
【数据】
选取深圳综指300106.SZ的18年2月22/23日的高频数据(tick级),可下载 i106.rar (84.01 KB) 本附件包括:
  • i106.RData
,但仅用于学习和练习之用,勿做任何商业用途。
  1. # SETUP
  2. library(tidyverse)

  3. # load data
  4. load("i106.RData")

  5. i106 %>%
  6.   tbl_df() %>%
  7.   head(3)

  8. #> datetime        close        volume
  9. #2018-02-22 09:25:03        1754.307         155945300
  10. #2018-02-22 09:30:00        1754.148         12515800
  11. #2018-02-22 09:30:03        1756.871         116001200
复制代码
【用tidyquant包】
  1. library(tidyquant)

  2. # 变为分钟的价格数据
  3. i106 %>%
  4.   tq_transmute(select = close, mutate = to.minutes) %>%
  5.   head(3)
  6. #>      datetime        close
  7. #2018-02-22 09:25:03        1754.307
  8. #2018-02-22 09:30:57        1758.003
  9. #2018-02-22 09:31:57        1755.187

  10. # 变成日算数收益率的数据
  11. i106 %>%
  12.   tq_transmute(select = close,
  13.                mutate_fun = periodReturn,
  14.                period = "daily",
  15.                type   = "arithmetic")
  16. #>      datetime        daily.returns
  17. #2018-02-22 15:00:03        0.010066826
  18. #2018-02-23 15:00:03        0.001806975

  19. # 增加MACD指标数据
  20. i106 %>%
  21.   tq_mutate(select     = close,
  22.             mutate_fun = MACD,
  23.             col_rename = c("MACD", "Signal")) %>%
  24.   tail(3)
  25. #>      datetime        close        volume        MACD        Signal
  26. #2018-02-23 14:57:00        1774.756         7101900         0.009579118         0.008594071
  27. #2018-02-23 14:57:03        1774.770         1073700         0.009929062         0.008861070
  28. #2018-02-23 15:00:03        1775.169         219719500         0.011883175         0.009465491
复制代码
【用tibbletime包(0.0.2版本)】
  1. library(tibbletime)  #要手动安装0.0.2版本的,最新的0.1.1版不好用

  2. # 按照每45秒一次的数据
  3. i106 %>%
  4.     as_tbl_time(index = datetime) %>%
  5.     as_period(45~second) %>%
  6.     slice(1:5)
  7. # A time tibble: 5 x 3
  8. # Index: datetime
  9. #  datetime            close     volume
  10. #* <dttm>              <dbl>      <dbl>
  11. #1 2018-02-22 09:25:03 1754. 155945300.
  12. #2 2018-02-22 09:30:00 1754.  12515800.
  13. #3 2018-02-22 09:30:18 1758.   8272000.
  14. #4 2018-02-22 09:31:03 1758.  10190700.
  15. #5 2018-02-22 09:31:48 1755.  10640000.

  16. # 变成每45秒一次的K线数据
  17. i106 %>%
  18.     as_tbl_time(index = datetime) %>%
  19.     time_collapse(period = 45~second) %>%
  20.     group_by(datetime) %>%
  21.     summarise(open  = first(close),
  22.               high  = max(close),
  23.               low   = min(close),
  24.               close = last(close)) %>%
  25.     slice(1:5)
  26. # A time tibble: 5 x 5
  27. # Index: datetime
  28. #  datetime             open  high   low close
  29. #* <dttm>              <dbl> <dbl> <dbl> <dbl>
  30. #1 2018-02-22 09:25:03 1754. 1754. 1754. 1754.
  31. #2 2018-02-22 09:30:15 1754. 1758. 1754. 1758.
  32. #3 2018-02-22 09:31:00 1758. 1759. 1758. 1758.
  33. #4 2018-02-22 09:31:45 1758. 1758. 1756. 1756.
  34. #5 2018-02-22 09:32:30 1755. 1756. 1754. 1754.

  35. # 对数据做滚动总结
  36. # 先编写需要计算的函数
  37. summary_df <- function(x) {
  38.     data.frame(rolled_summary_type = c("mean", "sd", "min", "max", "median"),
  39.                rolled_summary_val = c(mean(x), sd(x), min(x), max(x), median(x)))
  40. }

  41. # 再变成rolling的版本
  42. rolling_summary <- rollify(~summary_df(.x), window = 5, unlist = FALSE)

  43. i106 %>%
  44.     mutate(summary_list_col = rolling_summary(close)) %>%
  45.     filter(!is.na(summary_list_col)) %>%
  46.     unnest()
  47. ## A tibble: 47,440 x 5
  48. #   datetime            close    volume rolled_summary_type rolled_summary_val
  49. #   <dttm>              <dbl>     <dbl> <fct>                            <dbl>
  50. # 1 2018-02-22 09:30:09 1758. 10882600. mean                           1756.  
  51. # 2 2018-02-22 09:30:09 1758. 10882600. sd                                1.75
  52. # 3 2018-02-22 09:30:09 1758. 10882600. min                            1754.  
  53. # 4 2018-02-22 09:30:09 1758. 10882600. max                            1758.  
  54. # 5 2018-02-22 09:30:09 1758. 10882600. median                         1757.  
  55. # 6 2018-02-22 09:30:12 1758.  8906900. mean                           1757.  
  56. # 7 2018-02-22 09:30:12 1758.  8906900. sd                                1.56
  57. # 8 2018-02-22 09:30:12 1758.  8906900. min                            1754.  
  58. # 9 2018-02-22 09:30:12 1758.  8906900. max                            1758.  
  59. # 10 2018-02-22 09:30:12 1758.  8906900. median                         1757.  
  60. # ... with 47,430 more rows
复制代码
【小结】
  • tidyquant包的优点是,从quantmod,TTR,xts等包转移过来的成本较小,对于熟悉这些包的同学是福音,缺点就是函数比较规范化,比较难做个性化的数据操纵——类似我们在第二个例子中做的每隔45秒做一次切面的做法。
  • tibbletime包可以满足较多个性化的数据清洗,但是版本还不太稳定,且做Rolling计算时,速度较慢,还需要等待其逐渐完善。



二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝


沙发
hifinecon 发表于 2018-7-18 08:55:19
sequel of first one, learn a lot from this, thank you very much, looking forward to part 3 and more!

藤椅
世纪末の魔术师 发表于 2018-7-22 13:29:56
多谢楼主分享

板凳
啊啊啊啊啊吖 发表于 2018-7-31 11:48:46
感激!!太及时了

报纸
jgchen1966 发表于 2018-7-31 20:45:43
  若仅仅做 无时间空隙(如上证指数)的时间序列简单统计值滚动计算,用tibble 与 RcppRoll  更合适更快。。

  但象PerformanceAnalytics中上百个统计值,在二三千支股票(个股因常停牌,有时间空隙)的二十多年中,同时做特定日期多年滚动计算,tibbletime ,tidyquant都不好用,太慢太慢了,估计要好几天,才能做完。。但仅仅巧用 tidyvers即可。。

   

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-2-7 23:08