999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于混合編程的高性能數(shù)據(jù)通信方法

2024-06-01 00:00:00丁嬌
現(xiàn)代信息科技 2024年3期

收稿日期:2023-06-28

DOI:10.19850/j.cnki.2096-4706.2024.03.011

摘" 要:行情數(shù)據(jù)特別是高頻數(shù)據(jù)是量化交易和研究的發(fā)動機,然而目前國內(nèi)高頻量化交易處于起步階段,機構(gòu)的業(yè)務人員大多缺乏IT專業(yè)能力,只有一些Python語言基礎。但是市場上的高頻行情數(shù)據(jù)SDK一般都是C++或Java語言開發(fā)的,暫無支持高頻行情的Python-SDK。針對市場亟需一款能夠處理高頻數(shù)據(jù)的Python-SDK的痛點,方案提出的高性能Python-SDK,采用C++和Python混合編程的方式,既保留了Python語言特性,便于業(yè)務人員獲取行情數(shù)據(jù)和對接量化交易,又兼顧了高頻行情的性能要求,能達到15萬TPS的處理性能,比純Python實現(xiàn)的SDK性能提升近10倍,比Java和Python混合編程實現(xiàn)的SDK性能提升5倍,滿足高頻行情的處理需求。

關(guān)鍵詞:Python-SDK;高性能;高頻行情;混合編程

中圖分類號:TP311" " 文獻標識碼:A" " 文章編號:2096-4706(2024)03-0050-04

High Performance Data Communication Method Based on Hybrid Programming

DING Jiao

