407 Star 1.8K Fork 752

GVPfasiondog / hikyuu

 / 详情

5min数据回测时,速度非常慢,尤其是get_profit_curve这个函数,能解决么

已关闭
创建于  
2022-11-22 13:24

拿股票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倍!!!

评论 (6)

pangcong_e12e 创建了任务
pangcong_e12e 修改了描述
pangcong_e12e 修改了描述
展开全部操作日志

把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分钟的收益曲线,大部分时候不管作什么级别的回测,都主要看的还是日线的收益曲线,一个数组也是不够的。你再想想或者试着优化看看。

fasiondog 任务状态待办的 修改为已关闭

登录 后才可以发表评论

状态
负责人
里程碑
Pull Requests
关联的 Pull Requests 被合并后可能会关闭此 issue
分支
开始日期   -   截止日期
-
置顶选项
优先级
参与者(2)
3859 fasiondog 1578914213
C++
1
https://gitee.com/fasiondog/hikyuu.git
git@gitee.com:fasiondog/hikyuu.git
fasiondog
hikyuu
hikyuu

搜索帮助