在Cython中使用NumPy,在Cython中使用NumPy代码和使用Python代码的方法是一样的。我们将介绍一个例子,用来分析一支股票的上涨日所占的比例。上涨日的基本特征就是当日股票的收盘价高于前一交易日。我们将计算二项分布总体率的置信区间(binomial proportion confidence)。有关二项分布总体率的置信区间的更多信息,请参考http://en.wikipedia.org/wiki/Binomial_proportion_confidence_interval。这个置信区间用来表征上涨日出现概率的可信程度。
具体步骤
下面详细介绍怎样在Cython中使用NumPy代码。为此,需要执行以下步骤。
- 编写.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)
- 编写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
)
现在可以进行构建了,具体步骤请见上一章。
- 使用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模块。