国际贸易网

来自集智百科
跳转到: 导航搜索

国际贸易网是指描述世界各国相互之间贸易关系的一种复杂网络模型,每个节点是一个参与贸易的国家,每条连边表示两个国家之间的贸易,流量代表两国之间的贸易额。目前,已有大量的双边国际贸易数据存在,因此,人们可以构建非常完整的国际贸易网络。

目录

文献导读

基于流网络探讨国际贸易中的多层网络[1]

文章概要:文章基于流网络的方法建立了分产品的多层贸易网络(关于流动网络的基础知识参见流动网络),并且定义了贸易网络中的货币流和物质流,在物质流中,商品从出口方流入进口方,源可以理解为各国国内的生产,汇可以看成各国的消费;相反货币流中,资金从进口国流向出口国,源是国内需求驱使下造成的贸易赤字,汇是国内的生产盈余。文章探究了不同国家在不同产品网络中的“生态位”(是更偏向于出口国(生产者)还是进口国(消费者)),即源到各国的距离的远近,以此衡量国家在流动网络中的重要性;发现了竞争力强的国家汇进出口更丰富的产品,相反竞争力弱的国家进出口产品的种类较少;提出了调和中心度的指标计算,在贸易网络中发现了中心分层的现象竞争力强的国家在多数产品贸易网络中占据中心位置,弱国在大多数产品贸易中都处在外围;发现了工业品的网络从源到汇的距离相比农业品从源到汇的距离更远。

国际贸易流网络[2]

本文通过基于流网络建立国际贸易网络,观察2000年中800个产品的异速标度指数,发现大部分商品贸易网络大体上是中心化的。此外,该文作者将800种不同的产品都统一在一个坐标系下,更加直观地表示不同的商品大分类所具备的η值范围。结果表明大部分的工业产品在右侧,而农副产品产品在左侧。所以,说明工业品中性化更明显。

数据来源及预处理

介绍两种与贸易相关的数据集及其预处理方法,最终得到加权的贸易邻接矩阵。

NBER-UN数据集

