Numpy 在Cython中使用NumPy

在Cython中使用NumPy,在Cython中使用NumPy代码和使用Python代码的方法是一样的。我们将介绍一个例子,用来分析一支股票的上涨日所占的比例。上涨日的基本特征就是当日股票的收盘价高于前一交易日。我们将计算二项分布总体率的置信区间(binomial proportion confidence)。有关二项分布总体率的置信区间的更多信息,请参考http://en.wikipedia.org/wiki/Binomial_proportion_confidence_interval。这个置信区间用来表征上涨日出现概率的可信程度。

具体步骤

下面详细介绍怎样在Cython中使用NumPy代码。为此,需要执行以下步骤。

  1. 编写.pyx文件。

编写一个.pyx文件,其中包括一个函数,用来计算上涨日的比例值及其置信区间。该函数首先要计算股价的差值,然后要对大于0的差值进行计数并算出上涨日的比例,最后要应用求置信区间的公式(详见上述维基百科页面)。

import numpy

def pos_confidence(numbers):
    diffs = numpy.diff(numbers)
    n = float(len(diffs))
    p = len(diffs[diffs > 0])/n
    confidence = numpy.sqrt(p * (1 - p)/ n)

    return (p, confidence)

  1. 编写setup.py文件。

我们把上文中的setup.py文件作为模版,在此基础上进行修改。有几个明显需要修改的地方,例如.pyx文件的名字。

from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext

ext_modules = [Extension("binomial_proportion", ["binomial_proportion.pyx"])]

setup(
    name = 'Binomial proportion app',
    cmdclass = {'build_ext': build_ext},
    ext_modules = ext_modules
    )

现在可以进行构建了,具体步骤请见上一章

  1. 使用Cython模块。

完成构建后,把生成的Cython模块引入Python程序。我们将编写一个用Matplotlib下载股票数据的Python程序,该程序在分析收盘价数据时将用到confidence函数。

from matplotlib.finance import quotes_historical_yahoo
from datetime import date
import numpy
import sys
from binomial_proportion import pos_confidence

#1. 获取收盘价数据。
today = date.today()
start = (today.year - 1, today.month, today.day)

quotes = quotes_historical_yahoo(sys.argv[1], start, today)
close = numpy.array([q[4] for q in quotes])
print pos_confidence(close)

以AAPL为命令行参数,程序运行后的输出结果如下。

(0.56746031746031744, 0.031209043355655924)

攻略小结

我们计算了AAPL股票上涨日出现的概率及其对应的置信区间。我们在.pyx文件中使用了NumPy代码。采用和上一攻略相同的方式,我们用这个.pyx文件构建出一个Cython模块。最后在Python代码中引入并使用了这个Cython模块。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程