日前大立光盤中交易短短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),檢驗系統是否會出現異常。


Advertisement

更多 iThome相關內容