代码之家  ›  专栏  ›  技术社区  ›  user7426583

计算任何一对股票的相关性

  •  -4
  • user7426583  · 技术社区  · 7 年前

    我想得到每对股票的月回报率之间的相关性。。。

    让我向您展示我的数据的简单版本:

    > 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
    

    理想情况下,我希望在我的数据中对股票(微软和苹果、微软和好市多等)进行相关性测量

    2 回复  |  直到 7 年前
        1
  •  1
  •   lebelinoz    7 年前

    将数据转换为返回的数据框架,其列标题为公司名称,您应该只能够将其传递到 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 只是多字公司名称的第一个字。这是我得到的输出:

    > answer
                  APPLE MICROSOFT
    APPLE     1.0000000 0.8763755
    MICROSOFT 0.8763755 1.0000000
    
        2
  •  1
  •   JasonAizkalns    7 年前

    这是一个更完整的示例,可能会为执行此类分析和/或在何处/如何获取数据打开一些新思路的大门:

    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()