精华帖子

量化人需要掌握的Numpy与Pandas

由bqu1vdra创建,最终由bqu1vdra 被浏览 3 用户

讲Numpy与Pandas的教程不少。Pandas的开发者(Wes Mckinney)还亲自写了一本书,《Python for Data Analysis》,英文电子版在这里。有网友将其翻译成了中文版,都是可免费阅读的。

但是没有一个教程贴合量化场景来讲解Numpy与Pandas的。作为量化人,我们学习Numpy和Pandas是带着任务的,不仅要了解Numpy和Pandas的基础,还需要知道要解决具体的问题,应该怎么办?

下面的问题你可能很熟悉,但可能不知道应该如何实现,或者尽管能够实现功能,但速度却很慢:

  1. 在因子分析中,我们有时候需要填充缺失值,有时候需要去掉缺失值所在的行或者列,应该如何操作?
  2. 如何计算分时均线?
  3. 在计算上影线时,对同一个bars,如果open > close则取open,否则取close参与计算,如果不用循环,如何一行代码实现?
  4. 如何计算最大回撤?如果计算滑动窗口下的最大回撤?
  5. 通达信公式里有不少经过实战证明是非常有用的例程,如何在Python中实现它们?比如,判断当前的成交量是多少周期以来的最小量?
  6. Alpha 101中,复用了大量像rank这样的例程。如果没有人教,你可能不知道,其实它就是pandas中的rank。不过,numpy中有对应物吗?如果没有,要如何实现?

也有可能是一些对你来说,暂时是比较生僻的用法,但一旦量化入门之后,就可能越来越喜爱它们:

  1. 在MPT理论中的求解有效前沿,我们要先初始化各个资产的权重。它们应该是一些随机数,但有一个约束:各个子资产的权重之和必须为1。在这个不起眼的小地方,我们可以使用numpy的direchlet分布来生成一个满足条件的数组。当然,它的更大用处,是基于这个分布生成RL的策略。

  2. 在康纳RSI的计算中,需要计算连续涨或跌的次数。如何一行代码高效地实现它?

  3. pivot方法你可能在excel中很熟悉了。但如果没有量化的例子,你也可能觉得在pandas中学不学它无所谓?

    这里有一个结合这几年来开发量化框架、阅读几个重要的量化库和开发课程的心得形成的教程:

我们选一段试读一下:

我们可以通过`np.array`的语法来创建一个简单的数组

arr = np.array([1, 2, 3]) 
cprint("create a simple numpy array: {}", arr)

在这个语法中,我们可以提供 Python 列表,或者任何具有 Iterable 接口的对象,比如元组。

很多时候,我们希望 Numpy 为我们创建一些具有特殊值的数组。Numpy 也的确提供了这样的支持,比如:

# 创建特殊类型的数组
cprint("全 0 数组:\n{}", np.zeros(3))
cprint("全 1 数组:\n{}", np.ones((2, 3)))
cprint("单位矩阵:\n{}", np.eye(3))
cprint("由数字 5 填充的矩阵:\n{}", np.full((3,2), 5))

cprint("空矩阵:\n{}", np.empty((2, 3)))
cprint("随机矩阵:\n{}",np.random.random(10))
cprint("正态分布的数组:\n{}",np.random.normal(10))
cprint("狄利克雷分布的数组:\n{}",np.random.dirichlet(np.ones(10)))
cprint("顺序增长的数组:\n{}", np.arange(10))
cprint("线性增长数组:\n{}", np.linspace(0, 2, 9))

生成正态分布数组很有用。我们在做一些研究时,常常需要生成满足某种条件的价格序列,再进一步研究和比较它的特性。\n\n比如,如果我们想研究上升趋势和下降趋势下的某些指标,就需要有能力先构建出符合趋势的价格序列出来。下面的例子就演示了如何生成这样的序列,并且绘制成图形:

import numpy as np
import matplotlib.pyplot as plt

returns = np.random.normal(0, 0.02, size=100)

fig, axes = plt.subplots(1, 3, figsize=(12,4))
c0 = np.random.randint(5, 50)

for i, alpha in enumerate((-0.01, 0, 0.01)):
    r = returns + alpha
    close = np.cumprod(1 + r) * c0
    axes[i].plot(close)

示例中还提到了 Dirichlet(狄利克雷)分布数组。这个数组具有这样的特点,它的所有元素加起来会等于 1。比如,在现代投资组合理论中的有效前沿优化中,我们首先需要初始化各个资产的权重(随机值),并且满足资产权重之和等于 1 的约束(显然!),此时我们就可以使用 Dirichlet分布

基础知识全部讲到,容易出错的地方给出警示,又与量化场景紧密结合,这样你在工作中遇到类似场景,就能第一时间回想并使用这个知识点,这样是不是效率高很多?

从基础讲到应用,再到性能优化和更高级的架构,可谓数据分析从入门到精通了。

标签

数据处理
{link}