本节书摘来异步社区《Python金融大数据分析》一书中的第2章,第2.1节,作者: 【德】Yves Hilpisch(伊夫 希尔皮斯科)译者: 姚军 责编: 傅道坤,更多章节内容可以访问云栖社区“异步社区”公众号查看。
2.1 Python部署
本节说明如何在本地(或者服务器上)以及通过Web浏览器部署Python。
2.1.1 Anaconda
有些操作系统自带某个版本的Python并且已经安装了一些附加的库。例如,Linux操作系统常常依靠Python作为其主要语言(用于打包、管理等)。但是,下面我们假定Python尚未安装,或者打算使用Anaconda分发版本安装另一个版本的Python(与现有版本并行)。
可以从http://continuum.io/downloads上下载适合你的操作系统的Anaconda。考虑使用Anaconda进行Python部署有几个原因。
库/软件包
可以在一个安装步骤中得到100多个最重要的Python库和软件包;特别是,可以版本一致的方式安装所有软件包(也就是说,所有库和软件包可以相互配合)[2]。
开放源码
Anaconda分发版本一般是免费的[3],包含在分发版本中的所有库和软件包也是如此。
跨平台
Anaconda可以用于Windows、Mac OS和Linux平台。
分离式安装
Anaconda安装到一个单独的目录,不会干扰任何现有安装;不需要根/管理用户权限。
自动更新
包含在Anaconda中的库和软件包可以通过免费在线存储库(半)自动更新。
Conda 软件包管理程序
这个软件包管理程序可以并行使用多个Python版本和多个版本的库(用于试验或者开发/测试目的);它对虚拟环境的支持也很出色。
在下载Anaconda安装程序之后,安装总体来说很简单:在Windows平台上,只需双击安装程序文件并按照提示进行。在Linux下,打开shell程序,转到安装程序所在的目录,输入:
用你的安装程序文件名称代替上面的文件名。然后按照提示进行。在Apple计算机上也相同,只要输入:
确保用正确的文件名代替上述文件名,也可以使用图形化的安装程序。
安装之后,你就拥有了100多个库和软件包,立即就可以使用。其中的科学与数据分析软件包在表2-1中列出。
如果安装过程成功,应该打开一个新的终端窗口,然后可以在shell中输入如下命令启动Spyder IDE:
也可以输入如下命令,开始Python会话:
到本书编著时,Anaconda默认安装Python 2.7.x。它总是自带开源软件包管理程序conda。关于该工具的有用信息可以通过下列命令获得:
conda允许在本地和可用的在线存储库中搜索库和软件包:
本例的结果包含可以下载和安装以及已经安装(由*号标出)的Pytables版本。类似地,list命令显示匹配某个模式的所有本地安装软件包。下面命令列出以“pyt”开始的所有软件包:
还可以使用基于正则表达式的更复杂模式,例如:
假定我们想要在2.7.x版本之外使用Python 3.x。软件包管理程序conda可以创建一个环境实现这一目标。下面的输出展示了工作原理:
当你输入y确认创建时,conda将按照计划进行(下载、提取和链接软件包):
现在,按照conda的建议激活新环境:
很明显,我们现在确实进入了Python 3.3的世界,可以从显示的Python版本和需要为Print语句加入圆括号才能正确工作[4]中看出这一点。
多个Python环境
使用conda软件包管理程序,可以在一台机器上安装和使用多个单独的Python环境。这和其他功能一起,简化了Python代码与不同Python版本兼容性的测试。
单独的库和软件包可以使用conda install命令或在Anaconda总体安装过程中安装:
或者安装到特定的环境,如:
这里,py33test是我们之前创建的环境。类似地,你可以轻松地更新单个软件包:
下载和链接的包取决于安装包的版本。这可能很少,也可能很多,例如,当软件包有许多相关软件包尚未下载最新版本时。对于我们新创建的环境,更新采用如下方式:
最后,conda可以用remove命令简单地从主安装或者特定环境中删除软件包,基本用法如下:
对于某个环境则是:
由于删除是“最终”操作,你可能想要“预演”该命令:
如果你很确定,可以继续进行实际的删除。要回到最初的Python和Anaconda版本,可以使该环境不活动:
最后,我们可以使用remove和--all选项,清理整个环境:
软件包管理程序conda使Python部署变得相当便利。除了本节展示的基本功能之外,还有许多更高级的功能。详细文档可以在http://conda/pydata.org/docs/上找到。
2.1.2 Python Quant Platform
有许多原因促使我们希望通过Web浏览器部署Python,举例如下。
无需安装
完整Python环境的本地安装可能很复杂(例如,在具有许多计算机的大型组织中),支持和维护的成本很高;通过Web浏览器使用Python使部署在某些情况下更为高效。
使用(更好的)远程硬件
对于复杂、计算和内存密集的分析任务,本地计算机可能无法执行;使用(多台)具备多核心、更大内存、可能还有GPGPU的共享服务器可以更高效地完成这些任务。
协作
例如,在单一或者多台服务器上与某个团队合作,可以使协作更简单,而且能够增进效率:数据不用移动到每台本地机器上,在分析任务完成之后,结果也不用移回某个中央存储单元,在团队成员之间分发。
Python Quant Platform是一个基于Web和浏览器的金融分析和协作平台,由Python Quants股份有限公司(http://www.pythonquants.com)开发和维护。你可以在http://quantplatform.com注册该平台。它有如下基本组件:
文件管理器
通过Web GUI管理文件上传/下载等功能的工具。
Linux 终端
与服务器(例如云中的虚拟服务器实例,或者公司场内运行的专用服务器)协同工作的Linux终端;可以使用Vim、Nano等进行代码编辑,使用Git存储库进行版本控制。
**Anaconda
**
Anaconda安装提供前面讨论的所有功能,默认情况下可以选择Python2.7-3.4之间的版本。
Python Shell
标准Python Shell。
IPython Shell
增强的IPython shell。
IPython Notebook
IPython的浏览器版本,通常将它作为核心工具使用。
**聊天室/论坛
**
用于协作、交换想法和上传/下载研究文档等。
高级分析
除了Linux服务器和Python环境之外,该平台提供分析功能,例如投资组合分析、风险分析和衍生品分析,以及交易策略的事后检验(特别是DX分析;第3部分可以看到该库的一个简化而全功能的版本);其中还有一个R语言栈,可以从IPython Notebook中调用R函数。
标准 API
供领先数据提供商的数据交付服务使用、基于Python的标准API。
至于协作,Python Quant Platform允许用户在一个“公司”下定义某些“用户组”,每个组对不同Python项目(即目录和文件)有不同的权限。该平台很容易伸缩,并可通过Docker容器(http://docker.com)部署。图2-1展示了Python Quant Platform主屏幕的截图。
2.1.3 工具
编程语言的成功和流行,在某种程度上归功于该语言可用的工具。Python长时间以来都被认为是一种精细、易学、易用的语言,但是缺乏用于交互分析或者开发的一组具有吸引力的工具。这一点已经有了改变,现在有大量工具可以帮助分析人员和开发人员在Python上取得很高的效率。对这些工具不可能做全面的概述,但是,我们可以重点介绍当今最流行的两种工具:IPython和Spyder[5]。
2.1.4 Python
从完整性出发,我们首先考虑使用标准的Python解释程序。从系统shell/命令行接口,输入python就可以调用Python:
可以在标准提示符下进行很多Python工作,但是大部分人都更愿意使用IPython作为默认工具,因为这个环境提供标准解释程序提示符提供的一切功能,在此基础上还提供了更多的功能。
2.1.5 IPython
第1章中曾经使用IPython介绍Python代码的第一个例子。本节通过具体的示例概述IPython的功能。围绕IPython发展出来的一个完整生态系统非常成功和具有吸引力,以至于其他语言的用户也利用它所提供的基本方法和架构。例如,IPython有一个用于Julia语言的版本(http://julialang.org)。
从 shell 到浏览器
IPython有3种风格:
Shell
顾名思义,Shell版本基于系统和Python shell;不包含任何图形化功能(除了在单独窗口中显示图表以外)。
QT 控制台
这一版本基于QT图形用户界面框架(http://qt-project.org),功能更丰富,例如,允许在线图形。
Notebook
这是基于JavaScript的Web浏览器版本,它已经成为Python社区中用于交互分析最受欢迎的版本,也可以用于教学、演示等。
Shell版本可以简单地在shell中输入ipython调用:
使用--pylab选项在命名空间中导入一组科学和数据分析库,例如NumPy:
类似地,IPython的QT控制台可以通过如下命令调用:
使用inline参数和--pylab选项,使IPython在线绘制图形,图2-2展示了带有在线图表的QT控制台屏幕截图。
最后,Notebook版本可以这样调用:
图2-3展示了IPython Notebook会话的屏幕截图。inline选项的效果同样是使图表显示在IPython Notebook中,而不是显示在单独的窗口中。
总而言之,IPython核心的调用有许多选项,你可以输入如下命令,获得所有选项的列表:
选项的详细解释参考IPython文档(http://www.ipython.org/documentation.html)。
基本用法
下面,我们描述IPython Notebook的基本用法。Notebook的基本概念是不同类型单元格的使用。这些类型如下所示。
代码
包含可执行的Python代码。
Markdown
包含以Markdown语言和HTML编写的文本。
原始文本
包含没有格式的文本[6]。
标题(1-6)
用于文本结构的标题,例如节标题。
不同的单元格类型已经表明,Notebook不仅是改进的Python shell。它的意图是满足多种文档和演示情境的需求。例如,IPython Notebook文件(后缀为.ipynb)可以转换为如下格式:
Python 文件
从IPython Notebook文件中生成一个Python代码文件(.py),非代码单元格被注释掉。
HTML 页面
从单一IPython Notebook文件生成一个HTML页面。
HTML 5 幻灯片
使用标记为幻灯片的不同单元格,Notebook文件可以转换为一个具有多张HTML5幻灯片的演示(使用reveal.js框架(http://lab.hakim.se/reveal-js/)。
LaTeX/PDF
Notebook文件也可以转换为LaTex文件,然后转换为一个PDF文档。
RestructuredText
例如,RestructuredText(.rst)可以供SPHINX Python项目文档软件包(http://sphinx-doc.org)使用。
分析和发布平台
IPython Notebook的主要优势之一是,很容易发布和分享整个Notebook。一旦IPython分析项目结束,可以HTML页面或者PDF的方式发布它,或者将内容用于幻灯片演示。
IPython Notebook文件的格式基于JavaScript对象标记(JSON)标准。下面是图2.3中显示的Notebook的文本版本——你会注意到,有些元数据、不同类型的单元格及其内容甚至图形都被翻译成ASCII字符:
例如,将这种文件转换为LaTex时,原始文本单元格可能包含LaTex代码,因为这些单元格的内容被转换程序简单地传送。这就是IPython Notebook现在常常被用于较大、较复杂文档(如科学研究论文)写作的原因。在单一文件中的代码和文档文本可以转换为许多不同的输出格式。
在金融环境中,这也使IPython成为有价值的工具,例如,算法的数学描述和可执行Python版本可以存在于同一个文档。根据应用场景,可以生成一个网页(例如企业内联网),PDF文件(例如客户邮件)或者演示(例如董事会)。利用演示选项也可以实现很多功能,例如,可以跳过包含对演示来说过于冗长的文本段落的单元格。
Notebook的基本用法相当直观。主要用箭头键浏览它,使用Shift-Return或者Ctrl-Return“执行”单元格。不同之处在于第一个选项在执行之后自动转移到下一个单元格,而第二个选项留在同一个单元格。“执行”单元格的效果取决于单元格类型。如果是代码单元格,则执行代码并显示输出(如果有的话)。如果是Markdown单元格,则渲染内容,显示结果。
Markdown 和 Latex
下面展示几个Markdown命令的精选示例:
图2-4展示了原始文本单元格(看上去和前面的文本一样)和在Markdown单元格中渲染的相同代码。这样,你可以轻松地在一个文档中结合Python代码和漂亮的格式化文本。
IPython Notebook所用Markdown语言的详细描述可以在http://daringfireball.net/projects/markdown上找到。
如前所述,IPython的渲染能力不限于Markdown语言。IPython默认还可以渲染由LaTeX排版语言描述的数学公式,LaTeX语言是科学出版的事实标准。例如,考虑第1章中Black-Scholes-Merton(1973)模型中指数水平的公式(公式1-1)。为了方便起见,我们在公式2-1中重复了这个公式。
公式2-1 Black-Scholes-Merton(1973)到期指数水平
描述公式2-1的LaTeX代码大约如下:
图2-5展示了一个包含Markdown文本和LaTeX文本的原始文本单元格,以及MarkDown单元格中渲染的结果,图中还展示了一个更复杂的公式:欧式看涨期权的Black-Scholes-Merton期权估价公式——第3章中的公式3-1。
魔法命令
IPython的优势之一是魔法(Magic)命令。它们的“魔法”表现为在标准的Python shell功能性基础上添加某些真正有益和强大的功能。基本信息和这些功能的帮助可以通过如下命令访问:
如下命令可以在IPython会话中生成所有可用魔法命令的列表:
例如,在交互式计算中,魔法命令可以用于简单的剖析任务。对于这种用例,你可以使用%time或者%prun:
还有另外一条命令%timer或者%%timeit,用于求得单一代码行或者IPython Notebook中整个单元格内代码的时间:
上述函数执行多次循环,获得函数调用或者代码片段持续时间的可靠估算。
无法详细解释IPython提供的所有魔法函数。但是,IPython本身坚持尽可能简化IPython及其命令相关信息的查找。其中最有用的方法在表2-2中列出(http://bit.ly/ipython_tutorial)。
IPython的另一个特征是高度可配置。关于配置能力的信息也可以在文档中找到(http://ipython.org/ipython-doc/stable/config/)。
对IPython自定义有帮助的魔法命令之一是%bookmark。这个命令可以使用自定义名称将任意目录标记为书签,以便在以后——不管从哪里调用IPython核心,也不管当前目录是什么——立刻导航到你标记书签的目录(也就是说,你不用使用cd)。下面说明如何设置一个书签,如何列出所有书签:
系统 shell 命令
另一个真正有益的特性是可以直接从IPython提示符或者Notebook单元格中执行命令行/系统shell函数。这时,需要使用!表示后面的命令应该转义为系统shell(或者在整个单元格应该这样处理时使用%%!)。下面是一个简单的演示:创建一个目录,转到该目录,回到上一级目录,删除该目录:
IPython提供了强大的交互式开发环境应该有的所有功能。初学者和专家们往往都会通过IPython进入Python世界。在本书中,有大量说明IPython在交互式数据和金融分析中应用的示例。你还应该参考McKinney的著作(2012)——特别是第3章,以了解如何高效使用IPython的更多信息。
2.1.6 Spyder
虽然IPython可以满足大部分用户交互分和原型化的所有需求,但是较大的项目通常有更高的要求。特别是,IPython本身没有直接内建的编辑器[7]。对于寻求更传统开发环境的人,Spyder可能是更好的选择。
和IPython类似,Spyder设计用于支持快速的交互式Python开发。不过,它还有更多的特性,例如一个完善的编辑器,更强大的项目管理和调试能力,以及对象与变量检查器和完全继承的IPython shell版本。在Spyder中,还可以启动标准的Python提示符会话。
Spyder内建的编辑器提供进行Python开发所需的一切功能。其中包括(http://code.google.com/p/spyderlib/wiki/Features)下面这些功能。
高亮显示
Python、C/C++和Fortran代码的语法颜色表示;出现高亮显示。
内省
强大的动态代码内省功能(例如,用一次鼠标点击进行代码完成、调用提示、对象定义)。
代码浏览器
浏览类和函数。
项目管理
定义和管理项目;生成待办事项列表。
即时代码检查
实时获得错误和警告(通过pyflakes,http://pypi.python.org/pypi/pyflakes/)
调试
设置要与Python调式器pdb(http://dols.python.org/2/librany/pdb.html/)一起使用的断点和条件断点。
此外,Spyder还提供另一些有益的功能。
控制台
为每个单独的进程打开多个Python和IPython控制台;从控制台中的活动编辑器选项卡(或者它的各个部分)运行代码。
变量管理器
编辑和比较变量及数组;实时生成数组的2D图表;在调试时检查变量。
对象检查器
交互式显示文档字符串;自动渲染富文本格式化。
其他特性
历史日志;与电子表格类似的数组编辑器;直接访问在线帮助;整个项目的管理和浏览;通过Pylint(http://www.pylint.org)。
图2-6提供Spyder的屏幕截图,显示文本编辑器(在左侧)、变量检查器(右上)和活动的Python控制台(右下)。Spyder是开始进行Python编程的好选择,特别是对于使用过Matlab或者R提供的环境的人们来说。不过,高级编程人员也可以在单一环境内找到许多有益的开发功能。