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