2000~2016年海关数据 HS 编码(税号编码)统一对照表及统一结果

今天给大家分享一份 2000~2016 年海关数据 HS 编码(税号编码)统一对照表及统一结果。由 RStata 数据中心处理得到(基于世界海关组织公布的 HS 转换对照表,将 2000–2016 年中国海关数据的商品编码统一到 HS1996 / HS2002 / HS2007 / HS2012 / HS2017 五个版本)。

做跨年份的海关数据分析时,最常遇到的问题就是「同一个商品在不同年份对应着不同的编码」。本数据正是为了解决这个问题而构建的:它在保留原始 8 位商品编码的同时,额外给出了同一商品在五个 HS 版本下的统一编码,方便大家直接做跨期可比的商品级分析。

数据来源与处理方法

原始数据为 2000–2016 年中国海关数据(版本 2):

2000~2016 年海关数据(版本2):https://rstata.duanshu.com/#/course/530c467967104ffe9aeb2c6cfabf9fa1

每年一个分年 .dta。海关数据中的商品编码(税号编码)即我们常说的 HS 编码(Harmonized System,商品名称及编码协调制度),有两个特点:

  1. 前 6 位是国际通用码,全球统一;后 2 位是国内子目,由我国海关自行扩展,因此商品编码通常为 8 位;
  2. HS 编码每隔约 5 年修订一次,不同年份使用的是不同版本的 HS 编码。

在我们的数据中,年份与 HS 版本的对应关系如下:

年份区间 源 HS 版本
2000–2001 HS1996
2002–2006 HS2002
2007–2011 HS2007
2012–2016 HS2012

如果直接把跨年份的数据拼在一起做面板分析,同一个商品在不同年份会对应不同的编码,从而导致匹配错误。因此在做跨期分析之前,必须先把所有年份的编码统一到同一个版本。

统一过程依赖联合国统计司(UN Stats)公布的官方 Correlation Table(完整对照表,覆盖 1:1 / 1:n / n:1 / n:n 全部对应关系,比 Conversion Table 覆盖度更高)。所有转换表方向均为「新版本 → 旧版本」,我们同时按正向(旧→新)和反向(新→旧)读取,一对多时取第一个匹配,再把相邻版本的对照关系链式拼接起来,为每个源版本构建一张包含全部 5 个目标版本的查找表;链条中某一步缺失时级联填充(沿用上一版本的码),保证链条不中断。最后执行编码转换:商品编码前 6 位参与版本转换、后 2 位(国内子目)保留不变,查不到对应关系的则保留原码。

该数据的详细计算方法在以下三个课程中均有讲解(Python、R 语言、Stata 三个版本):

感兴趣的小伙伴可以结合讲义材料学习。附件中也提供了完整的计算代码。

数据概览

为了方便大家使用,我把统一结果按年份汇总成了 2000–2016 年、共 17 个分年的面板数据(每年一个 .dta 文件),每条观测为一条海关记录,包含以下变量:

变量 含义
newhgid 观测 ID
年份 2000–2016
商品编码 原始 8 位 HS 编码(前 6 位国际码 + 后 2 位国内子目)
HS1996 统一到 HS1996 版本的 8 位编码
HS2002 统一到 HS2002 版本的 8 位编码
HS2007 统一到 HS2007 版本的 8 位编码
HS2012 统一到 HS2012 版本的 8 位编码
HS2017 统一到 HS2017 版本的 8 位编码

这份数据的核心价值在于:把不同年份、不同 HS 版本的海关商品编码映射到了统一的口径下。因此它可以用于:

  • 将跨年份的海关贸易记录按「同一商品」横向拼接,构建商品层面的跨期面板数据;
  • 在不同年份之间比较贸易结构、计算产品层面的进出口指标时,避免因 HS 版本变动导致的伪变化;
  • 在按商品编码与工企、上市公司、专利、工商注册等数据库做匹配时,统一编码口径、提升匹配质量。

