昨天晚上看 WWDC 开场演讲,满心以为要发布点能干重活的 Mac,结果一粒沙子都没看见,导致今天上班都有点恍惚。提到 Mac,R 社区 rfordatascience/tidytuesday 2020 年第 52 周的数据 The Big Mac index 正好也是讲 Mac 的,关公战秦琼,拉出来看一看,玩一玩。

library(tidyverse)

big_mac <- read_csv("https://github.com/TheEconomist/big-mac-data/releases/download/2021-01/big-mac-full-index.csv") |> 
  janitor::clean_names()
# A tibble: 1,386 x 19
   date       iso_a3 currency_code name       local_price dollar_ex
   <date>     <chr>  <chr>         <chr>            <dbl>     <dbl>
 1 2000-04-01 ARG    ARS           Argentina         2.5       1   
 2 2000-04-01 AUS    AUD           Australia         2.59      1.68
 3 2000-04-01 BRA    BRL           Brazil            2.95      1.79
 4 2000-04-01 CAN    CAD           Canada            2.85      1.47
 5 2000-04-01 CHE    CHF           Switzerla        5.9       1.7 
 6 2000-04-01 CHL    CLP           Chile          1260       514   
 7 2000-04-01 CHN    CNY           China             9.9       8.28
 8 2000-04-01 CZE    CZK           Czech Rep       54.4      39.1 
 9 2000-04-01 DNK    DKK           Denmark          24.8       8.04
10 2000-04-01 EUZ    EUR           Euro area         2.56      1.08
# … with 1,376 more rows, and 13 more variables:
#   dollar_price <dbl>, usd_raw <dbl>, eur_raw <dbl>,
#   gbp_raw <dbl>, jpy_raw <dbl>, cny_raw <dbl>, gdp_dollar <dbl>,
#   adj_price <dbl>, usd_adjusted <dbl>, eur_adjusted <dbl>,
#   gbp_adjusted <dbl>, jpy_adjusted <dbl>, cny_adjusted <dbl>

1,386 x 19 的小数据集,19 列看起来似乎很多,看列名,其实除去日期、国家代码、货币代码、国名、汇率之后,剩下的都是 Big Mac 指数在 USD、EUR、CNY、JPY 等常见货币之间的换算关系,可以理解为一回事。

Macintosh 128K big mac

那么,何为 Big Mac Index?首先,这里的 Mac 不是💻电脑,而是🍔巨无霸汉堡;其次,要理解这个巨无霸指数是什么意思,得先了解一个概念——PPP(purchasing power parity),它是这个指数成立的前提。那么,PPP 又是什么呢?它译作「购买力平价」,大意是这样的:世界各国都有自己的货币,自成体系,不好直接比较说一块人民币换一块美刀是高了还是低了。为了方便比较,它先做了一个假设,假设一些全球流通的商品,价值在哪里都是一样的,那么,只要比较这些商品在各地的价格,再结合当时的实际汇率,我们就能顺理成章的推断当地货币是被高估了还是被低估了。

那选什么商品好呢,最起码,它要既方便简单操作,且又全球流通。提出这个指数的《经济学人》说,当然是大汉堡了,并且自苹果发布 Mac(Macintosh)的 1984 年之后的两年起,《经济学人》开始坚持每年出版一次汉堡指数,帮助大家据此理论,简单评估汇率的差异。

那么,道理我都懂,汉堡为什么那么大,到底什么是巨无霸指数呐?再举个实例,假如同样一个麦当劳大汉堡,在美国卖 6 块钱一个,在中国卖 24 块钱一个,那么,两地汉堡指数是 6:24,即 1:4。那么,现在美元与人民币的汇率是多少呢,是 1:6.4,根据 PPP 理论,与实际汇率相比,通过计算 (1/6.4)/(1/4)-1 = -38%,于是我们说:跟实际汇率相比,人民币相对于美元,被低估了 38%。啥意思?人民币应该据此升值到四块兑一块美金吗?哦,$699 的 RTX 3080 只需 ¥3,355 🎉🎉🎉(大方点算你 20% 增值税)。

朗格里格郎个浪

话虽如此,但是在实际生活当中,决定一件商品价格的因素可能有很多,比如开店的房租、人工、税收、消防等成本,再比如居民的收入水平等等,可能为了让这个指数看起来不那么粗暴,经济学人又指标数据分作了两个部分,一半是上述逻辑所讲的直接换算,一半则是后边的几列列名带 adj/adjusted 的数值,它们是融合了人均 GDP 之后的调整结果。

怎么个调整法呢,总体预期是:穷国便宜,富国更贵。上图也可以印证着一预期,具体计算详情可以参考原 GitHub 仓库的 ipynb,引文的最后一个链接可直达。我们可以根据其中一个代码片段来推测,摘录如下:

big_mac_gdp_data[, adj_price := lm(dollar_price ~ GDP_dollar) %>% predict, by = date]

这是一段融合了 data.table + tidyverse + base R 三种风格的 R 代码,DT[i, j, by] 这个外框是 data.table,lm(dollar_price ~ GDP_dollar) %>% predict 这里是 tidyverse + base R。也就是说,以 date 为分组,获得 y = ax + b 的线性关系。这里的 y 是当个 date 窗口内的汉堡原价 dollar_price,x 为人均 GDP GDP_dollar,货币单位,顾名思义,都是换算过的美金。由此,一组 date 决定一条线,线定下来了,游离于线外的老点在新线上的新位置,自然也就出来了。

数据不一样了,结论自然也不一样了,新的调整结果下,我们上边的人民币被低估的结论,甚至都反过来了。不如直接看历年来的当地价格变化吧,2000 年以来,难以想象,日本、台湾两地还曾降过价,内地和香港,价格都翻了一倍多,只是一时没有通胀数据,不好结论。

big_mac |> 
  filter(date >= "2000-01-01",
         name %in% c("China", "Hong Kong", "Taiwan", "Japan", "Korean")) |> 
  ggplot(aes(x = date, y = local_price, color = name)) +
  geom_line(show.legend = FALSE) +
  facet_wrap(~name, scales = "free_y") +
  expand_limits(y = 0)

Source: