[技術領域]
本發(fā)明涉及數(shù)據(jù)處理技術領域,具體來說是一種節(jié)省存儲空間的追溯資產(chǎn)所有權變更歷史的方法。
[
背景技術:
]
隨著無紙化交易的廣泛使用,大量金融資產(chǎn)開始擺脫實物憑證形式,以電子化的形式存在,典型例子如滬深交易所交易流通的無紙化證券。為了加強對金融資產(chǎn)交易的監(jiān)管,除了記錄、查詢歷史交易記錄之外,業(yè)務上存在追蹤特定資產(chǎn)所有權變更歷史的要求。不同于房產(chǎn)等實物資產(chǎn),電子化形式存在的金融資產(chǎn)具有所謂“可替換性”。同一銀行賬戶中存在的兩份1元錢彼此價值完全相同,類似地,股票中也存在“同股同權”的現(xiàn)象,同一類型的兩份股份價值完全相同,因此在完成支付、交收時買賣雙方都不在意究竟交換的是哪一份資產(chǎn)。由此,資產(chǎn)轉(zhuǎn)出方并不會在交易時主動指定具體是哪一份資產(chǎn)被轉(zhuǎn)移,此時就由技術系統(tǒng)按某種策略來替用戶來指派轉(zhuǎn)讓的是哪幾份資產(chǎn),并基于此對特定資產(chǎn)所有權變更歷史進行追蹤。
具體實現(xiàn)方法上,以股票為例,目前支持追溯股票交易歷史信息的方法是通過“一票一號”的方式,就是對每股股票進行編號(類似每張人民幣上的鈔票編號),這個編號具有全局唯一性,根據(jù)這個唯一編號可以定位單位股票的交易歷史信息。此方法雖然簡單易行,但按照這種方式,不管某次交易含有多少股股票,對每一股股票都會產(chǎn)生一筆所有權變更記錄,然后才能根據(jù)此追溯所有權變更歷史。如果資產(chǎn)的最小分割單位很小,比如用來追蹤美元資產(chǎn)的所有權變更歷史,對于每一美分就都要有一個編號,一方面存儲空間急劇增加,另一方面美分上也并無編號,因此存在很大的問題。
[
技術實現(xiàn)要素:
]
本發(fā)明的目的在于解決現(xiàn)有技術的不足,提供一種節(jié)省存儲空間的追溯資產(chǎn)所有權變更歷史的方法,通過一個金融資產(chǎn)買賣的累積量區(qū)間,得到該區(qū)間所對應的金融資產(chǎn)來源于哪幾筆買入或賣出交易,該賬戶的買入或賣出交易,也是交易對手方的賣出或買入交易,所以根據(jù)每筆買入或賣出交易,可以得到交易對手方的一個買賣累積量區(qū)間,如此循環(huán)往復,即可追溯所有股票的轉(zhuǎn)手歷史信息。
為了實現(xiàn)上述目的,設計一種節(jié)省存儲空間的追溯資產(chǎn)所有權變更歷史的方法,其特征在于采用先進先出的策略完成金融資產(chǎn)的交易并統(tǒng)計每個賬戶的買入累積量和賣出累積量,給出待求賬戶的任意買入累積量區(qū)間或賣出累積量區(qū)間,該買入累積量區(qū)間或賣出累積量區(qū)間必定與至少一個來源賬戶的賣出累積量區(qū)間或買入累積量區(qū)間相對應,根據(jù)相對應的累積量區(qū)間即能追溯到給出的待求賬戶任意買入累積量區(qū)間或賣出累積量區(qū)間內(nèi)金融資產(chǎn)的來源。
所述的統(tǒng)計每個賬戶的買入累積量和賣出累積量具體是指:在數(shù)據(jù)庫中為每個賬戶設有一個買入累積量字段和賣出累積量字段,字段中包括每筆交易的交易流水號和當前累積量數(shù)據(jù),數(shù)據(jù)庫按照交易發(fā)生的順序分別記錄買入累積量和賣出累積量的數(shù)據(jù)變化。所述的數(shù)據(jù)庫還記錄有每筆交易的金融資產(chǎn)代號,賬戶信息以及交易量。
追溯給出的待求賬戶任意累積買入量區(qū)間或累積賣出量區(qū)間內(nèi)金融資產(chǎn)來源的步驟具體如下:
a.給出待求賬戶一項金融資產(chǎn)的買入累積量區(qū)間或賣出累積量區(qū)間[x,y];
b.查找并得到買入累積量區(qū)間或賣出累積量區(qū)間[x,y]所對應的至少一筆交易的交易流水號及與交易流水號對應的買入累積量區(qū)間或賣出累積量區(qū)間;
c.根據(jù)交易流水號追溯到來源賬戶,根據(jù)與交易流水號對應的買入累積量區(qū)間或賣出累積量區(qū)間得到來源賬戶的賣出累積量區(qū)間或買入累積量區(qū)間。
在完成步驟a-c之后重復步驟b-c,能繼續(xù)向前追溯交易來源,直至追溯到待求賬戶買入累積量區(qū)間或賣出累積量區(qū)間[x,y]的原始來源。
所述的步驟a的函數(shù)原型:
f(a,stockid,[x,y])=((txid1,[累積量區(qū)間1]),(txid2,[累積量區(qū)間2])…);
其中a為待求賬戶的賬戶代號,stockid為金融資產(chǎn)代號,txid為交易流水號。
所述的步驟b具體如下:
使用二分法查找inacculist.get(i).inaccuamt>=x并且
inacculist.get(i-1).inaccuamt<x的下標i,
如果inacculist.get(i).inaccuamt>y,則txid=inacculist.get(i).txid的累積量區(qū)間是[x,y];
否則如果inacculist.get(i+1).inaccuamt>y,
則txid1=inacculist.get(i).txid,
累積量區(qū)間1是[x,inacculist.get(i).inaccuamt],
txid2=inacculist.get(i+1).txid,
累積量區(qū)間2是(inacculist.get(i).inaccuamt,y],
根據(jù)下標i遞增依次尋找對應的交易流水號和與交易流水號對應的累計量,直到inacculist.get(j).inaccuamt>y,則
txid1=inacculist.get(i).txid
累積量區(qū)間1是[x,inacculist.get(i).inaccuamt]
txid2=inacculist.get(i+1).txid
累積量區(qū)間2是(inacculist.get(i).inaccuamt,y]
txidn=inacculist.get(j).txid
累積量區(qū)間n是[inacculist.get(j).inaccuamt,y]
式中:inacculist.get(i).inaccuamt是指第i筆交易之后的賬戶買入累積量或賣出累積量的值,inacculist.get(i).txid是指第i筆交易的交易流水號。
所述的步驟c具體如下:根據(jù)交易流水號追溯到來源賬戶,步驟b將待求賬戶的買入累積量或賣出累積量區(qū)間劃分為來源于至少一筆交易的買入累積量或賣出累積量區(qū)間,設定其中每筆交易的買入累積量或賣出累積量區(qū)間為[m,n],根據(jù)每筆交易的買入累積量或賣出累積量區(qū)間[m,n]可以獲得該筆交易來源賬戶的賣出累積量或買入累積量區(qū)間:
[outaccuamt.curraccuamt-(inaccuamt.curraccuamt-m),outaccuamt.curraccuamt-(inaccuamt.curraccuamt-n)]。
另一優(yōu)選的實施方式是,追溯給出的待求賬戶任意累積買入量區(qū)間或累積賣出量區(qū)間內(nèi)金融資產(chǎn)來源的步驟具體如下:
a.根據(jù)數(shù)據(jù)庫中的交易記錄獲得交易買入方和賣出方的信息,根據(jù)金融資
產(chǎn)代號獲得交易買入方和賣出方的累積量集合;
b.根據(jù)交易流水號獲得買入方和賣出方該筆交易的買入累積量和賣出累積量信息;
c.根據(jù)查詢到的賣出交易累積量可以獲得來源賬戶的賣出交易累積量區(qū)間。
本發(fā)明同現(xiàn)有技術相比,其優(yōu)點在于:不需要對每一份金融資產(chǎn)或者每一分錢進行編號,只需要通過很小的字段記錄交易累積量,從而節(jié)省了大量存儲空間,又能依據(jù)先進先出策略完成資產(chǎn)轉(zhuǎn)讓時的指派,且能高效支持對于任意指定資產(chǎn)的所有權變更歷史的追溯,極大地節(jié)約了數(shù)據(jù)的存儲空間,對于單筆交易金額或交易量較大的業(yè)務場景,存儲空間的節(jié)省尤其明顯。
[附圖說明]
圖1是本發(fā)明發(fā)法的追溯示意圖;
圖2是實施咧1中本發(fā)明發(fā)法的追溯示意圖;
圖3是實施例2中本發(fā)明發(fā)法的追溯示意圖。
[具體實施方式]
下面結(jié)合附圖對本發(fā)明作進一步說明,這種方法的原理對本專業(yè)的人來說是非常清楚的。應當理解,此處所描述的具體實施例僅僅用以解釋本發(fā)明,并不用于限定本發(fā)明。
本發(fā)明方法采用先進先出的策略,即對于特定賬戶持有的特定資產(chǎn),總是按其收入的順序被轉(zhuǎn)讓出去,比如5天前轉(zhuǎn)入的資產(chǎn)會比2天前轉(zhuǎn)入的資產(chǎn)先轉(zhuǎn)讓出去。
參見圖1,以股票交易為例,txid=10@100股中txid表示交易流水號,100股代表該筆交易賣出了100股,該筆交易對應的累積量是180,其表示的是該交易對應的累積賣出量,也就是截止到本筆交易總共賣出了180股。a持倉賬戶下面的一條指向下方的線表示累積量,累積量按照箭頭所指的方向單調(diào)遞增,右側(cè)的帶箭頭的線表示買入交易,左側(cè)帶箭頭的線表示賣出交易,以a賬戶為例,圖一中a賬戶累積量線上左側(cè)的坐標值80,180,400表示累計賣出量,右側(cè)的100,300,530代表累計買入量。對于任意一個累積量區(qū)間,所述的累積量區(qū)間包括買入累積量區(qū)間和賣出累積量區(qū)間,以a賬戶的買入累積量區(qū)間[180,400]為例,其對應的交易來源是(txid=7,[180,300])和(txid=8,(300,400]),其中(txid=7,[180,300])代表a賬戶累積量為180到300的股票來源于交易流水號為txid=7的交易,并且是交易txid=7的后120(300-180=120)股股票。
數(shù)據(jù)結(jié)構設計如下:
式中,accuamt是交易累積量類,有兩個字段,txid表示交易流水號,curraccuamt表示當前累積量,包括買入累積量和賣出累積量。
account表示用戶的賬戶類,有兩個字段,inaccumap按照stockid存儲買入交易累積量list集合,outaccumap按照stockid存儲賣出交易累積量list集合。這里的list集合中的數(shù)據(jù)是按照交易發(fā)生的順序添加。
txrecord表示交易記錄類,txid表示交易流水號,stockid表示股票編號,from表示賣出方,to表示買入方,txamt表示交易量。
對于a賬戶某一股票編號stockid的任意一個累計賣出量區(qū)間[x,y],追蹤該批股票轉(zhuǎn)手歷史的方法如下。
函數(shù)原型:f(a,stockid,[x,y])=((txid1,[累積量區(qū)間1]),(txid2,[累積量區(qū)間2])…)
step1:根據(jù)stockid獲得inacculist=a.inaccumap.get(stockid);
step2:二分法查找inacculist中inacculist.get(i).inaccuamt>=x并且inacculist.get(i-1).inaccuamt<x的下標i,
如果inacculist.get(i).inaccuamt>y,
則txid=inacculist.get(i).txid的累積量區(qū)間是[x,y];
否則如果inacculist.get(i+1).inaccuamt>y,
則txid1=inacculist.get(i).txid,
累積量區(qū)間1是[x,inacculist.get(i).inaccuamt];
txid2=inacculist.get(i+1).txid,
累積量區(qū)間2是(inacculist.get(i).inaccuamt,y];
否則…
根據(jù)下標i遞增依次尋找買入交易記錄,直到
inacculist.get(j).inaccuamt>y,則
txid1=inacculist.get(i).txid,
累積量區(qū)間1是[x,inacculist.get(i).inaccuamt];
txid2=inacculist.get(i+1).txid,
累積量區(qū)間2是(inacculist.get(i).inaccuamt,y];
txidn=inacculist.get(j).txid,
累積量區(qū)間n是[inacculist.get(j).inaccuamt,y]。
step3:根據(jù)累積量區(qū)間獲得的交易記錄歷史信息和累積量區(qū)間是:
[txid1,累積量區(qū)間1],…,(txidn,累積量區(qū)間n]。
待求賬戶a的一個買入交易記錄和累積量區(qū)間,即(txrecord,[m,n]),[m,n]表示該筆交易對應的累積量區(qū)間區(qū)間,追溯該交易的股票來源于來源賬戶b的累積賣出量區(qū)間。因為txrecord對象和txid一一對應,為了表述方便,采用(txid,[m,n])形式。
函數(shù)原型是f(txid,[m,n])=[累積量區(qū)間]。
實施例1
參見圖2,可得f(txid=7,[m,n])=[230-(300-m),230-(300-n)],追溯步驟如下:
step1:根據(jù)交易記錄對象txrecord獲得交易買入方和賣出方的信息,
買入方賬戶為:inaccount=txrecord.to,
賣出方賬戶為:outaccount=txrecord.from,
根據(jù)股票編號stockid獲得交易買入方和賣出方的累積量集合:
inacculist=inaccount.inaccumap.get(txrecord.stockid),
outacculist=outaccount.outaccumap.get(txrecord.stockid),
step2:根據(jù)交易流水號txrecord.txid可以分別從inacculist和outacculist獲得買入方和賣出方該筆交易的累積量信息inaccuamt和outaccuamt。
買入方該筆交易發(fā)生后對應的累積量:inaccuamt.curraccuamt,
賣出方該筆交易發(fā)生后對應的累積量:outaccuamt.curraccuamt。
step3:根據(jù)查詢到的賣出交易累積量可以獲得賬戶b的賣出交易累積量區(qū)間。
累積量區(qū)間起點是outaccuamt.curraccuamt-(inaccuamt.curraccuamt-m),
累積量區(qū)間終點是outaccuamt.curraccuamt-(inaccuamt.curraccuamt-n)。
綜上所述,對于任一個累計交易量區(qū)間,都可以找到該區(qū)間所對應的所有買入交易歷史信息和相應累積量區(qū)間,對于任意一次交易和相應的累積量區(qū)間,都可以追溯其來源哪一個累計交易量區(qū)間。如此循環(huán)往復即可實現(xiàn)每一筆股票交易的溯源。
實施例2
待求賬戶a和來源賬戶b的對股票stockid持倉的歷史交易信息如圖三所示,追溯a賬戶買入累積量[260,530]的歷史交易信息。
step1:根據(jù)stockid獲得a賬戶的買入累積量集合,
inacculist=a.inaccumap.get(stockid)。
step2:二分法查找inacculist集合中使得:
inacculist.get(i).curraccuamt>260,
inacculist.get(i-1).curraccuamt<260。
得到i=3,即txid=7的那筆交易,
因為inacculist.get(3).curraccuamt<530,
所以累積量區(qū)間是[260,inacculist.get(3).curraccuamt],即[260,300]。
當i=4時,即txid=8那筆交易,
因為inacculist.get(4).curraccuamt<530,
所以累積量區(qū)間是(inacculist.get(3).curraccuamt,inacculist.get(4).curraccuamt],即(300,450]。
當i=5時,即txid=9那筆交易,
因為inacculist.get(5).curraccuamt=650>530,
所以累積量區(qū)間是(inacculist.get(4).curraccuamt,530]。
綜上所述,a賬戶累積量區(qū)間[260,530]所對應的股票來源于:
txid=7,累積量區(qū)間1是[260,300],
txid=8,累積量區(qū)間2是(300,450],
txid=9,累積量區(qū)間3是(450,530],
step3:對于txid=7,該交易對應的a賬戶的累積量區(qū)間[260,300],追溯該筆交易來源于哪個賬戶的哪個累積量區(qū)間,
根據(jù)txid,得到交易對手方是b,
根據(jù)stockid獲得賬戶b的賣出累積量集合,
outacculist=b.outaccumap.get(stockid)
根據(jù)txid獲得賬戶b該筆交易對應的累積量對象
accuamt=outacculist.get(stockid)
則accuamt.curraccuamt就是交易txid=7對應的b賬戶的累積量,由上圖知accuamt.curraccuamt=230,
則交易txid=7對應的b賬戶的累積量區(qū)間是[230-(300-260),230],即[190,230]。
所以txid=7,a賬戶的累積量區(qū)間是[260,300]所對應的股票來源是b賬戶累積量區(qū)間是[190,230)所對應的股票。
同理,可以追溯txid=8,累積量區(qū)間是(300,450],txid=9,累積量區(qū)間是(450,530],來源于哪個賬戶,以及相應賬戶的累積量區(qū)間。