需要提醒的是,并非所有编码都能被成功统一:若某个 6 位码不是目标版本中的合法 HS 编码(例如我国海关特有的 98/99 章特殊码、或数据录入错误),会保留其原码。具体各年各版本的无法统一比例见下方图表。

图表展示

下图展示了 2000–2016 年各版本 HS 编码无法统一的观测值比例(数值为占当年观测总数的百分比):

处理代码

下面给出方法的核心代码片段。完整可运行代码见附件。

首先是年份与 HS 版本的对应关系,以及正向(旧→新)读取 Correlation Table 的逻辑(R 语言):

# 年份与 HS 版本对应关系(2000–2016)
year_hs <- tibble(
year = 2000:2016,
hs_version = c(rep("HS1996", 2), rep("HS2002", 5),
rep("HS2007", 5), rep("HS2012", 5))
)

# 正向(旧→新)读取 Correlation Table,一对多时取第一个匹配
read_corr_forward <- function(path, sheet, skip = 1) {
read_excel(path, sheet = sheet, skip = skip) %>%
filter(!is.na(.[[1]]), !is.na(.[[3]])) %>%
transmute(from_old = as.character(.[[3]]),
to_new = as.character(.[[1]])) %>%
distinct(from_old, .keep_all = TRUE)
}

编码转换的核心逻辑——商品编码前 6 位查表转换、后 2 位保留,缺失则保留原码(R 语言):

# 商品编码为 8 位:前 6 位参与版本转换,后 2 位(国内子目)保留不变
hs6 <- str_sub(df$商品编码, 1, 6) # 前 6 位:国际 HS 编码
suffix <- str_sub(df$商品编码, 7, 8) # 后 2 位:国内子目

# 命名向量查表;查不到则保留原码,再拼回后 2 位
map_ver <- function(lk, col) {
vec <- setNames(lk[[col]], lk$source_code)
conv <- vec[hs6]
conv[is.na(conv)] <- hs6[is.na(conv)]
str_c(conv, suffix)
}

数据准备阶段,先用 Stata 把每年的大数据瘦身为 newhgid + 年份 + 商品编码 三个变量:

*- 将每年大数据瘦身为 newhgid + 年份 + 商品编码
cd "/Users/ac/Desktop/使用 R 语言统一海关税号编码/"
cap mkdir "海关数据商品编码分年"
forval y = 2000/2016 {
use ".../海关数据分年/`y'.dta", clear
keep newhgid 年份 商品编码
save "海关数据商品编码分年/`y'", replace
}

附件中也提供了该数据的处理代码供参考:

数据引用格式

由于该数据包含较多 RStata 处理的内容,在研究中使用该数据请使用清晰的方式注明数据来源于 RStata 或者 RStata 数据中心,并使用如下格式引用:

RStata 数据中心: 2000~2016年海关数据 HS 编码(税号编码)统一对照表及统一结果. 2026. https://tidyfriday.cn/rsdb2/

英文文献可以使用下面的格式引用:

RStata Data Center: Unified HS Code (Tariff Code) Crosswalk Table and Unified Results for Customs Data, 2000–2016. 2026. https://tidyfriday.cn/rsdb2/

关联课程/数据推荐

2000~2016 年海关数据(版本2):https://rstata.duanshu.com/#/course/530c467967104ffe9aeb2c6cfabf9fa1

2000~2016 年海关地理信息数据(含经纬度及其所处的省市区县):https://rstata.duanshu.com/#/course/a63b7b4100f541f484fc79dfe1acd6f9

2000~2016 年海关与专利数据匹配结果:https://rstata.duanshu.com/#/course/ca8a4035a91c426393fd2a706e85cbdb

2000~2016 年上市公司与海关数据库匹配结果:https://rstata.duanshu.com/#/course/42d505c537b74054aa0b268153a21bfa

2000~2016 年海关数据与工商注册信息匹配结果(版本2):https://rstata.duanshu.com/#/course/fe61acdee53d4000bb4b80ec0afbfff4

点击这里跳转到 RStata 短书平台获取附件:2000~2016年海关数据 HS 编码(税号编码)统一对照表及统一结果

评论