我试图实现 WorldQuant 发布的 101 个量化交易因子 ( https://arxiv.org/pdf/1601.00991.pdf )。
\n一个典型的因素是处理股票的价格和数量信息以及时间维度和股票维度。以 alpha 因子 #4 为例:(-1 * Ts_Rank(rank(low), 9))。这是动量阿尔法信号。最低价是一组股票在一定时期内的最低价。Rank 是对每行 panel\xe2\x80\x99s 进行排名的横截面过程(时间快照)。Ts_Rank 是在指定窗口内移动_rank panel\xe2\x80\x99s 每列(一只股票)的时间序列过程。
\n直观上,Pandas 数据框或NumPy矩阵应该适合 101 个 alpha 因子的实现。下面是我迄今为止使用NumPy得到的最佳实现。然而,性能太低了。在我的 Intel core i7 Windows 机器上,以 5000(交易日期)× 200(股票)矩阵作为输入运行 alpha #4 因子大约需要 45 秒。
\n我还遇到了 DolphinDB,一个具有内置分析功能的时间序列数据库(https://www.dolphindb.com/downloads.html)。对于相同的因子 Alpha#4,DolphinDB 的运行时间仅为 0.04 秒,比 NumPy 快 1000倍版本快 1000 倍。然而,DolphinDB 是商业软件。有人知道更好的 python 实现吗?或者有什么技巧可以改进我当前的 python 代码以实现与 DolphinDB 相当的性能?
\nNumpy实现(基于https://github.com/yli188/WorldQuant_alpha101_code)
\nimport …Run Code Online (Sandbox Code Playgroud) 我使用函数mmax来计算一千万长度整数向量的移动最大值。我运行了 10 次来计算总执行时间。窗口大小 132 的运行时间(15,025 毫秒)是窗口大小 22 的运行时间(2,425 毫秒)的 6 倍。看起来复杂度mmax是 O(nw) 而不是 O(n),其中 w 是滑动窗口的长度)。
为了检查其他类似产品是否也是如此,我在 DolphinDB 上尝试了相同的实验,DolphinDB 是一个具有内置分析功能的时间序列数据库 ( https://www.dolphindb.com/downloads.html )。相比之下,DolphinDB\xe2\x80\x99smmax线性复杂度为 O(n),无论窗口大小如何:1,277 毫秒(窗口大小 132)和 1,233 毫秒(窗口大小 22)。
Server: Dell PowerEdge R630\nArchitecure: x86_64\nCPU Model Name: Intel(R) Xeon(R) CPU E5-2650 v4 @ 2.20GHz\nTotal logical CPU cores: 48\nTotal memory: 256G\nRun Code Online (Sandbox Code Playgroud)\n我使用的是KDB+ 4.0 64位版本和DolphinDB_Linux_V2.00.7(DolphinDB社区版本:2核和8GB内存)。两个实验均使用 2 核 CPU 进行。
\n// Start the server\nrlwrap -r taskset -c 0,1 …Run Code Online (Sandbox Code Playgroud)