使用metabase做分析報表工具分析整體策略績效

張國平發表於2022-10-27

之前使用 vnpy 自帶的回測程式碼,和一些 python 自開發,可以分析單個策略績效。但是如果對於多個策略和合約投資,想從多個維度,可以靈活的按照自定義特性來分析,還是需要一些專業工具。

 

一開始想使用一些 python 相關的,比如 QuantStats ,是一個非常好的策略績效分析庫,但是功能其實類似與 vnpy 自帶,可以針對單個策略做全面分析,但是缺乏多維度,組合分析。

 

後來覺得還是使用專門的 BI 分析軟體,選擇推薦度很高的開源 metabase

 

這裡分出三步驟出來,

第一步是在 vnpy 裡面定時輸出分析資料表,比如每日賬戶頭寸資訊,策略狀態表,歷史成交等,類似與 snashot 快照,這個也是一個 BI 傳統思路,就是分析資料表和業務資料表分離,畢竟一個方面業務資料再不停變動,直接分析效能受限,還有就是如果要做同比環比時候要用時點戳比較方便。雖然現在很多 BI 分析軟體可以號稱直接在業務表分析,個人感覺如果不是特別關注時效性,可以分離開來。

 

第二步是對分析資料表直接加工儲存中間資料,比如可以用 QuantStats 計算出一系列指標值儲存,這個可以在分析資料表到處時候自動生成,作為一個一次性資料更新,比如半夜時候。主要原因是一些複雜計算用 python 我更熟悉些,如果對於 SQL 語言更熟練,可以直接在 metabase 透過 native SQL 來實現。

 

第三步就是在metabase來組合抽取查詢;這個metabase可以直接用jar使用,非常方便;然後對接到儲存分析資料表的資料庫,就可以使用拖動導向來滿足大多數查詢分析需求,具體可以查詢相關。

一些截圖如下,可以專門定義一個dashborad,在dripdown下去,一些是metabase自動生成的

 

程式碼方面,比較零散,這裡提供一個是對賬戶頭寸儲存到資料庫表的示例。

我是在OmsEngine裡面註冊了一個時間事件,定義在某個時段輸出到資料庫,notExportAlready這個是一個bool值,一旦輸出就改成false,避免重複輸出,沒有想到特別好的定時方法。

    def register_time_event(self,event: Event):

        self.count += 1

        if self.count > 30 and self.notExportAlready:

            self.count = 0

            if time(16,30) > datetime.now().time() > time(15,10) and 6 > datetime.now().weekday() > 0:

                self.batchExport(1)

 

然後定義一致呼叫get_all_account, 寫入資料庫

        accountlist = self.main_engine.get_all_accounts()

        if accountlist:

            database_manager.save_account_data(accountlist)

 

這裡如果想做一些處理,可以在這邊增加拼接。這裡不再累述了。

 

這邊定義比較偏個性化,如果可以其實可以在一個整體資料處理,把所有OMS業務資料(非行情)轉入到資料庫,然後用第三方做整體分析。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/22259926/viewspace-2920728/,如需轉載,請註明出處,否則將追究法律責任。

相關文章