r - 如何使用 R 中的每日回报计算过去 12 个月滑动窗口的滚动偏度?
问题描述
我有一个包含日期的列的股票每日回报,格式为 dd-mm-yy。我想使用 R 根据其过去 12 个月的每日回报计算一个月的偏度。 数据看起来像这样
例如:如果有两家公司从 2001 年 1 月 1 日到 2003 年 12 月 31 日的每日回报,那么我想找出每家公司从 2002 年 1 月开始的偏度。
- 2002 年 1 月的偏度:基于过去 12 个月的每日回报,即 2001 年 1 月 1 日至 2001 年 12 月 31 日。
- 2002 年 2 月的偏度:基于过去 12 个月的每日回报,即 2001 年 2 月 1 日至 2001 年 1 月 31 日。
以此类推,每月滚动,滑动窗口宽度为 12 个月。
注意:有一个问题,因为过去 12 个月的天数不是 365。因为股票收益仅针对交易日(不包括周六、周日和任何节假日)。每个月的交易日都是动态的。我想要从日期中提取月份并计算过去 12 个月的东西。也许像基于月份的分组和聚合尾随的 12 组。
set.seed(1)
df<-data.frame(Date=seq(as.Date("2001-01-01"), as.Date("2003-12-31"), by="days"), Company1=rnorm(1095,0,1), Company2=rnorm(1095,0,1))
输入数据:
Date Company1 Company2
1 2001-01-01 0.046787710 0.21631639
2 2001-01-02 1.007350200 0.88959702
3 2001-01-03 -0.585340438 -1.10898367
4 2001-01-04 2.359564501 -0.62665947
5 2001-01-05 -0.258663440 1.80257433
6 2001-01-06 0.289608127 -3.08371338
7 2001-01-07 0.269705937 0.13092761
8 2001-01-08 -2.076263400 0.36424857
9 2001-01-09 0.752956413 -0.01024824
10 2001-01-10 -0.297581215 0.62589751
11 2001-01-11 0.439587229 -0.48158102
12 2001-01-12 -0.700782594 0.13597666
13 2001-01-13 -0.083560736 0.03184570
14 2001-01-14 0.883048949 0.17284243
15 2001-01-15 0.201498921 -0.64059292
16 2001-01-16 0.591389036 -1.19668946
17 2001-01-17 0.774895061 -0.66963705
18 2001-01-18 1.663075216 0.32016246
19 2001-01-19 -0.713455482 -1.42976017
20 2001-01-20 1.809244713 1.85308653
21 2001-01-21 0.358761796 -0.87284478
22 2001-01-22 -0.192799009 -0.14865949
23 2001-01-23 -0.126879244 -1.44882295
24 2001-01-24 -0.888239162 1.17851064
25 2001-01-25 1.139707845 0.22734274
26 2001-01-26 0.236909406 -1.12476606
27 2001-01-27 0.281275148 0.14908310
28 2001-01-28 -0.404590422 -0.78850844
29 2001-01-29 0.573109940 1.32003315
30 2001-01-30 -2.014078486 -0.36894095
31 2001-01-31 -1.438956369 1.06879518
32 2001-02-01 2.067691040 -0.74283474
33 2001-02-02 0.195995947 1.39753672
34 2001-02-03 -0.582291845 0.21987888
35 2001-02-04 -0.462393447 -1.14957969
36 2001-02-05 0.145901137 0.57741057
37 2001-02-06 -0.358606042 -1.06126753
38 2001-02-07 -1.184867338 -0.85388016
39 2001-02-08 -1.331819366 -0.06583488
40 2001-02-09 -0.284243432 1.24550387
41 2001-02-10 1.625322326 -0.34987800
42 2001-02-11 -1.115882265 0.54337237
43 2001-02-12 0.379784066 0.57215836
44 2001-02-13 -0.643792275 -0.59830689
45 2001-02-14 0.271188752 1.29537846
46 2001-02-15 -0.171287972 0.55311033
47 2001-02-16 -0.847849267 -1.35727918
48 2001-02-17 1.935119202 0.68036412
49 2001-02-18 0.171950923 1.02874683
50 2001-02-19 -1.458405950 0.32483905
51 2001-02-20 1.042342330 -1.61234419
52 2001-02-21 0.206411454 -0.08980562
53 2001-02-22 0.116044124 -0.75188707
54 2001-02-23 -0.080576867 -0.27822619
55 2001-02-24 -0.217406783 -0.48112626
56 2001-02-25 -0.042067201 -0.50870525
57 2001-02-26 -0.034464590 0.46473191
58 2001-02-27 0.277544111 -0.98551626
59 2001-02-28 -0.535228414 1.78895267
偏度函数:
skewness<-function(x)
{
m3<-mean((x-mean(x))^3)
skewness<-m3/(sd(x)^3)
skewness
}
输出类似:
Month Company1 Company2
Jan2002 Skewness(Jan2001:Dec2001) Skewness(Jan2001:Dec2001)
Feb2002 Skewness(Feb2001:Jan2002) Skewness(Feb2001:Jan2002)
Mar2002 Skewness(Mar2001:Feb2002) Skewness(Mar2001:Feb2002)
解决方案
您可以使用任何函数作为包中slide_*
函数的参数slider
。以下代码计算您提供的示例数据集的 365 天滚动偏度。
library(dplyr) # for group_by and pipe
library(tidyr) # for pivot_*
library(slider) # for rolling window functions
library(moments) # for skewness function
df<-data.frame(Date=seq(as.Date("2001-01-01"), as.Date("2003-12-31"), by="days"), Company1=rnorm(1095,0,1), Company2=rnorm(1095,0,1))
df %>%
pivot_longer(-Date, names_to="Company", values_to="X") %>%
group_by(Company) %>%
arrange(Date) %>%
mutate(
rollskew = slide_dbl(X, moments::skewness, .before=365, .complete=TRUE)
) %>%
ungroup() %>%
pivot_wider(names_from = Company, values_from = c(X, rollskew)) %>%
tail(12)
将输出
# A tibble: 12 x 5
Date X_Company1 X_Company2 rollskew_Company1 rollskew_Company2
<date> <dbl> <dbl> <dbl> <dbl>
1 2003-12-20 0.599 0.663 0.211 -0.153
2 2003-12-21 1.13 0.457 0.204 -0.163
3 2003-12-22 -0.802 -1.14 0.210 -0.159
4 2003-12-23 1.78 1.45 0.205 -0.165
5 2003-12-24 0.916 -0.879 0.205 -0.141
6 2003-12-25 -1.60 -0.259 0.208 -0.136
7 2003-12-26 -1.12 0.914 0.208 -0.144
8 2003-12-27 -0.404 -0.319 0.212 -0.147
9 2003-12-28 0.461 -1.51 0.208 -0.147
10 2003-12-29 -0.436 1.68 0.207 -0.140
11 2003-12-30 -1.74 0.657 0.203 -0.148
12 2003-12-31 -0.119 0.228 0.209 -0.156
推荐阅读
- javascript - 静态 iframe 预览
- c++ - 逗号运算符如何与 C++ 中的 cout 一起使用?
- r - xy.coords(x, y) 中的错误:“x”和“y”长度不同的图表。PerformanceSummary R XTS
- javascript - npm 全局包:从包中引用内容文件
- python - python bokeh:在密码保护的仪表板中添加/更改子项时交互丢失。
- css - 样式化 jQuery UI 对话框标题?
- c - 通过将 char 转换为 USHORT 来获取错误的 UTF-8 值
- ruby-on-rails - Graphql没有在Rails中返回关联对象
- css - 防止 rgba 背景重叠
- python-3.x - 为什么我的分类器不适用于新数据(未作为数据集的数据)?