在 R 语言里面应用 Stata 中的 cntrade 命令!如何在 R 里面绘制交互式蜡烛图?

在 R 语言里面应用 Stata 中的 cntrade 命令!如何在 R 里面绘制交互式蜡烛图?

使用 R 语言调用股票交易数据的方法很多,但是感觉都不好用(因为很多都是外国人写的),而 Stata 里面有一个非常好用的命令 cntrade 可以用户股票交易数据的获取,为了方便 R 用户的使用,我把这个命令翻译成了 R 语言的函数,然后我们就可以在 R 里面使用这个命令啦!

代码还算简单,因为这个接口提供的本身就是 csv 格式的数据,其实可以写个小 R 包把这个函数放进去,这样就可以方便使用了,但是我比较懒。。。(就把函数放这里吧,大家需要的时候运行一下就可以了)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
library(tidyverse)
# 获取股票数据的函数
cntrade <- function(ticker = "",
type = "stock") {
ticker = as.character(ticker)
stopifnot(type %in% c("stock", "index"))
address = "http://quotes.money.163.com/service/chddata.html"
if(type == "index") {
field = "TCLOSE;HIGH;LOW;TOPEN;LCLOSE;CHG;PCHG;TURNOVER;VOTURNOVER;VATURNOVER;TCAP;MCAP"
}
if(type == "stock") {
field = "TCLOSE;HIGH;LOW;TOPEN;LCLOSE;CHG;PCHG;VOTURNOVER;VATURNOVER"
}
start = "19900101"
end = str_remove_all(as.character(Sys.Date()), "-")
stopifnot(str_length(ticker) <= 6)
while (str_length(ticker) < 6) {
ticker = paste0("0", ticker)
}
if(type == "stock") {
if(as.numeric(ticker) >= 600000) {
url = paste0(address, "?code=0", ticker,
"&start=", start, "&end=", "&fields=", field)
}
if(as.numeric(ticker) < 600000) {
url = paste0(address, "?code=1", ticker,
"&start=", start, "&end=", "&fields=", field)
}
}

if(type == "index") {
if(as.numeric(ticker) <= 1000) {
url = paste0(address, "?code=0", ticker,
"&start=", start, "&end=", "&fields=", field)
}
if(as.numeric(ticker) > 1000) {
url = paste0(address, "?code=1", ticker,
"&start=", start, "&end=", "&fields=", field)
}
}

suppressWarnings({
readLines(url) %>%
iconv("GBK", "UTF-8") %>%
read_csv() %>%
mutate(股票代码 = str_remove(股票代码, "'")) -> df
})

stopifnot(nrow(df) != 0)

return(df)
}

我们来测试下,这个函数只有两个参数,ticker 和 type,ticker 用于设置股票代码,股票代码开头的零可以省略,例如 000001 可以简写为 1;type 用于设置该代码是股票代码还是股票指数代码,type = “index” 表示股票指数,type = “stock” 表示股票,默认为 “stock”。

例如获取上证指数的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
cntrade("1", "index")
#> # A tibble: 7,252 x 15
#> 日期 股票代码 名称 收盘价 最高价 最低价 开盘价 前收盘 涨跌额 涨跌幅 换手率 成交量 成交金额
#> <date> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <lgl> <dbl> <dbl>
#> 1 2020-08-18 000001 上证指数… 3451. 3457. 3433. 3442. 3439. 12.3 0.357 NA 3.81e8 4.93e11
#> 2 2020-08-17 000001 上证指数… 3439. 3451. 3369. 3374. 3360. 78.7 2.34 NA 4.35e8 5.37e11
#> 3 2020-08-14 000001 上证指数… 3360. 3362. 3303. 3316. 3321. 39.4 1.19 NA 3.06e8 3.67e11
#> 4 2020-08-13 000001 上证指数… 3321. 3338. 3309. 3328. 3319. 1.46 0.044 NA 3.24e8 3.87e11
#> 5 2020-08-12 000001 上证指数… 3319. 3336. 3263. 3327. 3340. -21.0 -0.629 NA 3.78e8 4.81e11
#> 6 2020-08-11 000001 上证指数… 3340. 3409. 3336. 3379. 3379. -39.0 -1.15 NA 4.00e8 5.14e11
#> 7 2020-08-10 000001 上证指数… 3379. 3400. 3335. 3342. 3354. 25.2 0.752 NA 3.81e8 5.27e11
#> 8 2020-08-07 000001 上证指数… 3354. 3374. 3308. 3371. 3386. -32.4 -0.958 NA 4.04e8 5.61e11
#> 9 2020-08-06 000001 上证指数… 3386. 3393. 3334. 3381. 3378. 8.90 0.264 NA 4.15e8 5.70e11
#> 10 2020-08-05 000001 上证指数… 3378. 3384. 3334. 3363. 3372. 5.88 0.174 NA 3.86e8 5.27e11
#> # … with 7,242 more rows, and 2 more variables: 总市值 <lgl>, 流通市值 <lgl>

