计算任何一对股票的相关性
Calculate correlation of any pair of stocks
我想获得每对股票每月 returns 之间的相关性...
让我向您展示我的数据的简单版本:
> head(x, 20)
# A tibble: 20 x 4
PERMNO date COMNAM RET
<int> <int> <chr> <dbl>
1 10107 20160129 MICROSOFT CORP -0.007030
2 10107 20160229 MICROSOFT CORP -0.069886
3 10107 20160331 MICROSOFT CORP 0.085495
4 10107 20160429 MICROSOFT CORP -0.097049
5 10107 20160531 MICROSOFT CORP 0.069982
6 10107 20160630 MICROSOFT CORP -0.034528
7 10107 20160729 MICROSOFT CORP 0.107680
8 10107 20160831 MICROSOFT CORP 0.020113
9 10107 20160930 MICROSOFT CORP 0.002436
10 10107 20161031 MICROSOFT CORP 0.040278
11 10107 20161130 MICROSOFT CORP 0.012183
12 10107 20161230 MICROSOFT CORP 0.031198
13 14593 20160129 APPLE INC -0.075242
14 14593 20160229 APPLE INC -0.001335
15 14593 20160331 APPLE INC 0.127211
16 14593 20160429 APPLE INC -0.139921
17 14593 20160531 APPLE INC 0.071368
18 14593 20160630 APPLE INC -0.042660
19 14593 20160729 APPLE INC 0.090063
20 14593 20160831 APPLE INC 0.023606
理想情况下,我希望对数据中的成对股票(Microsoft 和 Apple、Microsoft 和 Costco 等)进行相关度量
将您的数据转换为 returns 的数据框,其列标题是公司名称,您应该能够将其传递给 cor
函数。例如,如果您的数据框名为 df
,您可以使用 dplyr
和 tidyr
库:
df1 = dplyr::select(df, date, COMNAM, RET)
df2 = dplyr::select(tidyr::spread(df1, key = COMNAM, value = RET), -date)
answer = cor(df2, use = "pairwise.complete.obs")
我清理了您的数据,因此 COMNAM
只是 multi-word 公司名称的第一个词。这是我得到的输出:
> answer
APPLE MICROSOFT
APPLE 1.0000000 0.8763755
MICROSOFT 0.8763755 1.0000000
这是一个更完整的示例,可能会为执行此类分析and/or where/how 获取数据的新想法打开一些大门:
library(quantmod)
library(tidyverse)
library(lubridate)
symbols <- c("AAPL", "MSFT", "GOOG")
getSymbols(symbols)
stocks <- data.frame(as.xts(merge(AAPL, MSFT, GOOG)))
stocks$date <- row.names(stocks)
row.names(stocks) <- NULL
# head(stocks)
jan31 <- ymd("2016-01-31")
days_to_keep <- jan31 %m+% months(0:11)
# days_to_keep
res <- stocks %>%
select(ends_with("Close"), date) %>%
mutate(date = ymd(date)) %>%
filter(date %in% days_to_keep)
res %>% select(-date) %>% cor()
# AAPL.Close MSFT.Close GOOG.Close
# AAPL.Close 1.0000000 0.9198357 0.9313001
# MSFT.Close 0.9198357 1.0000000 0.9103830
# GOOG.Close 0.9313001 0.9103830 1.0000000
# Or more visually...
res %>% select(-date) %>% pairs()
我想获得每对股票每月 returns 之间的相关性...
让我向您展示我的数据的简单版本:
> head(x, 20)
# A tibble: 20 x 4
PERMNO date COMNAM RET
<int> <int> <chr> <dbl>
1 10107 20160129 MICROSOFT CORP -0.007030
2 10107 20160229 MICROSOFT CORP -0.069886
3 10107 20160331 MICROSOFT CORP 0.085495
4 10107 20160429 MICROSOFT CORP -0.097049
5 10107 20160531 MICROSOFT CORP 0.069982
6 10107 20160630 MICROSOFT CORP -0.034528
7 10107 20160729 MICROSOFT CORP 0.107680
8 10107 20160831 MICROSOFT CORP 0.020113
9 10107 20160930 MICROSOFT CORP 0.002436
10 10107 20161031 MICROSOFT CORP 0.040278
11 10107 20161130 MICROSOFT CORP 0.012183
12 10107 20161230 MICROSOFT CORP 0.031198
13 14593 20160129 APPLE INC -0.075242
14 14593 20160229 APPLE INC -0.001335
15 14593 20160331 APPLE INC 0.127211
16 14593 20160429 APPLE INC -0.139921
17 14593 20160531 APPLE INC 0.071368
18 14593 20160630 APPLE INC -0.042660
19 14593 20160729 APPLE INC 0.090063
20 14593 20160831 APPLE INC 0.023606
理想情况下,我希望对数据中的成对股票(Microsoft 和 Apple、Microsoft 和 Costco 等)进行相关度量
将您的数据转换为 returns 的数据框,其列标题是公司名称,您应该能够将其传递给 cor
函数。例如,如果您的数据框名为 df
,您可以使用 dplyr
和 tidyr
库:
df1 = dplyr::select(df, date, COMNAM, RET)
df2 = dplyr::select(tidyr::spread(df1, key = COMNAM, value = RET), -date)
answer = cor(df2, use = "pairwise.complete.obs")
我清理了您的数据,因此 COMNAM
只是 multi-word 公司名称的第一个词。这是我得到的输出:
> answer
APPLE MICROSOFT
APPLE 1.0000000 0.8763755
MICROSOFT 0.8763755 1.0000000
这是一个更完整的示例,可能会为执行此类分析and/or where/how 获取数据的新想法打开一些大门:
library(quantmod)
library(tidyverse)
library(lubridate)
symbols <- c("AAPL", "MSFT", "GOOG")
getSymbols(symbols)
stocks <- data.frame(as.xts(merge(AAPL, MSFT, GOOG)))
stocks$date <- row.names(stocks)
row.names(stocks) <- NULL
# head(stocks)
jan31 <- ymd("2016-01-31")
days_to_keep <- jan31 %m+% months(0:11)
# days_to_keep
res <- stocks %>%
select(ends_with("Close"), date) %>%
mutate(date = ymd(date)) %>%
filter(date %in% days_to_keep)
res %>% select(-date) %>% cor()
# AAPL.Close MSFT.Close GOOG.Close
# AAPL.Close 1.0000000 0.9198357 0.9313001
# MSFT.Close 0.9198357 1.0000000 0.9103830
# GOOG.Close 0.9313001 0.9103830 1.0000000
# Or more visually...
res %>% select(-date) %>% pairs()