(Key Laboratory of Radar Imaging and Microwave Photonics Technology, Ministry of Education (Nanjing University of Aeronautics and Astronautics), Nanjing" 210016, China)

Abstract: Market data, especially high-frequency data, is the engine for quantitative trading and research. However, at present, high-frequency quantitative trading in China is in its early stages, and most of the business personnel of institutions lack IT professional skills, with only some Python language foundation. But the high-frequency market data SDK in the market is generally developed in C++ or Java language, and there is currently no Python-SDK that supports high-frequency market data. In response to the urgent need for a Python-SDK capable of processing high-frequency data in the market, this solution proposes a high-performance Python SDK that adopts a hybrid programming method of C++ and Python. It not only retains the characteristics of the Python language, making it easy for business personnel to obtain market data and engage in quantitative trading, but also takes into account the performance requirements of high-frequency market. It can achieve processing performance of 15w TPS, which is nearly 10 times better than the SDK performance implemented in pure Python, and improves 5 times compared to SDK performance implemented by Java and Python hybrid programming. It meets the processing needs of high-frequency market.

Keywords: Python SDK; high performance; high frequency market; hybrid programming

0" 引" 言

國外量化金融領(lǐng)域發(fā)展日趨成熟,程序化交易便占據(jù)了市場交易量的70%以上。由西蒙斯創(chuàng)辦的文藝復興科技公司依靠量化交易,在金融危機的浪潮中,年收益高達80%。隨著人工智能及數(shù)字經(jīng)濟的發(fā)展,國內(nèi)大量的金融機構(gòu)開始從傳統(tǒng)的證券投資向量化交易轉(zhuǎn)型。作為量化交易的發(fā)動機,行情數(shù)據(jù)的質(zhì)量與時效性對量化策略的執(zhí)行效果有著決定性作用。由于高頻行情頻次更新快,可提供更豐富的行情數(shù)據(jù),是大部分量化策略的首選數(shù)據(jù)源[1]。

市場上通常以SDK的形式為用戶提供行情推送服務;由于高頻行情數(shù)據(jù)量大,而且量化交易對行情延遲非常敏感,因此市場上的SDK一般都是C++和Java語言。然而,C++、C#、Java等編譯型計算機編程語言性能突出,但對使用者的計算機能力要求高;而Python作為一種腳本語言,入門難度低,同時集成了大量的量化算法庫,則是量化研究人員的首選語言。因此,高性能的Python-SDK一直是量化研究人員非常迫切的需求。

Python實現(xiàn)的純Python的SDK(以下簡稱Python版SDK),和Python與Java的混合編程實現(xiàn)的Python的SDK(以下簡稱Java版SDK),前者由于Python的GIL和垃圾回收等先天缺陷,甚至無法實時處理全市場行情切片數(shù)據(jù);后者雖然底層的網(wǎng)絡通信、解壓、序列化等操作均由Java實現(xiàn),但由于Python的運行時環(huán)境與Java的運行時環(huán)境相互獨立,在數(shù)據(jù)交互的時候采用進程間通信的方式處理,會產(chǎn)生較多耗時,因此仍無法處理逐筆數(shù)據(jù),并且在脈沖式數(shù)據(jù)爆發(fā)階段延時過高,無法滿足實時性需求。

本方案提出的Python-SDK,是在現(xiàn)有C++SDK的基礎上自研的一版基于混合編程的高性能Python行情接收SDK。該版本的Python-SDK能夠滿足用戶對高頻行情的處理需求,相較于純Python版SDK的TPS提升了500%,平均數(shù)據(jù)處理耗時減少了40%;為了提升Python-SDK的用戶體驗,基于mypy為Protoc生成的Python文件提供了類型注釋[2]。除此之外,本方案的混合編程方式,還非常便于后續(xù)的維護和升級。

1" 技術(shù)實現(xiàn)

Python-SDK性能提升策略的主要邏輯是軟件架構(gòu)的分層設計,網(wǎng)絡層和數(shù)據(jù)層通過編譯型語言提升性能,表示層通過腳本型語言優(yōu)化交互,簡化使用。如何減少編譯型語言與腳本語言之間的數(shù)據(jù)交互耗時,以及語言之間非兼容特性之間的協(xié)調(diào)與轉(zhuǎn)化是本次策略的主要技術(shù)難點。

1.1" 數(shù)據(jù)底層交互與零延時傳遞

行情接收SDK需要對高頻海量數(shù)據(jù)進行實時網(wǎng)絡接收、解碼、解壓縮、反序列化等一系列復雜處理,對程序的高并發(fā)處理能力提出了考驗。同時,由于行情數(shù)據(jù)與交易強相關(guān),在使用中不允許出現(xiàn)數(shù)據(jù)丟失現(xiàn)象,但用戶解析處理行情的速度往往慢于后臺接收速度,這就要求SDK內(nèi)部有一個高性能的緩沖隊列。

但純Python版SDK在復雜計算時的效率略低于常見的編譯型語言。并且在高性能無鎖隊列方面,Python目前沒有成熟的解決方案。在使用Python原生隊列同時進行讀寫操作時,峰值TPS僅10萬次/秒[3],遠遠無法滿足全市場行情的處理需求。

考慮到Python本身就是一個C庫,真正的Python實體在動態(tài)鏈接庫中實現(xiàn),這就意味著Python程序可以與C++程序共用內(nèi)存空間。利用已有的C++SDK動態(tài)鏈接庫處理耗時過程,在C++SDK中回調(diào)Python程序中的函數(shù)。通過這種方式,行情數(shù)據(jù)作為一段內(nèi)存在C++程序與Python程序中共享,在實現(xiàn)后臺處理與前端應用分離的同時,實現(xiàn)數(shù)據(jù)的零延時傳遞。

1.2" 參數(shù)及接口封裝

由于C++ SDK參數(shù)類型與接口邏輯復雜,涉及STL容器類型、二維指針、引用、Protobuf對象等數(shù)據(jù)傳遞,以及回調(diào)函數(shù)、繼承等接口處理[4]。需要對原有C++SDK進行數(shù)據(jù)轉(zhuǎn)換及接口封裝,并對語言轉(zhuǎn)換工具進行調(diào)整及拓展。

1.2.1" STL容器類型

由于C++和Python對于容器的實現(xiàn)邏輯是不一致的,且存在大量的類函數(shù),無法通過類型轉(zhuǎn)換或者指針強轉(zhuǎn)來實現(xiàn)數(shù)據(jù)傳遞。為了與C++SDK接口對齊,要求Python-SDK能夠使用并傳遞部分STL容器類型數(shù)據(jù)。

以Maplt;std::string,intgt;為例,首先需要對其進行重命名處理:template(StrIntMap)std::maplt;std::string,intgt;。在C++端創(chuàng)建對應的靜態(tài)指針,其次,實現(xiàn)對Map的基本功能函數(shù)進行封裝,如圖1所示,以Add函數(shù)為例。

1.2.2" Protobuf數(shù)據(jù)傳遞與回調(diào)函數(shù)封裝

在C++ SDK中,網(wǎng)絡層接收數(shù)據(jù)并進行解碼解壓后會形成一個Protobuf對象,將該Protobuf對象通過回調(diào)函數(shù)傳給用戶使用,這就導致在Python與C++交互時存在兩個問題,第一Python無法識別Protobuf數(shù)據(jù)結(jié)構(gòu),第二由于回調(diào)函數(shù)是在C++內(nèi)中作為成員函數(shù)實現(xiàn),Python并沒有方式能夠?qū)崿F(xiàn)調(diào)用類指針來進行函數(shù)回調(diào)[5]。

