VeighNa量化社区
你的开源社区量化交易平台
Member
加入于:
帖子: 158
声望: 71

之前使用vnpy自带的回测代码,和一些python自开发,可以分析单个策略绩效。但是如果对于多个策略和合约投资,想从多个维度,可以灵活的按照自定义特性来分析,还是需要一些专业工具。

一开始想使用一些python相关的,比如QuantStats,是一个非常好的策略绩效分析库,但是功能其实类似与vnpy自带,可以针对单个策略做全面分析,但是缺乏多维度,组合分析。

后来觉得还是使用专门的BI分析软件,选择推荐度很高的开源metabase。

这里分出三步骤出来,
第一步是在vnpy里面定时输出分析数据表,比如每日账户头寸信息,策略状态表,历史成交等,类似与snashot快照,这个也是一个BI传统思路,就是分析数据表和业务数据表分离,毕竟一个方面业务数据再不停变动,直接分析性能受限,还有就是如果要做同比环比时候要用时点戳比较方便。虽然现在很多BI分析软件可以号称直接在业务表分析,个人感觉如果不是特别关注时效性,可以分离开来。

第二步是对分析数据表直接加工保存中间数据,比如可以用QuantStats计算出一系列指标值保存,这个可以在分析数据表到处时候自动生成,作为一个一次性数据更新,比如半夜时候。主要原因是一些复杂计算用python我更熟悉些,如果对于SQL语言更熟练,可以直接在metabase通过native SQL来实现。

第三步就是在metabase来组合抽取查询;这个metabase可以直接用jar使用,非常方便;然后对接到保存分析数据表的数据库,就可以使用拖动导向来满足大多数查询分析需求,具体可以查询相关。

description
一些截图如下,可以专门定义一个dashborad,在dripdown下去,一些是metabase自动生成的
description

description

代码方面,比较零散,这里提供一个是对账户头寸保存到数据库表的示例。
我是在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业务数据(非行情)转入到数据库,然后用第三方做整体分析。

Member
avatar
加入于:
帖子: 1446
声望: 102

感谢分享!!!这个图表漂亮

Member
avatar
加入于:
帖子: 252
声望: 3

老师您好,可以分享一下database_manager.save_account_data这个函数的代码吗?

Member
avatar
加入于:
帖子: 252
声望: 3

老师您好,把所有OMS业务数据(非行情)例如成交、委托订单转入到数据库database,然后通过database_manager实现查询历史成交、历史委托,利用保存的成交订单与借鉴vnpy已有的回测分析生成一个实盘交易绩效分析报表,不然仅仅通过log分析成交绩效会非常繁琐,vnpy_portfoliomanager又无法对外盘或者历史实盘成交订单进行绩效分析,您的这个功能好实用好实在啊,可以在GitHub中开一个分支下载不? 或者开一个帖子详细讲讲具体怎么实现的嘛,把好东西大家一起分享,把温暖传递下去

© 2015-2022 上海韦纳软件科技有限公司
备案服务号:沪ICP备18006526号

沪公网安备 31011502017034号

【用户协议】
【隐私政策】
【免责条款】