拿股票sz000001为例,运行 example中001-overview的策略
分别在日线和5分钟线下运行过去2000个k线数据
日线运行
%time sys.run(sm['sz000001'], Query(-2000)) #耗时1.6ms
k = sm['sz000001'].get_kdata(Query(-2000))
%time x = my_tm.get_profit_curve(k.get_datetime_list(), Query.DAY) #耗时9.3ms
5分钟运行
%time sys.run(sm['sz000001'], Query(-2000,ktype='MIN5')) #耗时3.3ms
k = sm['sz000001'].get_kdata(Query(-2000,ktype='MIN5'))
%time x = my_tm.get_profit_curve(k.get_datetime_list(), Query.MIN5) #耗时5.2s !!!!
5分钟运行明显耗时更长,最恐怖的是get_profit_curve,同样长度的数据,5分钟情况下是日线耗时的500倍!!!
把hikyuutdx里的预加载5分钟数据量放大,如果内存够的话
预加载后分钟数据耗时和日线数据一样了,但是get_profit_curve耗时还是很长,还有get_funds_curve也是,使用项目自带test_data中的数据,sz000001全部五分钟数据回测,12万条
sys.run耗时82ms
get_profit_curve 耗时 4s
get_funds_curve 耗时4s
get_funds_curve get_profit_curve 都是属于盘后分析,但是耗时却的是系统运行50倍,这个不太应该,是否能优化一下,还是我有些配置没有设置正确?
有可能,后面优化下
TradeManager是一个即时状态(没有交易不会计算),而获取 get_profit_curve 其实需要对每一个时刻进行计算重建当时的持仓,所以会慢。因为盘后分析其实是一次性的,而且其实一般都是按日看速度可接受,一直没去管它,后面看看有没有办法优化下,不过因为其本质决定了有可能还是会比交易慢,除非你按日看收益曲线。
历史持仓通过get_history_position_list能获取,似乎不需要重新计算吧?get_profit_curve主要是获取收益的历史曲线,我觉得,其实做一个数组就能解决问题了,在sys.run的时候,把当前的收益情况保存在数组里面,几乎不会额外消耗时间,这样调用get_profit_curve 的时候,只需要获取数组就行了,不再需要额外计算了
有了权息会不同。另外,不是用5分钟作回测,就看5分钟的收益曲线,大部分时候不管作什么级别的回测,都主要看的还是日线的收益曲线,一个数组也是不够的。你再想想或者试着优化看看。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。
登录 后才可以发表评论