對于Python無法識別Protobuf數(shù)據(jù)結(jié)構(gòu)的問題,在處理中首先在C++SDK中利用Protobuf進行序列化,在Python中對數(shù)據(jù)流進行反序列化處理。但由于C++中的String類型與Python中的Byte數(shù)據(jù)并不能兼容,需要對Protobuf序列化后的String數(shù)據(jù)進行截取并分段傳遞[6],在Python中分段接收,在收取完畢后再進行發(fā)序列化操作。

對于Python無法通過類指針回調(diào)成員函數(shù)的問題,以數(shù)據(jù)回調(diào)成員函數(shù)為例,回調(diào)函數(shù)的封裝邏輯如圖2所示。

C++中回調(diào)Python中的類成員函數(shù)的底層邏輯是參考C++特有的虛函數(shù)表實現(xiàn)的。對于C++層,實現(xiàn)一個SwigDirector_Callback類,這個類繼承CallbackInterface接口和Swig工具中的Director類。SwigDirector_Callback類維護一個虛函數(shù)表,C++的調(diào)用方通過預先設定的索引值來動態(tài)獲取注冊在虛函數(shù)表中的函數(shù)指針,進行實現(xiàn)對應的函數(shù)回調(diào)。在Python層,對虛函數(shù)表進行一層封裝[7],如果PythonCallbackClassInterface存在子類,那么將回調(diào)子類函數(shù),否則回調(diào)父類函數(shù)。

1.3" 基于mypy的Python類型注釋

C++ SDK底層統(tǒng)一采用Protobuf進行網(wǎng)絡傳輸,既高效又方便。然而,由于Python是動態(tài)強類型語言,通過Protoc生成的Python對象文件沒有靜態(tài)類型注釋信息,從而導致生成的Proto對象沒有屬性提示信息,用戶往往需要對照Proto文件說明,才能理解Proto對象含義,非常不便于使用[8]。因此,我們使用mypy為Protobuf的Python函數(shù)聲明添加類型注釋,在生成Proto文件對應的*_Protobuf2.py文件時,自動在獨立文件(“*_Protobuf2.pyi文件”)中生成類型注解。mypy使用“函數(shù)注釋”這個Python 3的語法指定類型簽名,從而檢查程序類型的正確性[9]。而且,這些類型注解只會在運行類型檢測時提示,實際運行的時候不會發(fā)生作用,因此,程序不會有運行時的類型檢查開銷,從而在不改變Python動態(tài)類型的本質(zhì)和解釋器行為的前提下,讓Python獲得靜態(tài)類型系統(tǒng)所帶來的好處。

2" 效果評價

2.1" 性能效果評價