例如创业板指数的(今天跌了 3.27% 。。。真心痛):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
cntrade("399006", "index")
#> # A tibble: 2,484 x 15
#> 日期 股票代码 名称 收盘价 最高价 最低价 开盘价 前收盘 涨跌额 涨跌幅 换手率 成交量 成交金额
#> <date> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <lgl> <dbl> <dbl>
#> 1 2020-08-18 399006 创业板指… 2701. 2724. 2689. 2702. 2696. 4.67 0.173 NA 2.04e9 6.56e10
#> 2 2020-08-17 399006 创业板指… 2696. 2697. 2652. 2682. 2669. 27.7 1.04 NA 2.45e9 7.32e10
#> 3 2020-08-14 399006 创业板指… 2669. 2669. 2616. 2625. 2623. 46.1 1.76 NA 1.87e9 5.52e10
#> 4 2020-08-13 399006 创业板指… 2623. 2661. 2611. 2657. 2636. -12.9 -0.488 NA 2.02e9 5.92e10
#> 5 2020-08-12 399006 创业板指… 2636. 2695. 2578. 2690. 2689. -53.2 -1.98 NA 2.74e9 8.44e10
#> 6 2020-08-11 399006 创业板指… 2689. 2775. 2686. 2740. 2735. -46.6 -1.70 NA 2.44e9 7.45e10
#> 7 2020-08-10 399006 创业板指… 2735. 2757. 2694. 2735. 2750. -14.7 -0.534 NA 2.50e9 8.11e10
#> 8 2020-08-07 399006 创业板指… 2750. 2824. 2703. 2807. 2814. -64.4 -2.29 NA 2.98e9 9.83e10
#> 9 2020-08-06 399006 创业板指… 2814. 2869. 2775. 2869. 2860. -45.9 -1.60 NA 3.03e9 9.70e10
#> 10 2020-08-05 399006 创业板指… 2860. 2875. 2804. 2826. 2833. 27.4 0.967 NA 2.64e9 8.19e10
#> # … with 2,474 more rows, and 2 more variables: 总市值 <lgl>, 流通市值 <lgl>

再找个股票,例如平安银行:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
cntrade("1", "stock")

#> # A tibble: 7,220 x 12
#> 日期 股票代码 名称 收盘价 最高价 最低价 开盘价 前收盘 涨跌额 涨跌幅 成交量 成交金额
#> <date> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 2020-08-18 000001 平安银行 15.2 15.3 14.9 15.2 15.2 -0.04 -0.263 135026107 2033477708.
#> 2 2020-08-17 000001 平安银行 15.2 15.4 14.6 14.6 14.5 0.72 4.98 326802780 4923669137.
#> 3 2020-08-14 000001 平安银行 14.5 14.5 14.1 14.1 14.2 0.290 2.05 110321582 1578543607.
#> 4 2020-08-13 000001 平安银行 14.2 14.5 14.1 14.4 14.4 -0.2 -1.39 83726175 1190139725.
#> 5 2020-08-12 000001 平安银行 14.4 14.5 14.2 14.2 14.1 0.25 1.77 159681170 2287731088.
#> 6 2020-08-11 000001 平安银行 14.1 14.7 14.0 14.0 14.0 0.18 1.29 260330789 3748036828.
#> 7 2020-08-10 000001 平安银行 14.0 14.0 13.6 13.7 13.7 0.25 1.82 158771035 2208568316.
#> 8 2020-08-07 000001 平安银行 13.7 13.9 13.6 13.8 13.9 -0.2 -1.44 98867837 1356305781.
#> 9 2020-08-06 000001 平安银行 13.9 14.0 13.6 13.8 13.8 0.14 1.02 135251068 1868047342.
#> 10 2020-08-05 000001 平安银行 13.8 13.8 13.6 13.8 14.0 -0.28 -1.99 144020313 1980352978.
#> # … with 7,210 more rows

最后为了方便大家使用,我把这个函数放在了 cntrade.R 文件里面,可以直接运行下面的代码调用该函数:

1
source('https://mdniceczx.oss-cn-beijing.aliyuncs.com/cntrade.R')

欢迎反馈~

最后我们再用 highcharter 绘制一幅交互式蜡烛图(为了方便,我仅绘制最近 100 天的):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
cntrade("1", "index") -> df

df %>%
head(100) %>%
arrange(日期) -> df

df %>%
select(date = 日期,
open = 开盘价,
high = 最高价,
low = 最低价,
close = 收盘价) %>%
list_parse2() -> dflist

highchart() %>%
hc_add_series(type = 'candlestick',
name = '上证指数',
data = dflist,
color = 'green',
lineColor = 'green',
upColor = 'red',
upLineColor = 'red',
showInLegend = F) %>%
hc_add_series(type = 'column',
name = '成交量',
data = df$成交量,
yAxis = 1,
showInLegend = F) %>%
hc_add_dependency("modules/stock.js") %>%
hc_add_dependency('modules/drag-panes.js') %>%
hc_yAxis_multiples(
list(labels = list(align = 'left'),
height = '80%', title = list(text = "价格",
offset = 20),
resize = list(enabled = T),
offset = 20),
list(labels = list(align = "right"),
top = '80%',
title = list(text = "交易量"),
height = '30%',
opposite = TRUE,
offset = 20)
) %>%
hc_title(text = "上证指数历史交易数据",
style = list(fontFamily = "STSong")) %>%
hc_subtitle(text = "数据来源:网易财经",
style = list(fontFamily = "STSong")) %>%
hc_add_theme(hc_theme_google()) %>%
hc_credits(enabled = TRUE,
text = "Created by TidyFriday @ RStata",
href = "https://tidyfriday.cn/") %>%
hc_xAxis(categories = df$日期, crosshair = T,
offset = 20) %>%
hc_chart(margin = c(70, 70, 120, 70))


阅读更多:https://mp.weixin.qq.com/s/BstKLTC3x-dwYsE0pJDwLQ

在 R 语言里面应用 Stata 中的 cntrade 命令!如何在 R 里面绘制交互式蜡烛图?

https://tidyfriday.cn/posts/11740/

作者

Painter

发布于

2021-02-10

更新于

2021-05-31

许可协议

评论