IMIX

**IMIX**（Inter-bank Market Information eXchange），狭义上指IMIX协议，全称是银行间市场业务数据交换协议，是一种用于在银行间市场交易活动（包括人民币、外汇和衍生品等各类产品的交易、发行、确认和清结算等）中实现金融信息实时传输的电子通信协议。IMIX协议是金融行业标准，起草单位为中国外汇交易中心。经全国金融标准化委员会审核通过，该标准于2011年6月2日由中国人民银行发布实施，标准号JR/T 0066-2011。

广义上，IMIX指银行间市场统一业务数据交换体系。该体系结合标准制修订、标准宣贯和系统实施，编制了IMIX协议、《银行间市场基础数据元》和《银行间市场数据接口》三项基础行业技术标准，完成了数据引擎、接口开发工具和开发包、开发规范、开发社区等配套应用基础设施。

2016年2月25日，基于IMIX协议标准开发的ISO20022（金融服务：金融业通用报文方案）外汇交易后确认和交易获取的报文正式注册发布。这两组报文是国际标准化组织（ISO）首次发布中国金融领域的相关报文。

## 主要历史
* 2004年9月：项目调研。
* 2004年10月-12月：《银行间市场业务数据交换协议》标准立项。同时立项的还有《银行间市场基础数据元》和《银行间市场数据接口》这两项关联的标准。
* 2005年1月至2005年12月：翻译FIX4.4，形成《银行间市场业务数据交换协议》初稿；完成《银行间市场基础数据元》初稿。
* 2006年1月至2009年12月：形成《银行间市场业务数据交换协议》、《银行间市场基础数据元》意见征求稿，并报金标委；完成《银行间市场数据接口》初稿；应用这三项标准的外汇直通式处理、本币交易、本币直通式处理、市场行情发布等系统先后上线，市场成员系统接入开发同步进行。
* 2010年1月至2011年3月：形成《银行间市场业务数据交换协议》、《银行间市场基础数据元》报批稿并报金标委。
* 2011年6月：《银行间市场业务数据交换协议》（标准号JR/T 0066-2011）、《银行间市场基础数据元》（标准号JR/T 0065-2011）发布实施。
* 2011年4月至2013年1月：完成《银行间市场数据接口》征求意见稿，并报金标委；根据各委员单位的反馈意见修改《银行间市场数据接口》，并形成报批稿。
* 2013年5月：银行间市场技术标准工作组成立。
* 2013年9月至2013年11月：在中国人民银行金融市场司协调下，中央国债登记结算有限责任公司、上海清算所两家机构对《银行间市场数据接口》标准报批稿反馈了意见。经沟通，与起草单位达成一致。
* 2014年1月：《银行间市场数据接口》（标准号JR/T 0078-2014）发布实施；开始开发和申报ISO 20022报文。
* 2014年5月：银行间市场标准工作组会议在上海召开，会上讨论了行业技术标准修订计划。
* 2014年6月：开始《银行间市场业务数据交换协议》和《银行间市场基础数据元》标准的修订工作。
* 2015年8月：银行间市场标准工作组会议在上海召开，会上汇报了标准修订工作进展。
* 2016年2月：基于IMIX协议开发的ISO 20022报文获得通过。
## 协议主要内容

IMIX协议，全称为银行间市场业务数据交换协议（Inter-bank Market Information eXchange Protocol），是一种用于在银行间市场交易活动中实现实时传输金融信息的电子通信协议。

IMIX协议基于FIX协议制定，其数据模型兼容了FIX协议，制定过程遵循稳定性和开放性的原则，并结合中国银行间市场的实际业务进行了扩展。协议标准规定了应用环境、会话机制、报文格式、报文定义、扩展方式、安全加密、数据完整性、数据字典等。

IMIX协议定义了银行间市场各类金融产品交易的交易前、中、后各环节中的数据交互，IMIX报文已覆盖了所有银行间市场产品的报价、订单、交易执行、行情数据发布和成交回报等环节。

## 基本语法和结构