我們通過壓力測試,純Python版SDK的處理性能大約在1.5萬次/秒,無法滿足高頻行情的訂閱速度;Java版的Python-SDK能達到3萬次/秒的TPS性能,能夠滿足一般情況下的行情訂閱,但不能支持高頻行情的峰值性能要求;而Python-SDK能達到15萬次/秒的處理性能,能夠支持目前高頻行情的訂閱[10]。在盤中Java版Python-SDK、Python-SDK和C++ SDK訂閱全市場高頻行情的平均行情延遲對比,其中橫坐標為09:30~15:00的每分鐘時間,縱坐標為這一分鐘內(nèi)的平均延遲時間,由于時鐘偏差和交易所行情延遲波動,此處行情延遲并不代表SDK的絕對行情延遲,只作為相對行情延遲比較如圖3所示。(由于純Python版SDK不能支持全市場的高頻行情訂閱,故未參與本次比較)。可以看出,Java版Python-SDK行情延遲較大;而Python-SDK的延遲則明顯低于Java版Python-SDK[11],只略低于C++ SDK。各版本行情SDK的處理速度和相對延遲情況統(tǒng)計,如表1所示。

表1" 各版本行情SDK處理速度和延遲

行情SDK名稱 處理速度/(萬次/秒) 平均延遲/ ms

純Python版SDK 1.5

Java版Python-SDK 3 2 586

Python-SDK 15 1 017

C++ SDK 20 1 016

2.2" 開發(fā)和維護效果評價

Python-SDK底層由C++ SDK實現(xiàn),C++層不僅實現(xiàn)了用戶登錄鑒權(quán)、訂閱和回測等復雜的業(yè)務邏輯,而且解決了序列化和高性能無鎖隊列等多個性能問題。因此,在Python-SDK開發(fā)過程中,節(jié)省了重復處理業(yè)務邏輯和優(yōu)化性能的3~4個月的工作,而只需要花費3~4周生成Python調(diào)用接口和封裝Python的用戶調(diào)用邏輯。并且,我們?yōu)檫@部分生成調(diào)用接口和封裝用戶邏輯的步驟編寫了自動化腳本,從而后續(xù)升級時,能夠在完成C++ SDK后,快速完成Python-SDK的升級操作,不僅高效,而且保證了與C++SDK功能的一致性[12]。

3" 結(jié)" 論

Python作為量化交易主流的語言,有著較大的群眾基礎,其語法簡單,開發(fā)效率較高,量化交易生態(tài)完善,但是作為解釋性語言運行效率較低,其處理效率不足以支撐種類眾多的海量行情數(shù)據(jù),依賴C++SDK靜態(tài)類型語言提速。本方案的Python-SDK為C++轉(zhuǎn)Python的技術(shù)創(chuàng)新方案,為支持高性能處理的Python用戶提供了很好的解決方案,在控制開發(fā)和維護成本的基礎上,使用新的開發(fā)語言實現(xiàn)的復雜業(yè)務邏輯和性能要求,彌補了業(yè)內(nèi)Python語言的高性能SDK行情產(chǎn)品的缺失。

參考文獻:

[1] 董剛.銀行網(wǎng)點財務檢查環(huán)節(jié)中的Python應用 [J].金融科技時代,2023,31(9):73-78.

[2] 李婧,熊澤明,王斌.Python程序設計基礎教程 [M].成都:電子科技大學出版社,2020.

[3] 楊凱利,山美娟.基于Phython的數(shù)據(jù)可視化 [J].現(xiàn)代信息科技,2019,3(5):30-31+34.

[4] 于彤彤,基于人工智能和可視化技術(shù)的股票量化交易策略分析 [J].智庫時代,2020(9):49-50.

[5] 周迪民,歐嵬.基于大數(shù)據(jù)的計算機數(shù)據(jù)分析管理系統(tǒng)設計 [J].湖南科技學院學報,2020,41(5):64-66.

[6] 屈新懷,高萬里,丁必榮,等.基于聚類數(shù)和初始值的K-means算法改進研究 [J].組合機床與自動化加工技術(shù),2011(4):42-46.

