上海期貨交易所 孫 偉
近年來,隨著期貨市場的發展,以及國內外錯綜復雜的宏觀微觀各種因素的影響,期貨合約價格的波動幅度逐漸加大,市場各方所面臨的風險概率也同步上升。為此,交易所非常有必要建設一個全方位的風險防范與化解工具。強制減倉系統是化解系統性市場風險的一個終極又有效的工具。
本文著重論述了準確的凈持倉盈虧計算和合理的平倉數量分配方法,以及高效算法的實現。以此構建的強制減倉系統在2008年有色金屬期貨極端行情下得到應用,及時、合理、有效地化解了系統性風險,具有行業推廣價值。
強制減倉是交易所風險控制措施中的一種,是指在極端行情發生時,交易所通過既定規則對深度虧損的客戶倉位和盈利方客戶的對手倉位進行平倉,從而及時止損,防范大規模違約事件發生,保護期貨市場健康運行。
以上海期貨交易所有色品種為例,強制減倉的執行方法是將D3交易日閉市時(強減合約D1,D2,D3連續三日發生同方向單邊市)以停板價申報的未成交平倉報單,以D3交易日的停板價與該合約凈持倉盈利客戶按持倉比例自動撮合成交;同一客戶持有雙向持倉的,則其凈持倉部分的平倉報單參與強制減倉計算,其余平倉報單與其對鎖持倉自動對沖成交[1]。整個系統實現的難點是算法梳理和大數據量高效運算。
強制減倉系統的關鍵算法內容有兩個,一是準確計算客戶凈持倉盈虧,二是公平合理分配平倉數量。因此系統應具有兩個關鍵模塊:凈持倉盈虧計算和平倉數量分配。
盈虧計算模塊用于計算每個會員客戶每個合約當日的單位凈持倉盈虧和盈虧率,以此作為對客戶風險的評判依據。
客戶單位凈持倉盈虧計算流程如下[2]:
(1)根據平今數據調整客戶當天開倉明細。
(2)根據平昨數據更新客戶當前持倉明細。
(3)根據移倉流水更新客戶當前持倉明細。
(4)計算客戶單位凈持倉盈虧及盈虧率。
為了提高計算客戶凈持倉盈虧的效率,可以保留客戶當前持倉明細,下一交易日根據平今、平昨數據以及移倉流水調整客戶當前持倉明細,避免每次重復從歷史成交表獲取開倉明細。
客戶當前持倉明細分為總持倉明細、投機持倉明細及套保持倉明細,保留了從合約上市日到當天滿足客戶當前持倉量的多方和空方的歷史開倉明細。
(1)凈持倉盈虧的計算時間
每日凈持倉盈虧的計算時間在交易確認完成后開始。
(2)根據平今數據更新客戶當前持倉明細
(a)首先獲取客戶當天平今量,對客戶當天的開倉記錄進行平倉。
(b)平倉遵循先開先平原則。
(c)對客戶當天開倉記錄進行平倉操作,每平完一條當天開倉記錄,從當天開倉明細中刪除該條記錄,平今量遞減,當平今量小于某條記錄的開倉量時,將該條記錄的開倉量更新為開倉量-平今量。
(d)做完以上操作后的當天開倉明細即為平今操作后客戶的當天新開倉的持倉明細,追加到相應的當前持倉明細。
(3)根據平昨數據更新客戶當前持倉明細
(a)首先獲取客戶當天平昨量,對客戶歷史開倉明細記錄進行平倉。
(b)平倉遵循先開先平原則。
(c)對客戶歷史開倉記錄進行平倉操作,每平完一條歷史開倉記錄,從客戶當前持倉明細中刪除該條記錄,平昨量遞減,當平昨量小于歷史某條記錄的開倉量,將該條記錄的開倉量更新為開倉量-平昨量。
(d)做完該操作后的客戶當前持倉明細即為平昨操作后客戶的當前持倉明細。
(4)根據移倉流水更新客戶當前持倉明細
若客戶當天有移倉數據,需對當前持倉明細進行更新操作。
(5)凈持倉盈虧計算
客戶單位凈持倉盈虧分為三類:總凈持倉盈虧、投機凈持倉盈虧以及套保凈持倉盈虧。計算公式如下:
(a)客戶持倉均價=Σ(客戶凈持倉方向的開倉量*開倉價格)/客戶凈持倉量。
(b)客戶單位凈持倉盈虧=當前結算價-客戶持倉均價。
(c)客戶單位凈持倉盈虧率=客戶單位凈持倉盈虧/當前結算價。
上述公式中持倉均價計算方法如下:
i.確定凈持倉方向。獲取客戶凈持倉量,即客戶的多頭持倉量減空頭持倉量。若凈持倉量值>0,則為多方;若凈持倉量<0,則為空方;若凈持倉量=0,則該客戶盈虧和盈虧率都設置為0。
ii.根據客戶凈持倉方向從客戶當前持倉明細中按交易日、成交編號降序,逐條獲取開倉量和開倉價,凈持倉量遞減;若凈持倉量小于與某條記錄的開倉量時,則將最后獲取的該條記錄開倉量更新為剩余凈持倉量,用于計算持倉總成本。經過以上操作,即獲取到了滿足該客戶凈持倉量的所有開倉數據。
iii.計算客戶持倉均價,以及客戶單位凈持倉盈虧和盈虧率。
當市場出現連續單邊市、風險不斷累積形成系統性風險時,交易所可以依據交易規則對特定合約上的多空頭寸進行非交易平倉,及時釋放市場風險。
強制減倉的執行流程如下:
(1)判斷是否滿足強制減倉條件。
待減倉合約連續出現三個同方向單邊市(D1,D2,D3)。
(2)確定平倉范圍
虧損方:在D3交易日收市后,以漲跌停板價申報無法成交的,且客戶該合約的單位凈持倉虧損大于或等于D3交易日結算價6%的所有申報平倉單為待平倉有效報單[1]。
盈利方:凡是該合約客戶單位凈持倉盈利的投機持倉和客戶單位凈持倉盈利大于等于D3交易日結算價6%的保值持倉都屬于待平倉的持倉范圍[1]。
(3)內部對沖或者對鎖
內部對沖分為以下二步:
(a)對持有雙向持倉,有未成交停板價報單且虧損的客戶:
i.根據未成交投機報單對沖相應的投機持倉,并生成平倉成交;
ii.根據未成交套保報單對沖相應的套保持倉,并生成平倉成交;
iii.如果還有未成交報單,并且還有雙向持倉,則投機和套保相互對沖,并生成平倉成交,內部對沖結束;
iv.對于虧損大于等于6%的客戶,最后剩余未成交報單參與強制減倉平倉分配;對于虧損小于6%的客戶,最后剩余未成交報單不參與強制減倉平倉分配。
(b)對于持有雙向頭寸,不管有無停板價報單且有盈利的客戶,內部對鎖:
i.對鎖投機持倉;
ii.對鎖套保持倉;
iii.如果還有雙向持倉,則投機和套保相互對鎖;
iv未被鎖倉的盈利方持倉將參與強制減倉平倉分配。
(4)分配平倉及生成平倉成交
在內部對沖或對鎖后如果有效未成交報單量仍然大于零,則進行分配平倉操作。分配平倉量的原則如下:
在平倉范圍內按盈利的大小和投機與保值的不同分成四級,逐級進行分配,具體分配量按剩余申報平倉數量與各級可平倉的盈利持倉量數量之比來計算。對于配對的結果,生成相應的平倉成交。
(5)平倉數量尾數的處理方法
首先對該級別每個客戶按照小數部分由大到小的順序進行排序,然后按照該排序的順序進行分配,每個客戶1手;對于小數部分相同的客戶,如果分配數量不足,則按持倉時間的先后順序進行分配。
整個系統除了業務規則復雜,需要保證準確性外,另一重要特性是計算量大,且需要在盡可能短的時間內完成強制減倉處理,否則會影響正常結算。
系統中計算最耗時的模塊是凈持倉盈虧計算模塊。交易所客戶數量大,并仍在快速增長。交易的合約數量也在不斷增加,成熟市場如CME交易合約達數千個,國內交易所將來也會達到這個數量級。客戶單個合約的平均持倉時間約在3個月左右,而且幾乎每個交易日都有交易。此模塊要在如此海量數據的情況下準確計算總凈持倉、投機凈持倉及套保凈持倉這三類盈虧。又考慮到目前交易所都有連續交易,為確保連續交易的正常進行,盤后風控處理的時間盡可能不超過30分鐘。這意味著必須在30分鐘內將各分類凈持倉盈虧計算完畢,確定強制減倉分配額度,并完成分配。因此,計算效率非常重要,是系統設計的另一個關鍵點。
為了提高系統的計算速度,需要使用內存數據庫技術,運算能力相比傳統數據庫可以提高兩個數量級。同時采用分布式計算方式,并行分合約計算客戶凈持倉盈虧,分合約分配強制減倉額度。上海期貨交易所研發的內存數據庫(SMDB)實現了高效率大數據量的多頻次存取及運算。SMDB采用C++ STL提高性能,采用高效的內存管理方式,應用多級索引結構,有效地降低了內存消耗和提升了訪問效率,針對不同類型數據存取方式引入Hash、跳表和AVL樹等多種形式的索引,支持原子性訪問。服務器要求為CPU八核以上,處理器頻率不低于3G,內存不少于256G,磁盤空間2T左右。以上配備和設計在上海期貨交易所實測通過。
為此做了專門的數據存儲訪問效率實驗,在同一機型配置的情況下,選擇兩款主流高性能數據庫(通用型內存數據庫TimesTen和Oracle cache)做對比測試,測試方法是從近一年交易所歷史交易流水數據中進行查找、刪除和插入操作,基于同樣的字段構建索引,采用通用的SQL操作語句,表1所示是訪問效率對比表[3]:

表1 訪問效率對比表
準確的凈持倉盈虧計算是確定合理的參與強制減倉持倉范圍的基礎,高效的算法和系統處理能力是及時化解風險的保障。在極端行情發生時,系統性風險顯現,依此設計的強制減倉系統無疑起到定海神針的作用。在2008年10月有色品種期貨合約發生連續單邊市時,強制減倉系統發揮了預期作用。減倉后,沒有發生一起交收違約,也沒有一個客戶提出異議,有力地維護了期貨市場的穩定,對于解決類似風險問題積累了寶貴的經驗。強制減倉系統及其設計方法在行業極具推廣價值。