項目地址:https://gitee.com/vnpycn/vnpy
網址:http://www.gencbio.com
快速入門: https://q.vnpy.cn/comm/thread-13-1-1.html
在新版VNPY3.0中,已經徹底放棄對數據庫的支持。
不少用戶肯定會問,沒有數據庫支持,還是一個專業的量化軟件嗎?數據該如何存儲?
國內證券和期貨軟件,比如恒生,大智慧,同花順,文華財經,金字塔均不需要用戶安裝數據庫
原因很簡單,就是數據庫太慢了。
有多慢呢?在我的單機環境下測試結果:
讀取性能:csv文件比關系型數據庫讀取速度快2個數量.
數據占用空間: csv文件只有關系型數據庫的 1/5~1/25。
NOSQL內存數據庫也只是相對比關系型數據庫快一點而已,并沒有本質區別。
即便是時序數據庫,性能也遠遠低于csv或hdf5文件格式。
是不是很顛覆三觀呢?
不得不提到某些鼓吹使用數據庫的量化平臺,鼓吹使用數據庫成為“割韭菜”的利器,促進了培訓課程銷售, 而這些培訓結構講師本身并不是依靠量化本身盈利。
用戶目的是為了學習搭建自己的量化平臺,而培訓結構是為了推銷課程,這種結果導向不一致,會讓用戶付出更多的學習成本,反而取得更差的效果。
參考技術測試文章一:這是pandas讀取csv和postgre,快10倍,這個測試因為是python,差距減小。 (如果要客觀的測試,就應該采用C++讀取csv和讀數據庫進行比較,而不做任何冗余的轉換流程,這樣既可以更精確的反映csv相對于數據庫的性能,據我們的測試結果比該參考技術測試文章的15~20倍的性能差距還要顯著增加) 《Pandas加載CSV的速度比SQL快 - IT屋-程序員軟件開發技術分享社區 》 Pandas加載CSV的速度比SQL快 - IT屋-程序員軟件開發技術分享社區?
www.it1352.com/2023780.html

參考技術測試文章二: 結論:這個測試csv比mysql快20倍,因為涉及spark轉換時間,所以只差20倍,如果忽視spanrk轉換,應該接近我說的2個數量級,csv比mysql性能優勢還要增加。 (如果要客觀的測試,就應該采用C++讀取csv和讀數據庫進行比較,而不做任何冗余的轉換流程,這樣既可以更精確的反映csv相對于數據庫的性能,據我們的測試結果比該參考技術測試文章的15~20倍的性能差距還要顯著增加) 與csv文件相比,將mysql表轉換為spark數據集的速度非常慢 - IT屋-程序員軟件開發技術分享社區?
www.it1352.com/959692.html

下面就來解釋一下原因。
數據庫需同時具備增、刪、改、查 功能,而我們對量化回測數據的要求是盡可能快的讀取數據
如同所示,這是csv文件格式和數據庫的特點對比。
采用csv或hdf5文件格式存儲,不僅更小的硬盤空間占用,還降低了讀寫數據IOPS的占用,
而且提高了讀取性能(大約比SQL SERVER快 2個數量級,內存數據庫差距會稍小,但代價是更大的內存占用),也降低了因為磁盤故障導致數據錯誤的可能。
量化回測時,數據是時間序列,需要連續讀取行情數據。
而數據庫通常屬于無序的文件組織方法并不是連續存放數據的,為了便于插入數據,數據庫通常中間還有無數據的填充空間。
這個性能降低在單機環境下測試比直接采用csv格式文件存儲慢接近100倍。
為了方便檢索數據,通常分為關系型數據庫和非關系型數據庫,一種是用索引的形式,一種是用HASH表的形式,這2種形式數據都不是按順序存放的,數據和數據之間都由填充空間。
即便是時序數據庫,性能也遠遠低于csv和hdf5文件的性能,使用也更復雜。
對量化交易回測來說,對行情數據的存儲根本不需要 刪、改、查功能。
拿期貨行情數據為例,通常我需要將實時行情存儲,如果我開啟一個策略,需要計算M10 周期最近100個周期的KDJ指標,那么我只要需要最近的100X10X60X2個TICK數據即可,我只需要按時間順序讀取最近的12萬個TICK。
如果是從數據庫讀取的話,需要通過select語句或存儲過程等方式 獲得記錄集,并逐條取出,這個過程是非常耗時的
這個過程是非常耗時的,并且每條記錄之間,按默認設置,數據庫為了便于插入數據,往往在記錄之間留有空白的存儲空間,往往按默認設置,80%的空間是無用
的,也就是說,本來你只需要1M的空間你,實際占了5M的硬盤空間。事實上,你可能并沒有插入數據的請求。因為行情數據存儲都是順序的,按時間順序寫入之
后,通常不需要再插入新的行情數據。
對“查”來說,也并不是逐條取得,通常是取一個時間段的數據,并不是數據庫方式的 “查”數據的方式。
而且由于數據庫的IO較慢。有人說,可以用內存數據庫啊,事實上內存數據庫會占用大量的內存空間,而且他的快也只是和關系型數據庫比,遠遠慢于CSV和hdf5格式。
用文件存儲是一個更好的選擇,事實上很多知名的股票軟件公司都采用文件存儲行情數據的。
比如文件存儲怎么做呢?
例如按一個規則制定:
比如rb2110的2021年6月5日的TICK行情數據,就存儲在
..\data\20211005\TICK\rb2110.csv 目錄的文件下
該文件將順序存儲當天的TICK數據。
當我需要讀取最近3天數據的時候,就按先后分別讀取
..\data\20211005\TICK\rb2110.csv
..\data\20211006\TICK\rb2110.csv
..\data\20211007\TICK\rb2110.csv
這3個文件即可, 每個文件逐行讀取。
如果需要進一步節省硬盤存儲空間,我可以將data文件夾設置為 壓縮屬性。
在沒有設置壓縮屬性的情況下,采用文件方式存儲數據大約占用硬盤空間是采用SQL Server默認設置的20%硬盤空間。
在設置了data文件夾的壓縮屬性的情況下,采用文件方式存儲數據大約占用硬盤空間是采用SQL Server默認設置的4%硬盤空間。
VNPY官網
http://www.gencbio.com

|