[7] 王春麗,劉光,王齊.多因子量化選股模型與擇時策略 [J].東北財經(jīng)大學學報,2018(5):81-87.

[8] 顧綿雪,孫鴻宇,韓丹,等.基于深度學習的軟件安全漏洞挖掘 [J].計算機研究與發(fā)展,2021,58(10):2140-2162.

[9] 曾武序,錢文彬,王映龍,等.一種基于Python和BP神經(jīng)網(wǎng)絡的股票預測方法 [J].計算機時代,2018(6):72-75+80.

[10] 孫睿陽,方信昀.基于PyEcharts的計量測試數(shù)據(jù)可視化初探 [J].中國計量,2021(3):111-115.

[11] 余本國,劉寧,李春報.Python大數(shù)據(jù)分析與應用實戰(zhàn) [M].北京:電子工業(yè)出版社,2021.

[12] 楊迎.基于Python語言的Web數(shù)據(jù)挖掘與分析研究 [J].現(xiàn)代信息科技,2019,3(23):63-65.

作者簡介:丁嬌(1988—),女,漢族,江蘇南京人,實驗師,碩士,主要研究方向:雷達成像與微波光子技術(shù)教育部重點實驗室、電子信息工程學院實驗中心的管理與教學。

主站蜘蛛池模板: 国产又爽又黄无遮挡免费观看| 99精品一区二区免费视频| 亚洲国产精品人久久电影| 综合久久五月天| 国产精品成人一区二区不卡| 激情综合网址| AV在线天堂进入| 99这里精品| 这里只有精品免费视频| 亚洲啪啪网| 日韩色图在线观看| 无码中文AⅤ在线观看| 福利在线一区| 青青草欧美| 精品国产99久久| 97久久人人超碰国产精品 | 亚洲色偷偷偷鲁综合| 国产欧美日本在线观看| 97se亚洲综合在线天天| 国产日韩欧美成人| 国产永久免费视频m3u8| 日韩精品专区免费无码aⅴ | 色综合天天综合中文网| 一本综合久久| 亚洲婷婷丁香| 国产亚洲精品91| 久久国产精品嫖妓| 高清欧美性猛交XXXX黑人猛交 | 国产三区二区| 中文字幕免费播放| 日韩成人高清无码| 亚洲精品在线影院| 国产精品无码在线看| 精品国产成人a在线观看| 色偷偷一区| 伊人久久综在合线亚洲2019| 精品伊人久久久久7777人| 亚洲色图欧美在线| 狠狠色丁婷婷综合久久| 十八禁美女裸体网站| 2020精品极品国产色在线观看 | 亚洲三级影院| 99资源在线| 高清乱码精品福利在线视频| 人妻丰满熟妇啪啪| 亚洲AⅤ无码国产精品| 国产视频你懂得| 一区二区三区毛片无码| 高潮爽到爆的喷水女主播视频| 54pao国产成人免费视频| 久久国产精品国产自线拍| 色播五月婷婷| 亚洲欧美精品一中文字幕| 欲色天天综合网| 国产精品久久久久无码网站| 九九九九热精品视频| 亚洲一区二区约美女探花| 最新精品久久精品| 亚洲精品无码日韩国产不卡| 99热精品久久| 欧美日韩激情在线| 狠狠干综合| 久久五月视频| 制服丝袜一区| 少妇精品在线| 久久久久国产精品免费免费不卡| 高潮毛片免费观看| 精品国产女同疯狂摩擦2| 日韩av资源在线| 国产精品2| 日本欧美成人免费| 99尹人香蕉国产免费天天拍| 亚洲男人天堂网址| 国产97色在线| 国产va欧美va在线观看| 午夜精品久久久久久久无码软件| 国产资源免费观看| 中文字幕天无码久久精品视频免费| 国产成人av大片在线播放| 久久情精品国产品免费| 麻豆国产在线观看一区二区| 999在线免费视频|