我试图实现 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) 我想对pivot某些数据做一些操作。就像跟随。
>>> df = pd.DataFrame({'foo': ['one', 'one', 'one', 'two', 'two',
... 'two'],
... 'bar': ['A', 'B', 'C', 'A', 'B', 'C'],
... 'baz': [1, 2, 3, 4, 5, 6],
... 'zoo': ['x', 'y', 'z', 'q', 'w', 't']})
>>> df
foo bar baz zoo
0 one A 1 x
1 one B 2 y
2 one C 3 z
3 two A 4 q
4 two B 5 w
5 two C 6 t
>>> df.pivot(index='foo', columns='bar', values='baz')
bar A …Run Code Online (Sandbox Code Playgroud) 我正在尝试在DolphinDB中重写kdb脚本。
首先让我解释一下我需要做什么。如果信号高于阈值T1,我们会在证券中建立多头头寸。我们不想在信号跌落到T1以下时立即平仓,因此给它一个缓冲:只有当信号跌落到T10以下(小于T1)时,我们才平仓。
另一方面,如果信号低于阈值T2,则我们建立一个空头头寸。仅当信号移动到T20> T2以上时,我们才平仓。
T1> T10> T20> T2。
基本上我需要以下向量:
- if signal>T1, return 1. Subsequent elements are 1 until when signal<T10;
- if signal<T2, return -1. Subsequent elements are -1 until when signal>T20;
- 0 otherwise
Run Code Online (Sandbox Code Playgroud)
以上任务的kdb脚本为:
0h^fills(-).(0N 1h)[(signal>T1;signal<T2)]^'(0N 0h)[(signal<T10;signal>T20)]
Run Code Online (Sandbox Code Playgroud)
有人在DolphinDB中重写它吗?
我使用函数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)