数据来源及格式

  • 国家经济研究局(National Bureau of Economic Research)提供了一套完整的从1962年到2000年的4位编码(SITC4)的国际贸易数据集,在每一年的数据中,有将近200个国家的近800种产品的双边贸易流量记录.下载链接
  • 原始数据为*.dta格式,matlab及python读取困难,需进行一步数据格式转换,存储为*.xlsx/*.xls/*.csv文件,进行矩阵处理与运算(可使用Stata进行格式转换处理,stata下载链接)。
  • 转换后的*.xlsx/*.xls/*.csv文件表格结构如下:

Internationaltradedata.png

  • 数据格式:importer, exportor分别是进口国和出口国,sitc4是按照国际编码体系SITC4编码的产品种类,value是贸易额,unit是该商品的出口单位,quantity是该商品的出口数量。dot指代贸易流动方向,1=data is from importer,2=data is from exporter。例如:上图中第一条数据,Saudi Arabia在1986期间年从Turkey进口了sitc4编号为8510的产品,产品进口总额为248美元,共29公吨。
  • 关于SITC4编码的说明:SICT(Standard International Trade Classificatioon)为国际贸易标准分类方法,将贸易产品分为 10 大类(一位数)、66 章(二位数)、262(组(三位数)、1023 个分组(四位数)和 2652 个基本编号(五位数),具体内容请详见链接。SITC4在本数据集中,有些SITC4编码以X、A等字母为结束,表示该商品的分类未有详细记录,或者是为了补全贸易数据人工添加的记录。
  • 关于该数据库的其他说明: 一国到世界(World)的出口或者进口并不一定等于一国到所有国家的出口或者进口,这是因为统计误差的存在。在数据下载链接中有"FQA on NBER-UN data"说明文档,如有更多其他问题,请参考。FQA on NBER-UN data

数据预处理

处理总贸易数据,得到贸易额列表

以62-00年各国不分产品总贸易额为例,逐年对NBER-UN国际贸易数据集进行分类汇总(该汇总列表由美国国家经济研究局NBER统计并整理,仅涵盖1962-2000年不分产品的贸易总额,若研究分产品贸易网络,则需要按照个人需求从1962-2000年详具的39份年际贸易列表中逐年提取并汇总),按照1-202序列对全部202个国家重新编码(新编码Num代表该国在国际贸易矩阵中的行列号;注意,为保持贸易矩阵结构统一,此处的国家编码应与分产品贸易网的国家编码保持一致),汇总后整合表格结构如下:

62-00整合表格样例.JPG

其中,Ecode表示出口国在NBER进行统计汇总时的原始代码,Icode表示进口国的原始代码,Num表示各国的新编码,即该国在国际贸易矩阵中的行列号,Value表示逐年的贸易总额(如:Value62表示1962年的出口国-进口国间的贸易总额)

以上预处理过后,可使用matlab及python读取贸易额并进行矩阵处理运算,预处理后的*.xlsx下载链接

从总贸易额列表生成贸易矩阵(MATLAB代码)

将预处理后的贸易列表(列表结构,共202个国家地区,*xlsx格式)调整至202*202贸易矩阵,并保存成*.xlsx格式,按照“年份.xlsx”格式命名。调整后的贸易矩阵F下载链接,矩阵结构如下:

贸易矩阵F.JPG


function [ F,country ] = nber2matrix( file,savepath,year )
 
%此函数用于:调整表格结构,将原始数据集(列表结构,共202个国家地区)调整至202*202贸易矩阵F,并保存成*.xlsx格式,按照“年份.xlsx”格式命名
 
%矩阵结构
%第一列:出口国;第一行:进口国;单元格数值:出口国-进口国之间的贸易额
 
%调用此函数前,需进行数据预处理,对贸易列表中的国家赋值唯一编码:
%1.已有数据集:NBER62-00(数据来源:http://cid.econ.ucdavis.edu/nberus.html);
%2.在原始数据集中(xlsx格式存储)新建sheet,自主编码(若有n个贸易国家,则自1到n编码)并赋值到列表中的每个国家(可使用excel中的index函数);
 
%输入参数:
%file:原始数据集路径+名称,char类型,如:'D:\dataset_NBER-UN\dta\wtf_bilat\NBER-UN_62-00.xlsx'
%savepath:调整后的矩阵存储路径,char类型,如:'D:\dataset_NBER-UN\test\'
%year:年份,double类型
 
%输出参数:
%F:贸易矩阵
%country:原始数据集中的国家地区列表
 
 
    %读取贸易列表
    [data,textdata]=xlsread(file,1);
    %读取国家编码
    [num,country]=xlsread(file,2);
    %提取参与贸易的国家
    country=country(2:end,1);
    %将贸易列表调整至贸易矩阵F
    F=nan(size(country,1),size(country,1));
    for i=1:size(data,1)
           F(data(i,1),data(i,4))=data(i,year-1961+4);
    end
 
    %创建并存储贸易矩阵xlsx文档
    items={'Country'};%创建数据标题
    format='.xlsx';%设置存储格式
    sheet = sprintf(num2str(year)); %创建工作表
    xlsxname=num2str(year);%设置文档名称
    xlswrite([savepath xlsxname format], items, sheet);%创建xlsx文档
    range1 = sprintf('B2:%s%d',[char(double('A')+fix((size(F,2)/26))-1),char(double('A')+mod(size(F,2),26))],size(F,1)+1);%从F中获取贸易矩阵放置范围
    xlswrite([savepath xlsxname format], F(:,:), sheet, range1);%写入贸易总额
    range2 = sprintf('A2:%s%d','A',char(size(F,1)+1)); %从F中获取出口国的放置范围
    xlswrite([savepath xlsxname format], country(:,:), sheet, range2);%写入出口国
    range3 = sprintf('B1:%s%d',[char(double('A')+fix((size(F,2)/26))-1),char(double('A')+mod(size(F,2),26))],char(1)); %从F中获取进口国的放置范围
    xlswrite([savepath xlsxname format], country(:,:)', sheet, range3);%写入进口国
 
end
处理分产品的贸易数据,直接得到贸易矩阵(Matlab代码)

利用1962-2000年逐年详细贸易列表(样例数据下载链接),按列表结构如下图:

1962年分产品贸易列表.JPG

进行一步预处理:新建sheet页,按照1-202序列对全部202个国家重新编码(编码可参考样例数据sheet2中的结构;注意,为保持贸易矩阵结构统一,此处的国家编码应与2.1.2.1贸易总额的国家编码保持一致

预处理后,按照Sitc4编码提取产品,并调整为贸易矩阵F,保存成*.xlsx格式,按照“年份_SITC4码.xlsx”格式命名,代码如下:

 
 function [ F,country ] = nber2matrix_sitc( file,savepath,sitc4 )
 
%此函数用于:调整表格结构,将原始数据集(列表结构,共n个国家地区)分产品调整至n*n贸易矩阵,并保存成*.xlsx格式,按照“年份_SITC4码.xlsx”格式命名
 
%矩阵结构
%第一列:出口国;第一行:进口国;单元格数值:分产品出口国-进口国之间的贸易额
 
%调用此函数前,需进行数据预处理,对贸易列表中的国家赋值唯一编码:
%1.已有数据集:NBER62-00(数据来源:http://cid.econ.ucdavis.edu/nberus.html);
%2.在原始数据集中(xlsx格式存储)新建sheet,自主编码(若有n个贸易国家,则自1到n编码);
 
%输入参数:
%file:原始数据集路径+名称,char类型,如:'D:\dataset_NBER-UN\dta\wtf_bilat\NBER-UN_62-00.xlsx'
%savepath:调整后的矩阵存储路径,char类型,如:'D:\dataset_NBER-UN\test\'
%sitc4:产品的Sitc4编码,char类型
 
%输出参数:
%F:贸易矩阵
%country:原始数据集中的国家地区列表
 
 
    %读取贸易列表
    [data,textdata]=xlsread(file,1);
    %读取国家编码
    [num,country]=xlsread(file,2);
    %提取参与贸易的国家
    country=country(2:end,1);
    %将当年贸易网络中的国家与编码对应
    [tf_exp,index_exp]=ismember(textdata(2:end,5),country);
    [tf_imp,index_imp]=ismember(textdata(2:end,3),country);
    %按sitc4编码提取产品
    for i=1:size(textdata,1)-1
        sitc(i,1)=str2num(textdata{i+1,6});
    end
    re_data=[index_exp,index_imp,sitc,data(:,9)];
    sitc4=str2num(sitc4);
    [r,c]=find(re_data(:,3)==sitc4);
    re_data_sitc4=re_data(r,:);
    %将贸易列表调整至贸易矩阵F
    F=nan(size(country,1),size(country,1));
    for i=1:size(re_data_sitc4,1)
        if re_data_sitc4(i,1)~=0&&re_data_sitc4(i,2)~=0
            F(re_data_sitc4(i,1),re_data_sitc4(i,2))=re_data_sitc4(i,4);
        end
    end
 
    %创建并存储贸易矩阵xlsx文档
    items={'Country'};%创建数据标题
    format='.xlsx';%设置存储格式
    sheet = sprintf(num2str(data(1,1))); %创建工作表
    xlsxname=[num2str(data(1,1)),'_',num2str(sitc4)];%设置文档名称,以“年份_SITC4码”命名
    xlswrite([savepath xlsxname format], items, sheet);%创建xlsx文档
    range1 = sprintf('B2:%s%d',[char(double('A')+fix((size(F,2)/26))-1),char(double('A')+mod(size(F,2),26))],size(F,1)+1);%从F中获取贸易矩阵放置范围
    xlswrite([savepath xlsxname format], F(:,:), sheet, range1);%写入贸易总额
    range2 = sprintf('A2:%s%d','A',char(size(F,1)+1)); %从F中获取出口国的放置范围
    xlswrite([savepath xlsxname format], country(:,:), sheet, range2);%写入出口国
    range3 = sprintf('B1:%s%d',[char(double('A')+fix((size(F,2)/26))-1),char(double('A')+mod(size(F,2),26))],char(1)); %从F中获取进口国的放置范围
    xlswrite([savepath xlsxname format], country(:,:)', sheet, range3);%写入进口国
 
end


调整后的分产品贸易矩阵如下:

调整后的1962年分产品(SITC4编码:5222)贸易矩阵.JPG

UN Comtrade数据集

数据来源及结构

UN Comtrade

total trade in 2000

联合国商品贸易统计数据库(UN Comtrade Database)提供了一套完整的从1962年到2016年的国际贸易数据集。在每一年的数据中,有将近200个国家的产品双边贸易流量记录。

该数据集的格式如下图所示:

Trade.png


其中year表示年份,reporter和partner分别是贸易信息发布者和其贸易伙伴,trade flow是贸易流动方向,import和export分别是进口和出口,trade value是总贸易额。

例如:上图中第二条数据,Ireland在2002年期间向Afghanistan出口了1674942美元的产品。

数据预处理

基于comtrade数据库的分产品贸易网络处理
   基本过程:
   分产品贸易流网络模型构建流程:
   1.从comtrade数据库中下载,需要的产品数据库
     由于comtrade数据库产品分类是海关编码HS,产品HS码查询:http://www.hsbianma.com/
     有了HS编码以后就可以在comtrade数据库中下载贸易数据了:
        注:选择你需要的年份、reporter,partners(这两个就是进出口国)、填入海关数据编码,就可以了。
   2.下载的数据类型是列表的形式,如上表所示
     需要注意:1.剔除贸易数据中reporter和partners为空白、world等数据。
               2.保留flow标识为1的数据
               3.完成1、2步骤以后,只保留reporter code、partners code以及value三列数据
                 利用代码即可将编列表转换成矩阵的形式:Z=sparse(el(:,1)',el(:,2)',el(:,3)')(其中el是上述保留列表的矩阵名)

构建贸易流动网络方法及代码

MATLAB代码

步骤一、给贸易网络添加源汇

首先剔除贸易网络外的国家(不与其他任何国家进行进出口贸易),并添加源汇,调整至(m+2)*(m+2)平衡态贸易矩阵(共m个国家地区参与贸易网络,添加源汇各两行两列),保存成*.xlsx格式,并按照“年份_add_ss.xlsx”命名,添加源汇后的平衡贸易矩阵结构如下:

平衡态F矩阵.JPG

function [ F_add_ss,country ] = add_source_sink( file,savepath,year )
 
%此函数用于在贸易矩阵基础上,首先剔除贸易网络外的国家(不与其他任何国家进行进出口贸易),然后添加源汇,调整至(m+2)*(m+2)平衡态贸易矩阵(共m个国家地区参与贸易网络),保存成*.xlsx格式,并按照“年份_add_ss.xlsx”命名
 
%矩阵结构
%第一列:源+出口国+汇;第一行:源+进口国+汇;单元格数值:出口国-进口国之间的贸易额
 
%调用此函数前,需首先调用nber2matrix函数,生成n*n贸易矩阵(NBER原始数据集共包含n个国家)
 
%输入参数:
%file:n*n贸易矩阵路径+名称,char类型,如:'D:\dataset_NBER-UN\test\1962.xlsx'
%savepath:调整后的平衡贸易矩阵存储路径,char类型,如:'D:\dataset_NBER-UN\test\'
%year:年份,double类型
 
%输出参数:
%F:平衡态贸易矩阵
%country:参与贸易网络的m个国家地区列表
 
 
    %读取贸易矩阵
    [data,textdata]=xlsread(file,2);
    %补齐矩阵
    if size(data,1)~=(size(textdata,1)-1)     
            data((size(data,1)+1):(size(textdata,1)-1),:)=nan;
    end
    if size(data,2)~=(size(textdata,2)-1)
            data(:,(size(data,2)+1):(size(textdata,2)-1))=nan;
    end
    %剔除异常值   
    for i=1:size(data,1)
           for j=1:size(data,2)
               if isnan(data(i,j))
                   data(i,j)=0;
               end
           end
    end
    %剔除空行空列(存在空行或空列)
    r=find(any(data,2)==0);
    c=find(any(data,1)==0);
    d=union(r,c);
    data(d,:) = [];
    data(:,d) = [];
    %删除空行空列对应的国家
    textdata(d+1,:)=[];
    textdata(:,d+1)=[];
    data=[zeros(size(data,1),1),data,zeros(size(data,1),1)];
    data=[zeros(1,size(data,2));data;zeros(1,size(data,2))];
    %添加源汇;
    %“源-某国家”=“该国家总出口额”-“该国家总进口额”
    %“某国家-汇”=“该国家总进口额”-“该国家总出口额”
    for i=2:size(data,1)-1
        if sum(data(i,:))>sum(data(:,i))
            data(1,i)=sum(data(i,:))-sum(data(:,i));
        else
            data(i,end)=sum(data(:,i))-sum(data(i,:));
        end
    end
    F_add_ss=data;
    %创建并存储贸易矩阵xlsx文档
    xlsname=[num2str(year),'_add_ss'];%设置文档名称
    sheet= sprintf(num2str(year)); %创建工作表
    format='.xlsx';%设置存储格式
    items=' country';%创建数据标题
    xlswrite([savepath xlsname format], items, sheet);%创建xlsx文档
    country=[[cell(1,1),'Source',textdata(1,2:end),'Sink'];[['Source';textdata(2:end,1);'Sink'],cell(size(F_add_ss,1),size(F_add_ss,2))]];%在国家列表中源汇各一行一列
    range1 = sprintf('B2:%s%d',[char(double('A')+fix((size(F_add_ss,2)/26))-1),char(double('A')+mod(size(F_add_ss,2),26))],size(F_add_ss,1)+1); %从源文件中获取的贸易额的放置范围
    xlswrite([savepath xlsname format], F_add_ss, sheet, range1);%写入贸易额
    range2 = sprintf('A1:%s%d','A',size(country,1)); %从源文件中获取的出口国的放置范围
    xlswrite([savepath xlsname format], country(:,1), sheet, range2);%写入出口国
    range3 = sprintf('A1:%s%d',[char(double('A')+fix((size(F_add_ss,2)/26))-1),char(double('A')+mod(size(F_add_ss,2),26))],1); %从源文件中获取的进口国的放置范围
    xlswrite([savepath xlsname format], country(1,:), sheet, range3);%写入进口国
 
end

步骤二、形成源-国家、国家-汇的首达距离列表L

在平衡态贸易矩阵基础上,计算各国家地区之间的首达距离,并形成源-国家、国家-汇的首达距离列表L,存储成*.xlsx格式,并按照“年份_L.xlsx”命名,L列表结构如下:

L列表样例.JPG

function [ L_all,L,country ] = F2L( file,savepath,year )
 
%此函数用于:在平衡态贸易矩阵基础上,计算各国家地区之间的首达距离L_all,并形成源-国家、国家-汇的首达距离列表L
 
%首达距离列表结构
%第一列:国家名称;第二列:源-国家的首达距离;第三列:国家-汇的首达距离
 
%调用此函数前,需首先调用add_source_sink函数,生成(m+1)*(m+1)平衡态贸易矩阵(共m个国家地区参与进贸易网络)
 
%输入参数:
%file:(m+1)*(m+1)平衡态贸易矩阵路径+名称,char类型,如:'D:\dataset_NBER-UN\test\1962_ass_ss.xlsx'
%savepath:首达距离列表L存储路径,char类型,如:'D:\dataset_NBER-UN\test\'
%year:年份,double类型
 
%输出参数:
%L_all:各国家地区之间的首达距离矩阵
%L:源-国家、国家-汇的首达距离列表
%country:参与贸易网络的m个国家地区列表
 
    %读取平衡态贸易矩阵
    [data,textdata]=xlsread(file,2);
    %计算概率转移矩阵M
    F=data;
    a=sum(F,2);
    for i=1:size(F,1);
        for j=1:size(F,2);
            if i<size(F,1);
                M(i,j)=F(i,j)/a(i,1);
            else
                M(i,j)=0;
            end
        end
    end
    %计算基础矩阵U
    U=inv(eye(size(M,1))-M);  
    M1=M*U^2;
    %计算均首达距离矩阵L_all
    for i=1:size(U,1)  
        for j=1:size(U,2)
            L_all(i,j)=M1(i,j)/U(i,j)-M1(j,j)/U(j,j);
        end
    end
    %提取源-国家、国家-汇首达距离列表L
    L=[L_all(1,2:(size(L_all,2)-1))',L_all(2:(size(L_all,1)-1),end)];    
    NBER_L{1,1}=num2str(year);
    NBER_L{2,1}=textdata(1,3:end-1)';
    NBER_L{3,1}=L;
    country=NBER_L{2,1};
    %创建并存储首达距离列表xlsx文档
    xlsname=[num2str(year),'_L'];%设置文档名称
    sheet= sprintf(num2str(year));%创建工作表
    format='.xlsx';%设置存储格式
    items={'country','source to country','country to sink'};%创建数据标题
    xlswrite([savepath xlsname format], items, sheet);%创建xlsx文档
 
    xlswrite([savepath xlsname format], NBER_L{2,1} , sheet,'A2'); %在第一列写入国家
    range = sprintf('B2:%s%d',char(double('B')+size(NBER_L{3,1},2)-1), size(NBER_L{3,1},1)+1); %从首达距离列表中获取的距离放置位置
    xlswrite([savepath xlsname format], NBER_L{3,1}, sheet, range);%写入距离
 
end

步骤三、计算各国家地区之间C矩阵

去除贸易网络进出口方向性,进行一步对称处理,得到无向贸易流网络C,存储成*.xlsx格式,并按照“年份_C.xlsx”命名

C矩阵样例.JPG

function [ C,country ] = F2C( file,savepath,year )
 
%此函数用于:在平衡态贸易矩阵基础上,计算各国家地区之间C矩阵
 
%输入参数:
%file:(m+1)*(m+1)平衡态贸易矩阵路径+名称,char类型,如:'D:\dataset_NBER-UN\test\1962_add_ss.xlsx'
%savepath:首达距离列表L存储路径,char类型,如:'D:\dataset_NBER-UN\test\'
%year:年份,double类型
 
%输出参数:
%C:对称矩阵C
%country:参与贸易网络的m个国家地区列表
 
 
 
    %读取平衡态贸易矩阵
    [data,textdata]=xlsread(file,2);
    %计算概率转移矩阵M
    F=data;
    a=sum(F,2);
    for i=1:size(F,1);
        for j=1:size(F,2);
            if i<size(F,1);
                M(i,j)=F(i,j)/a(i,1);
            else
                M(i,j)=0;
            end
        end
    end
    %计算基础矩阵U
    U=inv(eye(size(M,1))-M);  
    M1=M*U^2;
    %计算均首达距离矩阵L_all
    for i=1:size(U,1)  
        for j=1:size(U,2)
            L_all(i,j)=M1(i,j)/U(i,j)-M1(j,j)/U(j,j);
        end
    end
    L_all(:,1)=conj(L_all(1,:));
    L_all(size(L_all,1),:)=conj(L_all(:,size(L_all,2)));
    %计算C矩阵
    for i=1:size(L_all,1)  
            for j=1:size(L_all,2)
                C(i,j)=2*1/(1/L_all(i,j)+1/L_all(j,i));
            end
    end
    %创建并存储首达距离列表xlsx文档
    xlsname=[num2str(year),'_C'];%设置文档名称
    sheet= num2str(year);%创建工作表
    format='.xlsx';%设置存储格式
    items=' country';%创建数据标题
    xlswrite([savepath xlsname format], items, sheet);%创建xlsx文档
    country=textdata;
 
    range1 = sprintf('B2:%s%d',[char(double('A')+fix((size(C,2)/26))-1),char(double('A')+mod(size(C,2),26))],size(C,1)+1); %从源文件中获取的对称矩阵C的放置范围
    xlswrite([savepath xlsname format], C, sheet, range1);%写入C矩阵
    range2 = sprintf('A1:%s%d','A',size(country,1)); %从源文件中获取的出口国的放置范围
    xlswrite([savepath xlsname format], country(:,1), sheet, range2);%写入出口国
    range3 = sprintf('A1:%s%d',[char(double('A')+fix((size(C,2)/26))-1),char(double('A')+mod(size(C,2),26))],1); %从源文件中获取的进口国的放置范围
    xlswrite([savepath xlsname format], country(1,:), sheet, range3);%写入进口国
 
end

参考文献

  1. Shen, Bin; Zhang, Jiang; Zheng, QiuHua (2015). "Exploring multi-layer flow network of international trade based on flow distances". Quantitative Finance.
  2. Shi, Peiteng; Luo, Jingfei; Wang, Penghao; Zhang, Jiang (2013). "Centralized Flow Structure of International Trade Networks for Different Products". International Conference on Management Science & Engineering.
个人工具
名字空间
操作
导航
工具箱