似乎老丁的澳门元买的不是时候……

似乎老丁的澳门元买的不是时候……

之前在工行网点实习的时候帮客户买过几次外汇,最近老丁又买了不少澳门元,我就想看看中国银行澳门元的外汇牌价,看看能不能帮老丁在买澳门元的时候省点钱。

外汇的一些常识

打开中国银行外汇牌价的网站可以看到关于中国银行报出了五个价格:

可以发现下面几个基本现象:

  1. 现汇买入价 > 现钞买入价;
  2. 现汇卖出价 < 现钞卖出价;
  3. 中行折算价大概为其它四个价格的平均。

需要注意的是,如果我们需要买外币,我们应该关注的是现汇卖出价和现钞卖出价。这里的买入卖出都是对银行来说的,现汇和现钞都是指外币的汇和钞。现汇卖出价低于现钞卖出价也很容易理解,纸质钞票的运输存在押运、安保等成本支出。

接下来先把数据爬下来:

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
55
56
57
library(httr)
library(rvest)
library(tibble)
library(httr)
library(progress)
library(readr)
library(lubridate)
# 先把首页爬下来
html <- GET("http://srh.bankofchina.com/search/whpj/search.jsp?erectDate=2018-01-01&nothing=2019-08-09&pjname=1327&page=1",
add_headers(c()),
set_cookies(c()))

# 判断总页数
recordnum <- html %>%
content() %>%
html_nodes(xpath = '/html/body/div/script[2]/text()') %>%
as.character() %>%
stringr::str_extract(pattern = "m_nRecordCount = (.*);") %>%
stringr::str_extract(pattern = "\\d+") %>%
as.numeric()
pagenum <- round(recordnum / 20)

# 开始循环爬取,先爬好第一页,然后把后面的拼接上来
pb <- progress_bar$new(total = pagenum)
df <- html %>%
content() %>%
html_table(fill = TRUE) %>%
.[2] %>%
.[[1]] %>%
.[,1:7] %>%
as_tibble() %>%
dplyr::filter(!is.na(`现汇买入价`))

for(i in 2:pagenum){
temphtml <- GET(paste0("http://srh.bankofchina.com/search/whpj/search.jsp?erectDate=2018-01-01&nothing=2019-08-09&pjname=1327&page=", i),
add_headers(c()),
set_cookies(c()))
tempdf <- temphtml %>%
content() %>%
html_table(fill = TRUE) %>%
.[2] %>%
.[[1]] %>%
.[,1:7] %>%
as_tibble() %>%
dplyr::filter(!is.na(`现汇买入价`))
df <- rbind(df, tempdf)
pb$tick()
}

df <- df %>%
mutate(
`发布时间` = lubridate::ymd_hms(`发布时间`)
) %>%
arrange(`发布时间`)

# 保存数据
write_rds(df, "今年澳门元的牌价.rds")

因为每页只有 20 个观测值,中行每天大概会发布 120 次价格,爬一天的数据就是 6 页。所以我只爬了 2018年1月1日到今天的。一共获得了 84418 条记录。耗时大概25分钟。

如果你不想浪费这个时间爬,可以直接下载我爬取的结果:





今年澳门元的牌价.rds

首先看看澳门元现汇卖出价这两年的变化趋势:

1
2
3
4
5
6
7
8
9
rm(list = ls())
df <- read_rds("今年澳门元的牌价.rds")
df %>%
ggplot(aes(x = `发布时间`, y = `现汇卖出价`)) +
geom_line() +
scale_x_datetime(labels = scales::date_format()) +
labs(title = paste0(df$货币名称[1], "牌价"),
subtitle = "数据来源:中国银行",
caption = "注:对于文亮同学来说,现汇卖出价越低约值得买入澳元")

可以看出前几天文亮买入澳门元的行为属于:在最高点被人套现了!

外汇市场是个 $7 \times 24$ 的市场,所以我就估计,可能不同时刻的的外汇报价是不同的:

1
2
3
4
5
6
7
8
9
10
11
df %>%
mutate(
hour = hour(发布时间)
) %>%
arrange(hour) %>%
ggplot(aes(x = hour, y = `现汇卖出价`)) +
geom_point(position = position_jitter(0.5), alpha = 1/50) +
geom_smooth() +
labs(x = "发布时刻", caption = "注:似乎上午去银行换外汇更划算",
title = "中国银行澳门元牌价与发布时刻的关系",
subtitle = "2018年1月1日——2019年8月9日")

白天的价格都比较均一,所以一天中什么时候去银行买澳元都差不多。

最后再看一下五种价格的关系吧:

1
2
3
4
5
6
7
8
9
10
11
12
13
library(tidyr)
df %>%
gather(现汇买入价, 现钞买入价, 现汇卖出价, 现钞卖出价, 中行折算价, key = "term", value = "price") %>%
ggplot(aes(x = 发布时间, y = price, group = term)) +
geom_point(aes(color = term),
position = position_jitter(width = 0.2),
alpha = 1/100) +
geom_smooth(aes(color = term)) +
scale_x_datetime(labels = scales::date_format()) +
scale_color_brewer(palette = "Set2") +
labs(y = "价格", color = "价格种类",
title = "中国银行五种牌价的关系",
caption = "数据来源:中国银行")

其它币种

澳门元的请求链接是:

1
http://srh.bankofchina.com/search/whpj/search.jsp?erectDate=2018-01-01&nothing=2019-08-09&pjname=1327&page=1
  • erectDate:起始日期;
  • nothing:结束日期;
  • pjname:币种编号;
  • page:第 x 页,我在爬取代码里有写判断总页数的方式。

币种编号对照表:

币种编号 币种
1314 英镑
1315 港币
1316 美元
1317 瑞士法郎
1318 德国马克
1319 法国法郎
1375 新加坡元
1320 瑞典克朗
1321 丹麦克朗
1322 挪威克朗
1323 日元
1324 加拿大元
1325 澳大利亚元
1326 欧元
1327 澳门元
1328 菲律宾比索
1329 泰国铢
1330 新西兰元
1331 韩元
1843 卢布
2890 林吉特
2895 新台币
1370 西班牙比塞塔
1371 意大利里拉
1372 荷兰盾
1373 比利时法郎
1374 芬兰马克
3030 印尼卢比
3253 巴西里亚尔
3899 阿联酋迪拉姆
3900 印度卢比
3901 南非兰特
4418 沙特里亚尔
4560 土耳其里拉

封面图:unsplash-logozhao chen

# R

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×