- 主题:我的python股票回测引擎用numba重写了,速度提高百倍
单个股票时间是不多,但是全市场5000多只股票呢
一般回测一个策略,都要在一个相对大的股票集上测试,比如沪深300, 不排除全市场
策略开发中,也需要不断修改策略、调整参数,反复测试。
所以回测速度是很重要的。
【 在 yatobiaf 的大作中提到: 】
: 确实是,python的优势是不写循环,如果写循环那确实差点意思。
: 不过你这策略,不能叫股票策略,只能叫CTA策略,只针对单只股票的时序做判断的。对于这类策略,速度压根不会是瓶颈。如果是批量买入一大篮子股票,那速度要求才高,才用的上矩阵乘法,那才是是python的优势。
:
--
FROM 223.72.44.*
用print没有问题。
调试确实不方便,现在就是到处加print查看
我也只是核心引擎和策略用numba, 外围代码还是python
实在要用其他python的东西,就在外面处理成numpy ndarray再传进去。
现在看来,numba还是不错的, 提供了nogil参数,可以让生产的jit函数在运行时不占用gil
这样就可以直接使用python多线程,每个线程都跑满。
我毕竟还是刚开始尝试,不知道后面会碰到什么问题。
【 在 poggy 的大作中提到: 】
:
: 等你逻辑写复杂了, 就会感受到numba的短板,
: 预编译优化, 导致调试困难
: ...................
--
FROM 223.72.44.*
目前C#比numba的python慢一些,不过c#的功能更多。numba版本做了很多简化
【 在 KnightZorro 的大作中提到: 】
: 要不楼主公开部分代码, 我们看看numba方案和c#方案的综合对比?比如生产力、执行效率等.
--
FROM 223.72.44.*
不折腾啦, 目前看, 行情数据做预处理后,用pickle缓存
做批量测试时,直接读缓存,这样,1秒钟能完成近千只股票的简单策略回测。
这样的速度也够用了。
目前的两个问题, 一个是numba首次做jit编译的耗时很长,我的numba代码没多少,但是要花5秒左右的时间来编译。
每次运行前,都要先预热。jit函数提供了cache参数,缓存jit结果,避免每次运行都做jit。但是jitclass还不支持这个机制。
另外,指定nogil参数的jit函数可以很好的多线程并行运行,但是jitclass同样不支持这个参数。所以用了jitclass,多线程就没法发挥作用。
现在jitclass还是experimental的, 不知道什么时候能好。
【 在 KnightZorro 的大作中提到: 】
: 或者找个github上开源的项目对比下
--
FROM 223.72.44.*
我去年还是前年做过c++,c#,python numba 的一个纯计算的性能测试。
适当优化后,C#能达到C++的性能,numba甚至比我手写的c++还快。
如果不用C#提供的其他东西,单纯计算,速度跟C++基本一样。 不过C++ 模板编程的抽象开销非常少,而C#抽象开销就比较明显。使用的C#特有机制越多,性能损耗越多。层层包装,到了最外面的调用接口,性能就差很多了。
因为numba会自动进行simd优化,调用svml,而C++编译器的simd优化效果一般,C#就只能自己手写。
所以,在快速写出高性能代码方面,numba还是有一定优势的。
【 在 KnightZorro 的大作中提到: 】
: 没别的意思, 最近对microbenchmark着迷, 要不你提供个最简单的可以区分两者性能的例子,然后放出代码看看
--
FROM 223.72.44.*
现在就碰到一个问题,numba对jitclass得支持还比较弱。
不支持nogil, 导致多线程无法加速
不支持pickle,导致muiltprocess没法序列化,
所以到现在,还是只能得到单线程得性能。
基本够用,但是总觉得有些不舒服。
【 在 poggy 的大作中提到: 】
:
: 等你逻辑写复杂了, 就会感受到numba的短板,
: 预编译优化, 导致调试困难
: ...................
--
FROM 223.72.44.*
没有, 打开和关闭开关,看下速度差别就知道了。
【 在 startpower 的大作中提到: 】
: 楼主,如何确认numba使用到了simd指令呢,是看生成的机器代码?
--
FROM 223.72.91.*