APP下载

证交所异常熔断触发关键,大立光股价乘百万倍导致内存溢位

消息来源:baojiabao.com 作者: 发布时间:2024-05-17

报价宝综合消息证交所异常熔断触发关键,大立光股价乘百万倍导致内存溢位

日前大立光盘中交易短短1个多小时内,触动台湾证券交易所(简称证交所)交易系统的熔断机制多达22次,引起市场一阵喧嚣,更有传出外力试图操控股价的阴谋论。

而事发隔天的1月9日,证交所也出面澄清,造成交易异常的原因,是出自价格稳定措施计算程式的设计有疏失,而股价交易价格经多次运算后,超过系统变数所能储存的最大值,导致内存溢位,才多次触发避免市场波动过大的熔断机制。

台湾证券交易所电脑规划部经理赵龙表示,证交所内部系统内,纪录股票交易价格的变数类型为32位元的无号整数(Unsigned Integer,UInt 32),而证交所选用整数变数的原因在于,浮点计算有误差值外,更可能发生系统误判情况。而UInt32此变数类型所能储存的数值,范围是介于0至4,294,967,295(2^32-1)。

而证交所股票交易变数的设计,事先就预留了小数点后三位,例如某公司股票为10元,系统则会将其标注为10.000元,同时,为了方便系统进行整数运算,还会额外乘上1,000倍,变成10,000。在交易系统发生异常的当日,大立光股票价格来到了4,150元。经过交易系统第一次的加工计算,此时,资料字段所记录的数值为4,150,000。

而为了避免股票市场发生产生过度动荡,在盘中瞬间价格稳定措施中规定,当股票试算后的成交价,与前一次成交价比较后,如果系统发现上下波动超过3.5%,此时便会暂停交易撮合2至3分钟。为了进行比较,交易系统会将股票交易价格变数的值乘上1.035(103.5%)来计算。但是,为避免因浮点数值运算而产生误差,交易系统还会将处理数值乘上1,000倍,亦即1,035倍而非只是乘以103.5%。此时,股票交易价格变数所储存的数值已经到达4,295,250,000,“变数值超过了UInt32型别的限制,进而产生溢位。”赵龙解释。

赵龙表示,在盘中交易时,证交所已经发现异常状况,但当时还未能判断系统何处发生异常,同时,证交所也得等待交易结束后才能紧急修改系统。

在交易结束之后,证交所的IT单位也下载当日的交易档案、股票撮合纪录,利用测试系统、模拟撮合系统进行测后,同样发生了交易异常状况。赵龙表示,此时相关人员便开始逐行检视程式,进行除错,并且发觉,该字段所产生数值会产生内存溢位,但由于其位于系统暂存区的堆叠(Stack)中,并不会特意将该值取出(Pop-up)。因此,平常测试过程中,并不会看见该字段显示的结果,“在测试我们定义的参数中,并没有看见任何异常状况。”

即使股票交易价格最终变数宣告为UInt64(储存最大值为2^64-1),仍然会出现计算异常状况,“因为中间的运算结果已经造成内存溢位。”因此,证交所股票交易系统的变数,从一开始就得宣告为UInt64。赵龙表示,过去证交所系统在进入正式环境前,也会利用过去两年内的交易资料,进行压力测试,“而我们只针对预留资料进行测试,忽略验证这些暂存资料。”

针对这次的风波,赵龙表示,证交所也已经要求IT单位人员,针对所有执行乘法运算的参数,必须全盘进行临界值测试(Boundry test),使用现阶段股票交易价格的最大值99万9999元,作为测试基准(benchmark),检验系统是否会出现异常。

2018-01-20 17:25:00

相关文章