查看原文
其他

使用 R 语言爬取 VINSIGHT 网站上的沪深 300 VIX 和上证 50 VIX 数据

RStata RStata 2022-05-17

在之前的课程 Stata 编程导论:网络数据爬取 中我给大家留了个作业:爬取 VINSIGHT 网站上的沪深 300 VIX 和上证 50 VIX 数据。

昨天我公布了 Stata 版本的答案,今天我们再来用 R 语言实现一下!

首先通过查看网页源代码我们可以看到 沪深 300 VIX 和 上证 50 VIX 的数据都在网页源代码里面(160 行和 164 行),所以我们的第一步就是把网页源代码读取到 R 语言中进行处理:

library(tidyverse)
readLines("http://vinsight.shanghai.nyu.edu/implied_moments.php") -> html

再根据需要把 160 行和 164 行先处理成 JSON 数组再转换成数据框:

str_match(html[160], pattern = "\\[(.*)\\]")[,2] %>% 
  str_replace_all('\\{"date":''[') %>% 
  str_replace_all("\\}""]") %>% 
  str_remove_all('"value":') %>% 
  paste0("[", ., "]") %>% 
  jsonlite::fromJSON() %>% 
  as_tibble() %>% 
  type_convert() %>% 
  set_names(c("date""value")) -> sz50vix
  
sz50vix
#> # A tibble: 1,398 x 2
#>    date       value
#>    <date>     <dbl>
#>  1 2015-02-09  34.6
#>  2 2015-02-10  33.2
#>  3 2015-02-11  29.5
#>  4 2015-02-12  25.6
#>  5 2015-02-13  22.1
#>  6 2015-02-16  22.8
#>  7 2015-02-17  23.7
#>  8 2015-02-25  25.2
#>  9 2015-02-26  25.4
#> 10 2015-02-27  26.0
#> # … with 1,388 more rows

str_match(html[164], pattern = "\\[(.*)\\]")[,2] %>% 
  str_replace_all('\\{"date":''[') %>% 
  str_replace_all("\\}""]") %>% 
  str_remove_all('"value":') %>% 
  paste0("[", ., "]") %>% 
  jsonlite::fromJSON() %>% 
  as_tibble() %>% 
  type_convert() %>% 
  set_names(c("date""value")) %>% 
  dplyr::filter(!is.na(value)) -> hs300vix

hs300vix
#> # A tibble: 211 x 2
#>    date       value
#>    <date>     <dbl>
#>  1 2019-12-23  11.4
#>  2 2019-12-24  12.7
#>  3 2019-12-25  11.6
#>  4 2019-12-26  10.8
#>  5 2019-12-27  12.4
#>  6 2019-12-30  12.3
#>  7 2019-12-31  15.9
#>  8 2020-01-02  19.5
#>  9 2020-01-03  17.6
#> 10 2020-01-06  18.0
#> # … with 201 more rows

比 Stata 简单快捷好多!

最后我们再画个图展示下:

ggplot(sz50vix, aes(date, value)) + 
  geom_line(aes(color = "sz50vix")) + 
  geom_line(data = hs300vix, aes(color = "hs300vix")) + 
  tidyquant::theme_tq(base_family = cnfont) + 
  scale_color_manual(values = c("sz50vix" = "#E31A1C",
                                "hs300vix" = "#18BC9C"),
                     labels = c("沪深 300 VIX""上证 50 VIX")) + 
  scale_x_date(breaks = scales::date_breaks("10 month"),
               labels = scales::date_format("%Y-%m")) +
  labs(title = "上证 50 & 沪深 300 波动率指数",
       subtitle = "绘制:微信公众号 RStata",
       caption = "数据来源:Vinsight\nhttp://vinsight.shanghai.nyu.edu/implied_moments.php",
       color = ""
       x = "", y = "VIX") + 
  theme(legend.position = c(0.80.9),
        legend.background = element_blank())

免费数据分享

工企位置(1998~2007) // 工企位置(2008~2013) // 行政村区划(2019) // 县域年鉴(2015~2019) // 县域年鉴(2014) // 乡镇区划(2018~2019) // 区县行政区划(2009~2019) // 新冠疫情数据 // 省级行政区划(2019) // 夜间灯光数据(1992~2013) // 夜间灯光数据(2012~2018) // 夜间灯光数据(1992~2013, 分县)

更多数据和课程的获取,欢迎扫描下方二维码浏览 RStata 学院https://rstata.duanshu.com/


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存