### 数据类型
数据类型用于定义协议传输内容的取值类型，协议中规定的数据类型包括基本数据类型(整数int、浮点数float、单字符char、字符串string、二进制数据块data）和在此基础上扩展的数据类型组成。在文本表示格式中，除“data”数据类型外，其他数据类型均以UTF-8编码形式的字符串存储和传输。

### 域（Field）
域是基本的数据元素，由“域号”、“域名”和“域值”组成。每个域都有唯一的域号和域名作为标识，域号是自然数，域名则是由英文字母组成的字符串。域具有特定的数据类型属性和取值范围属性，限定了域值的类型和有效值范围。通常一个域表达了一个基本的业务要素，比如“价格”要素由组成为“域号 44、域名Price、基本数据类型是浮点数、取值范围是所有实数”的域来表达。

在传输和存储过程中，IMIX协议允许有多种的表示格式，常见的有文本格式、XML格式、二进制格式等等。不同的表示格式下，域的表示方式也有不同。在最常见的文本表示格式中，域表示为“域号=域值”，并在域值尾以固定的域界定符分隔。这种表示格式中，域名不直接出现，域名和域号的对应定义在域字典中。同时域字典还详细定义了所有域的数据类型和取值范围。

在报文中，域的使用有三种方式：必需的，可选的，条件限制选择（即根据其他相关域的存在与否或取值来决定）。在已定义的域法满足使用需求时，协议允许使用者扩展定义新的域，即自定义域。与普通域一样，自定义域同样需遵循协议规范，如使用同样的分隔符、同样的编码等。为了保证域的唯一性，自定义域的域号不能与协议中定义的域号重复，且应大于10000。

### 域界定
在文本表示格式中，报文中所有的域（包含data类型数据域）都有一个分隔符来界定分隔，该分隔符就是ASCII码中的“SOH”字符(#001，hex：0x01，本文中以表示)。除data数据类型域外，其他数据域内容都不应包含域界定符。任何报文都严格由多个“域号=值”的基本结构组成，“域号=值”基本结构用域界定符分隔，形成的报文组成见图。

### 重复组（Repeating Group）
重复组是由重复次数和若干组同类数据组成的域集合。指明重复的次数的域只能出现一次，并位于重复组的开始处。重复组可以嵌套，且使用子重复组时不能省略父重复组。
重复组内，同类数据域集合的第一个域是必需的，并用作判定重复内容的“分隔”用途，表明新的重复域集合的开始。示例如下。

示例中如果备选债券数量为2，则数据内容为：
454=2455=600600456=101455=000001456=102

### 报文（Message）
报文由报文头、报文正文和报文尾组成。各组成部分都由一系列“域”组成。在遵循以下规则前提下，“域”可以是任意的次序：
# 开始部分应是报文头，随后是报文正文，最后是报文尾。
# 报文头的前3个域的次序不能改变：起始串（Tag#8）、报文体长度（Tag#9）、报文类型（Tag#35）。
# 报文尾的最后一个域应是校验和域（Tag#10）。
# 重复组中，域出现的顺序应遵循该重复组在报文或组件中定义时的次序。
# 除重复组域外，任一域号在一条报文内只能出现一次，否则视为错误。
以下是一个报文格式的例子：

对于每一条IMIX报文，它的报文结构可以分解如图所示。

### 报文头（Header）
报文头指明协议版本、报文类型、报文体长度、发送目的地、报文序号、发送起始点和发送时间等基础信息。

### 报文尾（Trailer）
每个报文都有一个报文尾，包含3位数的校验和值并以此终止一条报文。报文头和报文尾通常用于数据传输，不直接描述业务内容。

### 报文正文（Body）
由一系列域组成，用于描述特定业务内容。

## JR/T 0066系列标准
IMIX体系中，除了《银行间市场业务数据交换协议》（IMIX协议）外，还包含另外两项行业技术标准，分别是《银行间市场基础数据元》和《银行间市场数据接口》。三项标准形成了一个基础数据标准系列。《银行间市场业务数据交换协议》、《银行间市场基础数据元》规定了业务要素定义和数据格式规范，解决了数据怎么组织的问题；《银行间市场数据接口》则规定了系统间的接口，解决了数据怎么交互的问题，是在前两项标准发布实施的基础上，调研金融机构需求及应用情况后编写而成的。这三项标准中，以IMIX协议为核心，基础数据元和数据接口标准分别提供基础定义和传输辅助定义。因此称这一系列标准为JR/T 0066系列标准。

### JR/T 0065-2011标准
《银行间市场基础数据元》定义了银行间市场业务术语的唯一表达，对银行间市场数据的描述、存储、传输等方面提供了统一的定义，为银行间市场系统建设提供了数据字典。具体包含以下几方面内容：
# 市场类别： 包括本币市场、外汇市场等。
# 市场及系统术语： 对银行间市场所涉及到的所有相关术语定义一个统一无歧义的说明。
# 各系统交易要素： 对系统中需要用到的交易要素进行明确的描述。
# 存贮格式及计算规则： 根据系统术语及交易要素的描述，定义计算机中的存储格式，并规定计算公式与计算算法，确保所有要素计算表示方式及计算方式的一致性。

### JR/T 0078-2014标准
《银行间市场数据接口》标准规定了银行间市场业务（外汇交易、信用拆借、债券回购、现券买卖、票据等）数据交换和共享所使用的应用接口规范、使用方式和所使用的银行间市场数据交换报文的内容、格式及其使用方法。标准内容覆盖应用编程接口描述、数据传输压缩接口规范、数据落地接口规范、日志接口规范、配置接口规范、业务报文内容快速访问接口规范、订阅发布模式接口规范、业务数据精度标准。该标准适用于银行间市场业务活动中涉及到的业务系统数据接口及所有使用银行间市场数据交换协议的系统。具体包含以下几方面内容：
# 应用编程接口： 基于IMIX协议构建业务系统所必需的应用编程接口定义和说明。
# 报文接口： 应用IMIX协议报文所必需的接口定义和说明，包括封装、解析、校验等。
# 数据传输压缩接口： 规定了基于IMIX协议传输的压缩算法、模板和接口调用方法。
# 数据落地接口： 规定了维持传输会话和异步通信可靠性所必需的本地存储访问接口定义和缓解服务端负载压力的本地缓存访问接口。
# 日志接口： 规定了业务系统记录日志所必需的接口定义。
# 配置文件接口： 规定了业务系统所使用的配置文件格式、配置项命名、用途和取值范围。
# 报文快速访问接口： 规定了快速访问IMIX报文内深层嵌套数据的接口定义和使用方法。
# 订阅发布模式接口： 规定了订阅发布主题模型、主题命名规范和相关报文类型。
# 业务精度标准： 规定了银行间市场关键业务要素在IMIX协议报文中的精度定义。

## 技术标准工作组
银行间市场技术标准工作组（以下简称工作组）是金标委在金融领域设立的首个专项技术标准工作组，是我国金融行业内从事银行间市场标准研究、制定及推动实施的技术组织。其职责是负责有关银行间市场的标准研究、体系规划、国际合作、标准宣贯工作。

工作组于2013年5月31日正式成立，由银行间市场中介机构和市场成员共同参与，首批成员包括中国外汇交易中心、中央国债登记结算公司、上海黄金交易所、上海清算所、工商银行、交通银行、浦发银行、上海银行、汇丰银行、道富银行、中信证券、平安保险、中国金融电子化公司等13家单位。除成员单位外，工作组邀请做市商单位参与到银行间市场标准化的具体工作中，已有中国农业银行、兴业银行、蒙特利尔银行等单位参与。工作组成立后，IMIX协议等银行间市场行业技术标准的制修订等相关工作在工作组管理框架下开展。2013年9月24日，工作组组长当选为ISO20022 FX SEG副召集人。

## IMIX体系
IMIX体系（或称“银行间市场统一业务数据交换体系”）通过结合标准制订和系统实施，旨在形成银行间市场统一的信息交换体系，以规范行业发展、促进产品创新、提高市场运营质量和监管效率。该体系建立了业务领域模型、制定了一系列基础技术标准、构建了数据交换引擎、接口开发类库和开发包等应用基础设施，最终达到了银行间市场各信息系统之间的互联互通和信息共享。

### 接口开发类库
对于IMIX体系的使用者来说，接口开发类库是主要的介质之一。接口开发类库封装了IMIX协议标准和数据接口标准定义的内容，旨在帮助开发人员理解和应用行业技术标准。具体类别细分如下：
* 协议标准类库
协议标准类库是一组对象/接口定义的集合，是对IMIX协议定义的报文（Message）、重复组（Group）、域（Field）等数据结构的具体实现。通过使用协议标准类库，开发人员可以以对象和接口调用的方式，封装和解析IMIX数据，替代了传统的按照数据字典编写冗长的数据接口代码的做法，便于提高开发效率、提升开发质量。通常称协议标准类库为“IMIX协议包”。
协议标准类库的设计原则如下：
# 业务针对性: 为适应市场各项业务相对独立、并行开发、快速多变的特点，对每项业务需求带来的协议标准变更均实现特定版本的协议包。
# 集中管理: 由专门的管理组织对所有类库版本进行统一管理。
# 辅助功能: 除了基本的数据封装解析功能外，类库同时提供了多项辅助功能。如不同强度的数据校验功能、序列化及反序列化功能、格式转换功能、对象工厂、适配框架等。
* 接口类库
是为简化系统接入程序开发而制定的一组应用编程接口（API）。接口类库常被称为“IMIX基础组件”或“IMIX应用开发包”。针对不同类型的系统接入程序，接口类库可分为以下3类：
# 核心API（Core API）: 会话层基于IMIXT 1.0实现，同时兼容了FIX标准。Core API提供最基础、最通用的接口函数，主要包括应用初始化、启动、停止、发送报文、接收报文、会话管理及安全验证等。
# 客户端API（Client API）: 基于Core API实现，并根据客户端应用的行为特征进行了封装，以便于客户端应用的开发人员使用。封装内容包括简化会话管理、增加自动重连、增加本地文件缓存、限制单进程多应用、限制接受连接请求行为等。
# 服务器端API（Server API）: 基于Core API实现，一般用于构建服务器端应用。与Core API相比主要变化包括简化会话管理、增加用户管理功能、限制单一进程多应用、限制发起连接请求行为等。

### API开发包
接口开发类库，加上辅助开发使用的规范文档、示例程序和工具等，形成了API开发包。其实质上是一种软件开发工具集（SDK, Software Development Kit）。IMIX体系中的API开发包一般由中国外汇交易中心负责维护，并通过中国货币网发布。

### 层次划分
根据国际标准化组织（ISO）提出的开放式系统互联通信参考模型（Open System Interconnection Reference Model，定义于ISO/IEC 7498-1），计算机系统互连互通的标准框架可划分为7层，即OSI模型。IMIX体系本质上是针对OSI模型中上面三层（应用层、表示层和会话层）的一套解决方案。其中，JR/T 0066标准定义了三层中的语法和协议部分；JR/T 0065标准和JR/T 0078标准定义了三层中包含语义基础的元数据和开发者使用的应用编程接口（API）规范；应用基础设施则完成了三层的一种具体实现。

#### 会话层（Session Layer）
会话层的主要功能是对话管理，数据流同步和重新同步等。IMIX协议中对于此部分内容的定义称为IMIX会话层（或传输层）协议，即IMIXT（IMIX Transport）协议。应用基础设施中的数据交换引擎和接口类库则实现这部分定义，使用者可以通过引擎或调用类库实现基于IMIXT的通信。IMIX体系未强制要求必需使用IMIXT协议，是否使用IMIXT由互联双方商议而定。对于终端系统而言，可以使用其他实现（如商用的消息中间件等）完成会话层功能。

#### 表示层（Presentation Layer）
表示层用于数据传输过程的格式化和转换，供应用层做进一步的处理或展示。表示层的典型服务包括数据转换、编码转换、压缩和加解密等。IMIX体系中，表示层包含了**IMIXTV**（IMIX Tag=Value,基于UTF-8编码文本）、**IMIXML**（基于XML）、**IMAST**（基于模板压缩）和加解密（基于国密算法和CA证书）等适用于不同场景的语法和数据格式定义，并在协议类库等应用基础设施予以实现。
* **IMIXTV**是最早出现也是用途最广泛的语法和数据格式，本词条中基本语法和结构主要描述的就是IMIXTV语法。
* **IMIXML**是按工业标准XML对IMIX进行编码的语法。IMIX报文结构和XML是类同的，均为树形结构，因此可以方便地进行编码和转换。基本规则是：
# XML元素和属性名称使用有意义的缩写。
# 对于常用要素使用标准缩写，例如Price使用Px表示。
# 报文、组件应表达为XML元素。
# 报文和组件中的域均应表达为属性。
# 重复组表达为XML元素。
# 重复组中的域表达为属性。
# 不同报文中包含的相同的重复组应统一定义。
# IMIX数据类型应对应至XML Schema数据类型。
# 根元素下允许报文重复，支持批量数据。
* **IMAST**是对基于IMIX协议交互数据进行适流压缩的协议。IMAST依赖报文所指向的模板进行编码和解码，形成IMAST流进行网络传输，压缩传输内容并提高传输效率。

#### 应用层（Application Layer）
应用层定位于面向终端用户（可以是自然人，也可以是应用系统）的用户界面展示。IMIX体系应用层的核心内容有二：
# 具体业务场景交互流程的定义；
# 具体业务场景交互内容的定义。
除此之外，IMIX样式表语言（IMIX Stylesheet Language，简称ISL）等基于路径表达语法为简化解析和封装IMIX报文设计的领域语言及配套的应用基础设施也属于这一层次。

## 国际化进程
2014年1月8日，基于IMIX协议标准开始开发外汇交易后确认和交易获取两组ISO 20022报文，并向注册机构提交。2016年2月25日，两组报文正式注册并发布。这两组报文在ISO 20022报文库中的划分为外汇交易业务领域。

## 参考文献

## 外部链接
* IMIX官网
* 中国货币网API开发包下载页