简单二进制编码(SBE)解码器(处理CME MDP3消息)
sbedecoder的Python项目详细描述
基于python的简单二进制编码(sbe)解码器
概述
sbedecoder是一个简单的python包,用于解析sbe编码的数据。
sbedecoder根据格式的xml描述动态生成sbe解析器。这是通过
创建sbeschema()
的实例并用文件名调用它的parse()
方法:
from sbedecoder import SBESchema
schema = SBESchema()
schema.parse('path/to/schema.xml')
sbeschema()
可以使用include_message_size_header=true初始化
需要额外的2字节(unit16)帧消息头字段(即用于CME MDP 3.0)。
默认情况下,消息名称派生自架构中消息定义的"名称"字段。
在某些情况下(即cme mdp 3.0),消息定义的消息"description"字段提供
更友好的消息名称。要使用消息描述作为消息的名称,
使用Use_description_as_message_name=true初始化sbeschema
为了方便起见,sbeschema()
的mdpschema()
子类提供了include\u message\u size\u header=true
以及将"描述"用作"消息"name=true
专门用于处理CME组MDP 3.0架构。
从任何看起来像包含原始二进制文件的缓冲区的结构中分析消息
数据(缓冲区、str、bytearay等)。将sbe编码的数据解析为基于
架构实例,只需调用sbemessage.parse_message()
:
from sbedecoder import SBEMessage
message = SBEMessage.parse_message(schema, msg_buffer, offset=0)
offset
是一个可选参数,指示消息缓冲区中的位置
开始(如果架构已设置include_message_size_header,则包括大小标题)。
解析后的消息表示为sbemessage()
类的实例。sbemessages()
是
由零个或多个sbedecoder.message.sbefield()
实例和零个或多个
sbedecoder.message.sberepeatinggroup()
实例。sbefield()
对象可以是一个基元
typeMessageField()
、asetMessageField()
或anenumMessageField()
注意:除非使用代码生成,否则无法存储消息以供以后处理。 必须在每次迭代中处理消息,因为消息重用 字段对象,用新值包装它们。
cme组以包含4字节序列号的数据包发送mdp 3.0消息。 以及8字节的时间戳。另外,一个包中可以有多个消息 并且每个消息都用上面提到的2字节(unit16)消息大小字段框起来。
要解析这些消息,可以创建一个mdpschema()
,使用它来创建
mdpMessageFactory()
然后创建一个sbeparser()
它可以在
像这样的包:
from sbedecoder import MDPSchema
from sbedecoder import MDPMessageFactory
from sbedecoder import SBEParser
schema = SBESchema()
schema.parse('path/to/schema.xml')
message_factory = MDPMessageFactory(schema)
message_parser = SBEParser(message_factory)
for packet in SOME_DATASOURCE:
for message in message_parser.parse(packet, offset=12):
process(message)
通过创建sbemessagefactory()
有关SBE的更多信息,请参见http://www.fixtradingcommunity.org/pg/structure/tech-specs/simple-binary-encoding" rel="nofollow">http://www.fixtradingcommunity.org/pg/structure/tech-specs/simple binary encoding
安装
sbedecoder项目在pypi上可用:
pip install sbedecoder
如果从源安装:
python setup.py install
注意:sbe解码器仅用python 2.7和3.6进行过测试。在windows上,我们通常使用 蟒蛇分布。anaconda不分发python的测试代码。如果你有 DPKT问题(Iimporterror:没有名为test的模块),您可以安装最新的dpkt 从源代码(https://github.com/kbandla/dpkt)或注释掉导入(从测试导入 pystone)在..\anaconda\lib\site packages\dpkt\decorators.py中。DPKT的新版本否 有这种依赖性的时间更长。
mdp_decoder.py
mdp_u decoder.py用作使用sbedecoder包的示例。它是处理cme组的完整解码器。 来自PCAP文件的MDP 3.0(MDP3)消息。有关使用mdp_解码器的帮助。py:
mdp_decoder.py --help
CME Group MDP 3.0市场数据的SBE模板可在 ftp://ftp.cmegroup.com/sbefix/production/templates/templates\u fixbinary.xml
示例输出:
:packet - timestamp: 2015-06-25 09:45:01.924492 sequence_number: 93696727 sending_time: 1435243501924423666
::MDIncrementalRefreshVolume - transact_time: 1435243501923350056 match_event_indicator: LastVolumeMsg (2)
:::no_md_entries - num_groups: 1
::::md_entry_size: 4483 security_id: 559884 rpt_seq: 2666379 md_update_action: New (0) md_entry_type: e
::MDIncrementalRefreshBook - transact_time: 1435243501923350056 match_event_indicator: LastQuoteMsg (4)
:::no_md_entries - num_groups: 2
::::md_entry_px: 18792.0 ({'mantissa': 187920000000, 'exponent': -7}) md_entry_size: 1 security_id: 559884 rpt_seq: 2666380 number_of_orders: 1 md_price_level: 1 md_update_action: Delete (2) md_entry_type: Bid (0)
::::md_entry_px: 18746.0 ({'mantissa': 187460000000, 'exponent': -7}) md_entry_size: 6 security_id: 559884 rpt_seq: 2666381 number_of_orders: 1 md_price_level: 10 md_update_action: New (0) md_entry_type: Bid (0)
示例输出(使用--pretty
):
packet - timestamp: 2016-03-10 15:33:21.301819 sequence_number: 76643046 sending_time: 1454679022595400091
Message 1 of 2: TID 32 (MDIncrementalRefreshBook) v6
TransactTime (60): 02/05/2016 07:30:22.595256135 (1454679022595256135)
MatchEventIndicator (5799): LastQuoteMsg
NoMDEntries (268): 1
Entry 1
MDEntryPx (270): 98890000000 (9889.0)
MDEntrySize (271): 296
SecurityID (48): 807004
RptSeq (83): 14273794
NumberOfOrders (346): 16
MDPriceLevel (1023): 2
MDUpdateAction (279): Change
MDEntryType (269): Offer
Message 2 of 2: TID 32 (MDIncrementalRefreshBook) v6
TransactTime (60): 02/05/2016 07:30:22.595256135 (1454679022595256135)
MatchEventIndicator (5799): LastImpliedMsg, EndOfEvent
NoMDEntries (268): 8
Entry 1
MDEntryPx (270): 475000000 (47.5)
MDEntrySize (271): 296
SecurityID (48): 817777
RptSeq (83): 1573080
NumberOfOrders (346): Null
MDPriceLevel (1023): 2
MDUpdateAction (279): Change
MDEntryType (269): ImpliedBid
Entry 2...
mdp_book_builder.py
mdp_book_builder.py是使用sbedecoder包为给定合同生成限制订单的示例。
有关使用mdp_book_builder.py的帮助:
mdp_book_builder.py --help
版本控制
sbedecoder支持字段、枚举数、组等的sinceversion
属性,因此它可以
解码旧的(例如存档的)二进制数据,只要模式已经正确地发展以保持支持
对于旧格式
性能
sbedecoder本身并没有针对性能进行优化,但是它可以满足简单的后验场景amd 交易后分析。由于mdp_u decoder.py执行的打印量很大,因此解析大型 PCAP文件。
皮比
为了提高性能(4到5倍),sbedecoder将在pypy下运行。假设pypy安装在/opt:
from sbedecoder import SBESchema
schema = SBESchema()
schema.parse('path/to/schema.xml')
0
代码生成
sbe类生成器脚本可用于生成一个python文件,该文件包含与 通过sbeschema.parse方法动态创建的。
有关使用sbe_class_generator的帮助。py:
from sbedecoder import SBESchema
schema = SBESchema()
schema.parse('path/to/schema.xml')
1
用法是(从生成器目录):
/sbe_class_generator.py--schema schema.xml--output generated.py--template./sbe_message.tmpl
此命令将输出一个名为generated.py的文件,其中包含动态创建的类定义 分析"schema.xml"文件时。用于生成类的模板文件包含在sbe_message.tmpl中。
生成的.py文件可以简单地用于检查类构造,也可以替换 在sbedecoder核心项目中生成.py文件。通过替换sbedecoder包中生成的.py文件, 开发人员可以访问IDE中的类定义。
为了使用生成代码的标准解析器功能,应该使用sbeschema.load 方法而不是解析方法。
下面是一个如何执行此操作的示例,该示例包含在mdp_book_builder.py脚本中:
from sbedecoder import SBESchema
schema = SBESchema()
schema.parse('path/to/schema.xml')
2