Python金融大数据分析

978-7-115-40445-9
作者: 【德】Yves Hilpisch(伊夫 希尔皮斯科)
译者: 姚军
编辑: 傅道坤

图书目录:

详情

金融行业需要对一定时间内产生的大量数据进行详细分析处理,本书则提供了使用Python来进行数据分析,开发相关应用程序的技巧和工具。本书首先讲解了如何搭建Python开发环境,然后讲解如何使用Python来分析、处理金融行业中产生的大量数据,最后还提供了一些相关的案例。

图书摘要

版权信息

书名:Python金融大数据分析

ISBN:978-7-115-40445-9

本书由人民邮电出版社发行数字版。版权所有,侵权必究。

您购买的人民邮电出版社电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。

我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。

如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。

• 著    [德] Yves Hilpisch

  译    姚 军

  责任编辑 傅道坤

• 人民邮电出版社出版发行  北京市丰台区成寿寺路11号

  邮编 100164  电子邮件 315@ptpress.com.cn

  网址 http://www.ptpress.com.cn

• 读者服务热线:(010)81055410

  反盗版热线:(010)81055315


Copyright © 2015 by O’Reilly Media.Inc.

Simplified Chinese Edition, jointly published by O’Reilly Media, Inc. and Posts & Telecom Press, 2015. Authorized translation of the English edition, 2015 O’Reilly Media, Inc., the owner of all rights to publish and sell the same.

All rights reserved including the rights of reproduction in whole or in part in any form.

本书中文简体字版由O’Reilly Media, Inc. 授权人民邮电出版社出版。未经出版者书面许可,对本书的任何部分不得以任何方式复制或抄袭。

版权所有,侵权必究。


Python凭借其简单、易读、可扩展性以及拥有巨大而活跃的科学计算社区,在需要分析、处理大量数据的金融行业得到了广泛而迅速的应用,并且成为该行业开发核心应用的首选编程语言。本书提供了使用Python进行数据分析,以及开发相关应用程序的技巧和工具。

本书总计分为3部分,共19章,第1部分介绍了Python在金融学中的应用,其内容涵盖了Python用于金融行业的原因、Python的基础架构和工具,以及Python在计量金融学中的一些具体入门实例;第2部分介绍了金融分析和应用程序开发中最重要的Python库、技术和方法,其内容涵盖了Python的数据类型和结构、用matplotlib进行数据可视化、金融时间序列数据处理、高性能输入/输出操作、高性能的Python技术和库、金融学中需要的多种数学工具、随机数生成和随机过程模拟、Python统计学应用、Python和Excel的集成、Python面向对象编程和GUI的开发、Python与Web技术的集成,以及基于Web应用和Web服务的开发;第3部分关注的是蒙特卡洛模拟期权与衍生品定价实际应用的开发工作,其内容涵盖了估值框架的介绍、金融模型的模拟、衍生品的估值、投资组合的估值、波动率期权等知识。

本书适合对使用Python进行大数据分析、处理感兴趣的金融行业开发人员阅读。


Yves Hilpsch是Python Quants(德国)股份有限公司的创始人和任事股东,也是Python Quants(纽约)有限责任公司的共同创办人。该集团提供基于Python的金融和衍生品分析软件(参见http://pythonquants.comhttp://quant-platfrom.comhttp://dx-analytics.com),以及和Python及金融相关的咨询、开发和培训服务。

Yves还是Derivatives Analytics with Python(Wiley Finance,2015)的作者。作为获得数理金融学博士学位的商业管理专业研究生,他在萨尔州大学讲授计算金融学中的数值化方法课程。


O’Reilly Media通过图书、杂志、在线服务、调查研究和会议等方式传播创新知识。自1978年开始,O’Reilly一直都是前沿发展的见证者和推动者。超级极客们正在开创着未来,而我们关注真正重要的技术趋势——通过放大那些“细微的信号”来刺激社会对新科技的应用。作为技术社区中活跃的参与者,O’Reilly的发展充满了对创新的倡导、创造和发扬光大。

O’Reilly为软件开发人员带来革命性的“动物书”;创建第一个商业网站(GNN);组织了影响深远的开放源代码峰会,以至于开源软件运动以此命名;创立了Make杂志,从而成为DIY革命的主要先锋;公司一如既往地通过多种形式缔结信息与人的纽带。O’Reilly的会议和峰会集聚了众多超级极客和高瞻远瞩的商业领袖,共同描绘出开创新产业的革命性思想。作为技术人士获取信息的选择,O’Reilly现在还将先锋专家的知识传递给普通的计算机用户。无论是通过书籍出版,在线服务或者面授课程,每一项O’Reilly的产品都反映了公司不可动摇的理念——信息是激发创新的力量。

业界评论

“O’Reilly Radar博客有口皆碑。”

——Wired

“O’Reilly凭借一系列(真希望当初我也想到了)非凡想法建立了数百万美元的业务。”

——Business 2.0

“O’Reilly Conference是聚集关键思想领袖的绝对典范。”

——CRN

“一本O’Reilly的书就代表一个有用、有前途、需要学习的主题。”

——Irish Times

“Tim是位特立独行的商人,他不光放眼于最长远、最广阔的视野并且切实地按照Yogi Berra的建议去做了:‘如果你在路上遇到岔路口,走小路(岔路)。’回顾过去Tim似乎每一次都选择了小路,而且有几次都是一闪即逝的机会,尽管大路也不错。”

——Linux Journal


不久以前,在金融行业,Python作为一种编程语言和平台技术还被视为异端。相比之下,2014年有许多大型金融机构——如美国银行、美林证券的“石英”项目或者摩根大通的“雅典娜”项目——战略性地使用了Python和其他既定的技术,构建、改进和维护其核心IT系统。众多大大小小的对冲基金也大量使用Python的功能,进行高效的金融应用程序开发和金融分析工作。

同样,当今许多金融工程硕士课程(或者授予类似学位的课程)也使用Python作为核心语言之一,教授计量金融理论与可执行计算机代码之间的转换方法。针对金融专业人士的教育项目和培训也越来越多地在课程中加入Python。有些课程将它作为主要实现语言。

Python最近取得这样的成功,而且在未来似乎还会继续下去,这有许多原因。其中包括它的语法、Python开发人员可用的科学生态系统和数据分析库、易于和几乎所有其他技术集成,以及其开源地位(更多这方面的深入探讨请参见第1章)。

因此,有许多好的书籍,从不同角度和焦点传授Python。本书是最先介绍和传授Python金融应用的书籍之一,特别是将Python用于计量金融学和金融分析。书中采用的方法很实用,实现和说明先于理论细节,通常将焦点更多地放在大局上,而非某些类或者函数晦涩难懂的参数化选项。

本书的大部分是在基于浏览器的强大交互式环境IPython Notebook(在第2章中有更详细的介绍)中编写的,因此有可能为读者提供本书中几乎所有例子的可执行、交互式版本。

希望立即开始使用完备的交互式Python(以及R和Julia)金融分析环境的读者,应该前往http://oreilly.quant-platform.com,尝试Python Quant平台(结合本书提供的IPython Notebook文件)。你还应该关注基于Python的金融分析库DX analytics(http://dx-analytics.com)。我的另一本书《Derivatives Analytics with Python》(Wiley Finance)更详细地介绍高级衍生品分析的理论和数值方法,书中也提供了丰富而易用的Python代码。进一步的材料,特别是有关Python计量金融学应用的幻灯片及视频,可以在我的私人网站上找到(http://hilpisch.com)。

如果你想参加Python 计量金融学应用社区的活动,在世界上的金融中心有各种各样的机会。例如,我自己在伦敦(http://www.meetup.com/Python-for-Quant_finance-London/)和纽约(http://www.meetup.com/Python-for-Quant_finance-NYC/)组织以此为焦点的讨论组。每年还有多次For Python Quants会议和研讨(http://forpythonquants.comhttp://pythonquants.com)。

对于Python确立金融行业中重要技术地位这一事实,我确实感到很兴奋。我敢肯定,它在未来将会起到更重要的作用,例如在衍生品和风险分析或者高性能计算领域中。我希望本书能够帮助专业人士、研究人员和学生在面对这一迷人领域中的挑战时,最大限度地利用Python。

提示

提示这个图标用来强调一个提示、建议或一般说明。


警告

警告这个图标用来表示一个警告或注意事项。

补充材料(特别是 IPython Notebooks 和 Python 脚本/模块)可以从http://oreilly.quant-platform.com下载。

本书的目的是为了帮助读者完成工作。一般而言,你可以在你的程序和文档中使用本书中的代码,而且也没有必要取得我们的许可。但是,如果你要复制的是核心代码,则需要和我们打个招呼。例如,你可以在无需获取我们许可的情况下,在程序中使用本书中的多个代码块。但是,销售或分发O’Reilly 图书中的代码光盘则需要取得我们的许可。通过引用本书中的示例代码来回答问题时,不需要事先获得我们的许可。但是,如果你的产品文档中融合了本书中的大量示例代码,则需要取得我们的许可。

在引用本书中的代码示例时,如果能列出本书的属性信息是最好不过。一个属性信息通常包括书名、作者、出版社和 ISBN。例如:“Python for Finance by Yves Hilpisch (O’Reilly). Copyright 2015Yves Hilpisch, 978-1-491-94528-5.”

在使用书中的代码时,如果不确定是否属于正常使用,或是否超出了我们的许可,请通过permissions@oreilly.com与我们联系。

如果你想就本书发表评论或有任何疑问,敬请联系出版社:

美国:

O’Reilly Media Inc.

1005 Gravenstein Highway North

Sebastopol, CA 95472

中国:

北京市西城区西直门南大街2号成铭大厦C座807室(100035)

奥莱利技术咨询(北京)有限公司

我们还为本书建立了一个网页,其中包含了勘误表、示例和其他额外的信息。你可以通过如下地址访问该网页:

http://bit.ly/python-finance

关于本书的技术性问题或建议,请发邮件到:

bookquestions@oreilly.com

欢迎登录我们的网站(http://www.oreilly.com),查看更多我们的书籍、课程、会议和最新动态等信息。

Facebook: http://facebook.com/oreilly

Twitter: http://twitter.com/oreillymedia

YouTube: http://www.youtube.com/oreillymedia

Safari在线图书是一个按需订阅的数字图书馆。它有不少于7500本技术和创意相关的书籍和视频供你参考和搜索。

通过订阅,你可以在线阅读任何页面或任何视频,甚至可以从手机或移动设备上在线阅读。你可以在书籍出版前访问到它们,并给读者发送反馈。其他功能还包括:复制和粘贴代码、组织收藏夹、下载和标记章节、做笔记、打印等。

O’Reilly Media 已经将本书英文版上传到Safari在线图书服务。在http://my.safaribooksonline.com上免费注册,你就可以访问本书所有章节以及类似主题的书籍。

我要感谢所有为本书的实现提供帮助的人,特别是认真反馈甚至完全理解书中例子的人,例如Ben Lerner、James Powell、Michael Schwed、Thomas Wiecki或者Felix Zumstein。同样,我要感谢审稿人Hugh Brown、Jennifer Pierce、Kevin Sheppard和Galen Wilkerson。本书从他们宝贵的反馈和许多建议中受益良多。

本书还从我在2013年和2014年出席的会议和研讨活动的参与者们那里得到很多有益的反馈,这些会议包括:PyData、For Python Quants、Big Data in Quant Finance、EuroPython、EuroScipy、PyCon DE、PyCon Ireland、Parallel Data Analysis、Budapest BI Forum和CodeJam。我还在柏林、伦敦、纽约的Python讨论组上的演讲期间得到了宝贵的反馈。

最后,我要感谢家人,他们完全接受我集中地做自己最热爱的事。完成这样篇幅的书籍需要在一年之中、在我已经安排得很满的工作负荷和行程基础上投入大量的时间——我也必须花费更多的时间,独自坐在计算机前。因此,感谢Sandra、Lilli和Henry的理解与支持。我将本书献给可爱的妻子Sandra,她是我们全家的核心。

Yves

德国萨尔州,2014年11月


本部分介绍Python的金融学应用,包括3章。


银行本质上是技术公司。

——Hugo Banziger

Python 是一种高级的多用途编程语言,广泛用于各种非技术和技术领域。在 Python 网站上,你可以找到如下行动纲领(https://www.python.org/doc/essays/blurb):

Python是一种具备动态语义、面向对象的解释型高级编程语言。它的高级内建数据结构和动态类型及动态绑定相结合,使其在快速应用开发上极具吸引力,也适合于作为脚本或者“粘合剂”语言,将现有组件连接起来。Python 简单、易学的语法强调可读性,因此可以降低程序维护成本。Python 支持模块和软件包,鼓励模块化和代码重用。Python 解释程序和大量标准库可以源代码或者二进制形式免费取得,用于所有主要平台,并且可以随意分发。

上述纲领很好地描述了 Python 成为当今主要编程语言之一的原因。当前,在学校、Web 公司、大型企业和金融机构以及任何科学领域,都有初学者和熟练的专业开发人员在使用 Python。

Python有如下特征。

开放源码

Python和大部分可用的支持库及工具都是开源的,通常使用相当灵活和开放的许可证。

解释型

Cpython参考实现是该语言的一个解释程序,在运行时将Python代码翻译为可执行字节代码。

多重范型

Python支持不同的编程和实现范型,例如面向对象和命令式、函数式或者过程式编程。

多用途

Python可以用于快速、交互式代码开发,也可以用于构建大型应用程序;它可以用于低级系统操作,也可以承担高级分析任务。

跨平台

Python可用于大部分重要的操作系统,如Windows、Linux和Mac OS;它用于构建桌面应用和Web应用;可以在最大的群集和最强大的服务器上使用,也可以在树莓派(http://www.raspberrypi.org)这样的小设备上运行。

动态类型

Python中的类型通常在运行时推知,而不像大部分编译语言那样静态声明。

缩进感知

和大部分其他编程语言不同,Python使用缩进标记代码块,代替圆括号、方括号或者分号。

垃圾收集

Python具有自动垃圾收集机制,避免程序员管理内存。

关于Python语法及其意义,Python增强提案20——即所谓的“Python之禅”——提供了重要的指导方针。每个交互shell都可以用命令import this访问它:

Python对于某些人来说可能还是个新事物,但是它已经出现了很长时间。实际上,早在20世纪80年代,荷兰人Guido van Rossum就开始了开发工作。他现在仍然活跃于Python开发中,被Python社区授予“仁慈独裁者”的称号(http://en.wikipedia.org/wiki/History_of_Python)。下面是Python开发的里程碑:

值得注意的是,有两个可用的主要版本仍然在开发之中,更重要的是,它们从2008年起并行使用,这有时候令Python初学者感到困惑。到本书编著之时,这种情况已经持续了一段时间,因为两个版本之间没有100%的代码兼容性,而且不是所有流行程序库都可以用于Python 3.x。大部分可用和生产代码仍然是用Python 2.6/2.7编写的,本书基于2.7.x版本,但是大部分代码示例应该可以在3.x版本上运行。

Python作为一个生态系统,而不仅仅是一种编程语言,其主要特征是有大量可用的库和工具。这些库和工具通常必须在需要(例如,绘图库)时导入或者作为单独的系统进程(例如,Python开发环境)启动。导入意味着使某个库可用于当前命名空间和当前Python解释程序进程。

Python本身自带了一组大型的程序库,在不同方面增强了基本解释程序。例如,基本数学计算可以在不做任何导入的情况下完成,而更复杂的数学函数必须通过数学库导入:

虽然所谓的“星号导入”(也就是通过from library import *指令导入库中的所有内容)有时候很方便,但是通常应该使用替代方法,避免命名空间和函数与库的关系方面的歧义。这采用如下方式实现:

任何安装中math都是可用的标准Python库,但是还有许多库是可选安装的,可以和标准库相同的方式使用。这些库来自不同的(Web)来源。然而,通常建议使用某种Python分发版本,确保所有库的相互一致(这个主题的更多内容参见第2章)。

目前为止介绍的代码示例都使用IPython(http://www.ipython.org),这可能是最流行的Python交互式开发环境(IDE),虽然它出现的时候只是一个增强的shell,但是现在已经有了许多典型的IDE特性(例如,支持性能分析和调试)。它缺乏由Sublime Text(http://www.sublimetext.com)等高级文本/代码编辑器所提供的功能,因此,将IPython与人们选择的某种文本/代码编辑器组合使用、组成Python开发过程基本工具集的情况也不少见。

IPyhon有时候也被称作Python生态系统的“杀手级应用”。它从许多方面增强了标准交互式Shell。例如,它提供了改进的命令行历史功能,并且能够进行简单的对象检查。例如,在函数名称后添加一个?就可以打印函数的帮助文本(添加??将提供更多信息):

IPython有3个不同版本:Shell版本、基于QT图形用户界面(QT console)的版本和基于浏览器的版本(Notebook)。这里只是一个摘要的说明,现在还无需操心这些版本的细节,第2章将更详细介绍IPython。

Python不仅对专业软件开发人员有吸引力,临时开发人员和领域专家、科研开发人员也使用它。

专业软件开发人员寻求高效构建大型应用程序所需的一切工具。Python支持几乎所有编程范式;有强大的开发工具;从理论上说,Python可以对付任何工作。这些类型的用户通常构建自己的框架和类,也依靠基础的Python和科学栈进行工作,并且尽最大的努力利用生态系统。

科研开发人员和领域专家通常频繁使用某些库和框架,构建他们长年改进和优化的应用程序,并且根据特定的需求调整生态系统。这组用户通常参与较长的交互式会话,快速建立新代码原型,并探索和可视化其研究及领域数据集。

临时开发人员喜欢在已知Python具有优势的特定问题上使用Python。例如,访问Matplotlib的展示页面,复制那里提供的某一段可视化代码,根据特殊需求调整这些代码,可能是对这些人有益的一个用例。

Python用户还有另一个重要的群体:编程入门者,也就是刚刚开始编程的人。现在,Python在大学、专业院校甚至中小学校中已经成为向学生介绍编程的流行语言[1]。这种现象的主要原因之一是其基本语法即使对于非开发人员也很容易学习和理解。此外,Python支持几乎所有编程风格[2]

某些库的集合被统称为科学栈(Scientific Stack),其中包括如下库。

NumPy(http://www.numpy.org

NumPy提供多维数组对象,以存储同构或者异构数据;它还提供操作这一数组对象的优化函数/方法。

SciPy(http://www.scipy.org

SciPy是一组子库和函数,实现科学或者金融中常常需要的重要标准功能;例如,你可以找到三次样条插值和数值积分的函数。

Matplotlib(http://www.matplotlib.org

这是最流行的Python绘图和可视化库,提供2D和3D可视化功能。

PyTables(http://www.pytables.org

PyTables是流行的HDF5数据存储库封装器(http://www.hdfgroup.org/HDF5/);这个库实现基于层次数据库/文件格式的优化磁盘I/O操作。

pandas(http://pandas.pydata.org

pandas在NumPy基础上构建,提供更丰富的时间序列和表格数据管理及分析类;它与Matplotlib在绘图上、与PyTables在数据存储和读取上紧密集成。

根据特定的领域或者问题,科学栈可以通过更多的库进行扩展,这些库多半在一个或者多个上述的基本库基础上构建。但是,最小公分母(或称基本组成部分)通常是NumPy ndarray类(参见第4章)。

仅从编程语言来讲,有许多其他语言在语法和简洁性上可与Python比肩。例如,Ruby也是相当流行的语言,可与Python相提并论。在该语言的网站上(http://www.ruby-lang.org),你可以找到如下的描述:

一种动态的开放源码编程语言,重视简洁性和效率。它具备简洁的语法,阅读自然、易于编写。

大部分Python使用者可能也赞成用相同的陈述描述Python本身。但是,对于许多Python用户而言,它与Ruby等同样具有吸引力的语言之间的区别在于科学栈。这使Python不仅是优秀、简洁的语言,还可以代替Matlab或者R等领域专用语言和工具集。此外,它默认提供各种人员(例如熟练的Web开发人员或者系统管理员)所需要的任何功能。

现在,我们对Python已经有了大致的认识,回头简短地介绍一下科技在金融中的作用就很有意义了。这将使我们更好地评判Python在金融行业中已经承担的任务,更重要的是,还可以评判未来承担的任务。

在某种意义上,科技对于金融机构(例如与工业企业相比)或者财务部门(与其他企业职能部门相比,如后勤)没有什么特别的作用。然而,近年来,在创新和监管的刺激下,银行和其他金融机构(如对冲基金)越来越多地发展成为技术公司而不仅仅是金融中介机构。科技成为了全球几乎所有金融机构的重要资产,具备导致竞争优势和劣势的潜力。某些背景信息可以解释这种发展的原因。

银行和金融机构共同组成了每年在科技上投入最多的行业。因此,下面的陈述不仅说明科技对金融行业的重要性,也说明了金融行业对科技的重要性:

据IDC分析师称,银行在2014年的科技投入比2013年多4.2%。这位分析师说,全球金融服务的总体IT花费在2014年将超过4300亿美元,2020年将会超过5000亿美元。

——Crosman 2013

当今的大型跨国银行通常雇佣数千名开发人员,以维护现有系统、构建新系统。具有大量科技需求的大型投资银行每年的科技预算往往达到数十亿美元。

科技发展对金融行业的创新和效率增进也有贡献:

科技创新已经为更高效的衍生品市场做出了显著的贡献。通过交易技术的创新,尽管交易量和商品报价数量猛增,欧洲期货交易所(Eurex)的交易速度仍然远快于10年前…这些显著改进只有在衍生品交易所和票据交换所不断地在IT上投入巨额资金的情况下才可能实现。

——德意志交易所集团2008

效率提高的副作用之一就是,金融机构往往必须在更为复杂的产品或者交易中寻求竞争优势。这当然会使风险增大,并使风险管理和监控、监管越来越困难。2007年和2008年的金融危机说明了这些发展带来的潜在危险。同样,“算法和计算机失控”也给金融市场带来潜在的风险;2010年5月的所谓“闪电崩盘”事件戏剧性地展现了上述风险,自动化卖出导致某些股票和股票指数在当日大幅度下跌(http://en.wikipedia.org/wiki/2010_Flash_Crash)。

一方面,在其他条件不变的情况下,随着时间的推移,科技的进步会降低成本。另一方面,金融机构持续在科技上投入巨资,以增大市场份额、保持自身地位。在今天的金融市场上取得一席之地往往需要在科技和熟练人员上大规模投资。考虑衍生品分析领域的一个例子(也可参见本书第3部分的案例研究):

在整个软件生命期中,采用内部OTC[衍生品]定价策略的公司仅在一个完整的衍生品库的构建、维护和改进上就需要投入2500~3600万美元。

——Ding 2010

构建一个完善的衍生品分析库不仅成本高昂和费时,而且需要有足够的专业人士来进行这项工作。这些专业人士必须有正确的工具和技术,才能完成他们的任务。

我们以下引用的另一段有关美国长期资本管理公司(LTCM)的陈述进一步支持关于科技和人才的观点,LTCM曾是最受尊敬的计量对冲基金,但是在20世纪90年代末破产:

Meriwether在最新型计算机系统上花费了2000万美元,并雇用一个由一流金融工程师组成的团队在LTCM操纵该系统,他们在康涅狄格州的格林威治开始工作。这是行业级别的风险管理。

——Patterson 2010

Meriwether花费数百万美元才能得到的计算能力在今天可能只需要几千美元就能实现。另一方面,大型金融机构的交易、定价和风险管理已经变得非常复杂,以致于现在必须部署具有数万个计算核心的IT基础架构。

金融行业有一个方面最受科技进步的影响:金融交易决策和执行的速度频率。Lewis最近的著作(2014)生动而详细地描述了所谓的“闪电交易”——也就是以可能的最高速度进行的交易。

一方面,可用数据的尺度越来越小使实时反应成为必需的能力。另一方面,交易的速度和频率的提高使数据量进一步增大。这两方面相互补充,推动了金融交易平均时间标度的系统性下降:

复兴资本公司的“大奖章”基金在2008年获得了80%的惊人增长率,它以闪电般速度的计算机抓住了市场极端活跃的机会。Jim Simons是当年世界盈利最高的对冲基金管理人,收入达到25亿美元。

——Patterson 2010

单只股票30年的每日股价数据大致包含7500个报价。这类数据是大部分现代金融理论的基础。例如,现代投资组合理论(MPT)、资本定价模型(CAPM)和风险价值(VaR)等理论都以每日股价数据为基础。

相比之下,苹果公司(AAPL)典型交易日报价次数大约为15000——两倍于30年间日终报价的数量。这带来了许多挑战。

数据处理

考虑和处理股票日终报价或者其他金融计量是不够的;在每周的7天、每天的24个小时内,某些计量措施上发生的事情“太多了”。

分析速度

决策往往必须在几毫秒甚至更短的时间内作出,有必要构建个别分析能力,实时分析大量数据。

理论基础

虽然传统金融理论和概念远称不上完美,但是它们经受了时间的考验(有些时候受到排斥);对于毫秒级计量能力很重要的今天,仍然缺乏在很长时间内证明是稳定的一致性概念和理论。

原则上,上述挑战都只能由现代科技应对。令人有些惊讶的是,缺乏一致性理论的问题也常常通过技术方法处理,在这种情况下,高速算法利用的是市场微观结构要素(例如,订单流、买卖价差),而不依赖于某种金融推理方法。

金融行业中有一个学科的重要性正在强劲增长:金融和数据分析。这种现象与行业中速度、频率和数据率飞速增长有紧密的关系。实际上,实时分析可以视为该行业对这种趋势的反应。

粗略地讲,“金融和数据分析”指的是应用软件和科技,与(可能是先进的)算法和数据收集、处理及分析方法相结合,以获得深刻理解、作出决策或者满足监管需求的学科。这类分析的例子包括银行零售部门中某个金融产品定价结构的变化对销售情况影响的估算。另一个例子是投资银行衍生品复杂投资组合信用价值调整(CVA)的大规模隔夜计算。

金融机构在这种环境下面对两种主要挑战。

大数据

甚至在“大数据”这一术语出现之前,银行和其他金融机构就必须处理海量数据;然而,单一分析任务所处理的数据量随着时间的推移而有了很大的增长,要求计算能力的提高和更大的内存与存储能力。

实时经济

过去,决策者只能依赖结构化的定期计划、决策和(风险)管理过程,而今天面对的是实时完成这些任务的需求;过去在后台通过隔夜批量运行可以完成的任务,现在已经转向前台实时执行。

同样,人们可以观察到科技和金融/商业方法发展之间的相互作用。一方面,有通过现代科技的应用不断改进分析方法速度和能力的需求。另一方面,科技方面的进步使几年甚至几个月之前认为不可能(或者由于预算约束而不可行)的新分析方法成为可能。

分析领域的一个重要趋势是利用CPU(中央处理单元)的并行结构和GPGPU(通用图形处理单元)的大规模并行结构。现在的GPGPU往往有超过1000个计算核心,有时候有必要彻底反思并行性对不同算法的意义。用户通常必须学习新的范型和技术才能利用这种硬件的能力[3],仍是这方面的障碍之一。

前一小节介绍了科技在金融中发挥作用的一些领域:

本节,我们分析Python如何帮助你应对这些方面的多种挑战。不过首先让我从更为基础的方面——语言和语法——介绍用于金融的Python。

在金融环境中迈出使用Python第一步的大部分人都可能要攻克某个算法问题。这和想要解出微分方程、求取积分或者可视化某些数据的科学工作者类似。一般来说,在这一阶段,对正规开发过程、测试、文档或者部署没有太多的思考。然而,这一阶段似乎是人们特别容易爱上Python的时候,主要原因是Python的语法总体上和用于描述科学问题或者金融算法的数学语法相当接近。

我们可以通过一个简单的金融算法来说明这一现象——通过蒙特卡洛模拟方法估计欧式看涨期权的价值。我们将考虑Black-Scholes-Merton(BSM)模型(参见第3章),在这种模型中期权潜在风险遵循几何布朗运动。

假定我们使用如下数值化参数进行估值:

在BSM模型中,到期指数水平是一个随机变量,由公式1-1给出,其中z是一个标准正态分布随机变量。

公式1-1 Black-Scholes-Merton(1973)到期指数水平

(1-1)

下面是蒙特卡洛估值过程的算法描述

1.从标准正态分布中取得 I 个(伪)随机数 z(i ),i∈{1,2,…,I }。

2.为给定的 z (i ) 和公式1-1计算所有到期指数水平ST(i)。

3.计算到期时期权的所有内在价值hT(i)=max(ST(i )−K,0)。

4.通过公式1-2中给出的蒙特卡罗估算函数估计期权现值。

公式1-2 欧式期权的蒙特卡洛估算函数

(1-2)

现在,我们将这个问题和算法翻译为Python代码。读者可以使用IPython跟踪单独的步骤——但是在这一阶段实际上并不是必需的。

首先,我们从参数值开始。这真的很简单。

接下来是估值算法。这里,我们第一次使用NumPy,它使我们的第二项任务变得相当轻松。

第三步是打印结果。

输出可能是如下所示[4]

有下面3个方面值得注意。

语法

Python语法与数学语法相当接近,例如,在参数赋值的方面。

翻译

每条数学或者算法语句一般都可以翻译为单行Python代码。

向量化

NumPy的强项之一是紧凑的向量化语法,例如,允许在单一代码行中进行10万次计算。

这段代码可以用于IPython等交互式环境。但是,需要频繁重用的代码一般组织为所谓的模块(或者脚本),也就是带有.py后缀的Python(文本)文件。本例的这种模块如例1-1所示,可以保存为名为bsm_msc_euro.py的文件。

例1-1 欧式看涨期权的蒙特卡洛估值

这一小节中的简单算法示例说明Python的基本语法很适合为经典的科学语言二重奏——英语和数学——提供补充。在科学语言组合中添加Python似乎使其更加全面。我们现在拥有:

数学和Python语法

几乎没有任何编程语言像Python这样接近数学语法。因此,数值算法很容易从数学表示翻译为Python实现。使用Python,可以在这些领域中高效地进行原型化、开发和代码维护。

在某些领域中,使用伪代码是常见的做法,从而引入了第4个语言家族成员。举个例子,伪代码的任务是以更技术性的方式表示金融算法,不但仍然接近于数学表示,而且和技术实现已经相当接近。除了算法本身,伪代码还考虑了计算机的工作原理。

采用这种方法一般是因为使用大部分编程语言时,技术实现和正式的数学表现形式距离相当“遥远”。大部分编程语言都必须包含许多只在技术上必要的元素,在数学和代码之间很难看到等价的元素。

时下,Python常常以伪代码方式使用,因为它的语法和数学很类似,而且技术“开销”可以控制到最低。这一点是通过该语言所体现的一些高层概念实现的,这些概念不仅有其优势,也带来了风险和其他代价。不过可以肯定,可以在需求出现的时候使用Python,从一开始就遵循其他语言可能需要的严格实现和编码方法。从这个意义上说,Python可以在两个世界中提供最佳的平衡:高层次的抽象严格的实现

从较高的层次看,使用Python的好处可以从3个维度衡量。

效率

Python如何更快地获得结果、节约成本、节约时间?

生产率

Python如何在相同的资源(人员、资产等)下完成更多的工作?

质量

Python能够让我们做哪些替代技术所不能做到的事情?

对这些特性的讨论当然不可能很全面。然而,可以将某些参数作为出发点。

在更短的时间里得到成果

Python效率较为明显的领域之一是交互式的数据分析。这些领域从IPython等有力工具和pandas之类的程序库获益良多。

考虑一位正在撰写硕士论文的金融专业学生,她对Google的股价感兴趣,想要分析5年的历史股价信息,以了解股价变动在这段时间内的波动性。她希望找到证据证明这种变动性与某些典型的模型假设相反,是随时间变动而决非固定。而且,结果应该进行可视化,主要的工作如下:

这些任务很复杂,在不久之前还被认为是专业金融分析师才能完成的。而在今天,即使是金融专业的学生也可以轻松地对付这类问题。我们来看看具体的做法——此时还不用操心语法的细节(后续的章节中将对所有细节进行解释)。

首先,确保所有必要的库可用。

其次,读取数据(例如从Google网站)。

第三步,实现对波动率的必要分析。

最后一步,绘制结果图表。为了生成内联图表,我们使用IPython的“魔法”命令%matplotlib,加上inline选项。

图1-1展示了在IPython进行的这一简短交互会话所得到的图形化结果。用4行代码就足以完成金融分析中遇到的典型复杂任务:数据收集、复杂和重复的数学计算以及结果的可视化,几乎令人觉得不可思议。这个例子中可以看到,pandas使整个时间系列的处理变得就像浮点数上的数学运算那样容易。

图1-1 Google收盘价格和年度波动率

将这个例子转换到专业的金融环境中,可以看出金融分析师们在应用提供高层次抽象的合适Python工具和库的时候,能够将焦点放在自身的领域上,而不用关心复杂的技术细节。分析师们可以快速反应,几乎实时提供宝贵的深刻见解,确保自己比竞争对手先行一步。这种效率的提高很容易转换为可度量的财务效果。

确保高性能

一般来说,Python的语法相当简洁,编码效率相对高是为人们所接受的说法。但是,由于Python本质上是解释型语言,因此存在一种偏见,认为Python对于金融学中的计算密集任务来说过于缓慢。确实,在某些特定的实现方法下,Python可能确实很慢,但是,它并不一定都那么缓慢——它可以在几乎任何应用领域中表现出高性能。理论上,人们至少可以找到3种提高性能的策略。

范型

一般来说,Python可以用许多不同的方式得出相同的结果,但是这些方式的性能特性有相当大的区别;只要选择合适的方式(例如,特定的库),就可以显著地改善效果。

编译

现在,有许多高性能库提供重要函数的编译版本,或者将Python代码静态或者动态地(在运行时或者调用时)编译为机器代码,这种代码的速度要快好几个数量级;比较流行的高性能库有Cython和Numba等。

并行化

许多计算任务(特别是金融学中的计算任务)可以从并行执行中得到很大好处;这对Python来说不足为奇,可以轻松地实现。

使用Python实现高性能计算

Python本身不是一种高性能计算技术。但是,Python已经发展成为一种访问当前高性能技术的理想平台。在这个意义上,Python已经成为高性能计算的“黏合剂”语言

后续的章节将详细介绍这3种技术。现在,我们打算坚持用简单而实际的例子介绍这3种技术。

金融分析中相当常见的任务之一是在大量数字上计算复杂的数学表达式。在这方面,Python本身就提供了所有必须的功能:

Python解释程序在本例中需要15秒时间来完成2500万次函数f的计算。

使用Numpy可以完成相同的任务,它提供了优化(也就是预先编译)的函数,处理这种基于数组的运算:

使用Numpy将执行时间大幅缩减到1.7秒。

甚至有一个库是专门用于此类任务的,这个库称作numexpr,得名于“数值表达式”(Numerical Expressions)。它编译表达式,改善NumPy通用功能的性能,例如,在执行期间避免数组在内存中复制:

使用这种更特殊的方法进一步将执行时间降低到1.2秒。而且,numexpr还内建并行执行单独运算的功能。这使我们能够使用一个CPU的所有可用线程:

本例中,利用2个核心、4个线程,执行时间进一步下降到0.5秒。总体的性能提升了30倍。特别要注意的是,这类改善不需要修改基本问题/算法,也不用了解任何有关编译和并行化问题的知识,即使是非专业人士也可以从较高的层次上去利用这种功能。当然,人们必须知道存在这些功能。

这个例子说明,Python提供了一些选项,更好地利用现有资源——也就是说,提高生产率。采用串行化技术,每秒可以完成2100万次计算,而并行化方法每秒可以计算将近4800万次——这只需要告诉Python使用所有可用CPU线程(而非仅使用一个线程)即可实现。

从执行速度的角度看,交互式分析的效率和性能当然是Python值得考虑的两个好处。在金融学中使用Python的另一个好处初看似乎比较细微;但是细看之下就会发现它本身是一个重要的战略因素。这就是以端到端(从原型化到生产)的方式使用Python的可能性。

当今全球金融机构的金融开发过程往往是一个分离的两步式过程。一方面,量化分析师(“quants”也称“宽客”)负责模型开发和技术原型化。他们喜欢使用MatLab和R等工具和环境实现快速、交互式的应用程序开发。在开发的这一阶段,性能、稳定性、异常管理、数据访问分离和分析等问题都不重要。人们的主要目标是一种概念验证或者原型,展现某种算法或者整个应用程序主要的必需功能。

一旦原型完成,IT部门中的开发人员接管工作,他们负责将现有原型代码翻译为可靠、易于维护和高性能的生产代码。这一阶段通常在用于满足生产性能的C++或者Java语言中有一个范型转换的过程。而且,正规的开发过程还要应用专业工具、版本控制等技术。

这种两步式方法通常会产生一些意外的结果。

效率低下

原型代码不能重用;算法必须实现两次;多余的工作消耗时间和资源。

多种技能集

不同部门展现不同的技能集合,使用不同的语言实现“相同的工作”。

遗留代码

代码必须以不同的语言存在和维护,往往使用不同的实现风格(例如,从架构的观点上看)。

另一方面,使用Python可以实现从最初的交互式原型化步骤到高可靠性、易于维护的生产代码的合理化端到端过程。不同部门之间的沟通变得更加简单,工作人员的培训也更为合理,只有一种主要语言覆盖金融应用构建的所有领域,还避免了在开发过程不同步骤中使用不同技术的低效和冗余性。总而言之,Python可以为金融应用开发和算法实现提供一致性的技术框架

Python作为一种语言——但是更多的是作为生态系统——是金融业理想的技术框架。它的特性中有许多好处,比如简洁的语法、高效的开发方法和原型化及生产的易用性等。利用Python大量的可用库和工具,似乎能够应付当今金融业中分析、数据量和频率、依从性及监管所引发的大部分问题。即使在较大型的金融机构中,它也具备提供单一、强大、一致性的框架,简化端到端开发和生产工作的潜力。

下面两本书介绍Python在金融中的应用:

本章中引用了如下资源:

[1]例如,Python已经成为纽约城市大学金融工程研究生课程中使用的主要语言之一(http://mfe.baruch.cuny.edu)。——原注

[2]http://wiki.python.org/moin/BeginnersGuide上可以找到许多开发人员和非开发人员学习Python入门知识的宝贵资源。——原注

[3]第8章提供了在随机数生成中利用现代GPGPU的一个例子。——原注

[4]这种数值估算的输出取决于使用的伪随机数。因此,结果可能不同。——原注


基础架构比体系结构还要重要得多。

——Rem Koolhaas

你可能会说基础架构不是一切,但是没有基础架构,什么东西都可能毫无意义——在现实世界或者技术中都是如此。那么,我们所说的基础架构是指什么呢?理论上,它是使简单Python脚本或者更复杂的Python应用程序得以执行的硬件和软件组件。

但是,本章并不打算详细介绍硬件基础架构,因为所有Python代码和示例应该可以在几乎所有硬件上执行[1]。我们在此也不打算讨论不同的操作系统,因为Python代码理论上可以在具备Python可用版本的任何操作系统上执行。本章讨论的是如下的主题。

部署

如何以一致性的方式确保部署Python和应用程序所需的一切组件可用?本章介绍Anaconda,这种Python分发版本可以相当高效地部署,还要介绍Python Quant Platform,该平台可以进行基于Web和浏览器的部署。

工具

应该使用什么工具进行(交互式)Python开发和数据分析?本章介绍2种最为流行的Python开发环境——IPython和Spyder。

附录A中还将介绍:

最佳实践

开发Python代码时应该遵循哪些最优方法?这个附录简短地回顾了Python代码语法和文档的基础。

本节说明如何在本地(或者服务器上)以及通过Web浏览器部署Python。

有些操作系统自带某个版本的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程序,转到安装程序所在的目录,输入:

$ bash Anaconda -1.x.x-Linux-x86[_64].sh

用你的安装程序文件名称代替上面的文件名。然后按照提示进行。在Apple计算机上也相同,只要输入:

$ bash Anaconda -1.x.x-MacOSX-x86_64.sh

确保用正确的文件名代替上述文件名,也可以使用图形化的安装程序。

安装之后,你就拥有了100多个库和软件包,立即就可以使用。其中的科学与数据分析软件包在表2-1中列出。

表2-1 Anaconda中包含的一些库和软件包

名称

描述

BitArray

布尔数组所用的对象类型

Cubes OLAP

在线分析处理(OLAP)应用程序框架

Disco

分布式计算所用的mapreduce实现

Gdata

Google数据协议实现

Hspy

Python HDF5文件格式封装器

HDF5

快速I/O操作所用的文件格式

IPython

交互式开发环境(IDE)

lxml

用Python处理XML和HTML

matplotlib

标准2D和3D绘图库

MPI4Py

消息解析接口(MPI)的并行计算实现

MPICH2

另一个MPI实现

NetworkX

构建和分析网络模型及算法

numexpr

优化的数值表达式执行

NumPy

强大的数组类及该类上的优化函数

Pandas

高效处理时间序列数据

PyTables

使用HDF5的层次化数据库

SciPy

科学函数集合

Scikit-Learn

机器学习算法

Spyder

Python IDE,具有语法检查、调试和检查功能

statsmodels

统计模型

SymPy

符号计算和数学

Theano

数学表达式编译器

如果安装过程成功,应该打开一个新的终端窗口,然后可以在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/上找到。

有许多原因促使我们希望通过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 Python Quant Platfrom屏幕截图

编程语言的成功和流行,在某种程度上归功于该语言可用的工具。Python长时间以来都被认为是一种精细、易学、易用的语言,但是缺乏用于交互分析或者开发的一组具有吸引力的工具。这一点已经有了改变,现在有大量工具可以帮助分析人员和开发人员在Python上取得很高的效率。对这些工具不可能做全面的概述,但是,我们可以重点介绍当今最流行的两种工具:IPython和Spyder[5]

从完整性出发,我们首先考虑使用标准的Python解释程序。从系统shell/命令行接口,输入python就可以调用Python:

可以在标准提示符下进行很多Python工作,但是大部分人都更愿意使用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控制台屏幕截图。

图2-2 IPython的QT控制台

最后,Notebook版本可以这样调用:

图2-3展示了IPython Notebook会话的屏幕截图。inline选项的效果同样是使图表显示在IPython Notebook中,而不是显示在单独的窗口中。

图2-3 基于浏览器的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代码和漂亮的格式化文本。

图2-4 IPython Notebook Markdown渲染的屏幕截图

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)

描述公式2-1的LaTeX代码大约如下:

图2-5展示了一个包含Markdown文本和LaTeX文本的原始文本单元格,以及MarkDown单元格中渲染的结果,图中还展示了一个更复杂的公式:欧式看涨期权的Black-Scholes-Merton期权估价公式——第3章中的公式3-1。

图2-5 Markdown和LaTeX金融公式

魔法命令

IPython的优势之一是魔法(Magic)命令。它们的“魔法”表现为在标准的Python shell功能性基础上添加某些真正有益和强大的功能。基本信息和这些功能的帮助可以通过如下命令访问:

如下命令可以在IPython会话中生成所有可用魔法命令的列表:

例如,在交互式计算中,魔法命令可以用于简单的剖析任务。对于这种用例,你可以使用%time或者%prun:

还有另外一条命令%timer或者%%timeit,用于求得单一代码行或者IPython Notebook中整个单元格内代码的时间:

上述函数执行多次循环,获得函数调用或者代码片段持续时间的可靠估算。

无法详细解释IPython提供的所有魔法函数。但是,IPython本身坚持尽可能简化IPython及其命令相关信息的查找。其中最有用的方法在表2-2中列出(http://bit.ly/ipython_tutorial)。

表2-2 精选的IPython帮助函数

名称

描述

IPython功能的简介和概述

%quickref

快速参考

help

Python自身的帮助系统

object?

关于“object”的细节;使用object??可获得更多细节

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的更多信息。

虽然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提供的环境的人们来说。不过,高级编程人员也可以在单一环境内找到许多有益的开发功能。

图2-6 Spyder屏幕截图

如果你是初学者、临时Python开发人员或者来自不同编程背景的专业人士,Python的入门一般相当简单,只需要几个简单的步骤。首先,应该安装合适的Python分发版本(如Anaconda),以获得一致的Python环境,也可以简化定期更新的过程。

有了Anaconda之类的分发版本,就拥有了交互式实践数据和金融分析所需的最重要工具(例如IPython),或者以更传统的实现-测试-调试风格开发更大应用程序的工具(例如Spyder)。当然,可以加入自己喜欢的编辑器,这些编辑器可能已经包含了Python语法高亮显示功能。如果你还寻求语法和代码检查功能,可以考虑Spyder内建的编辑器或者任何以Python为焦点的编辑器。

附录A介绍了一些语法文档单元测试领域中的最优方法。在语法中,空格和空行以及代码块缩进起到了重要的作用。至于文档,应该考虑在任何函数或者类中包含文档字符串,提供输入参数、输出和可能错误等背景和帮助信息以及使用示例。最后,应该从一开始就在开发过程中包含单元测试(至少对于较大的项目或者与更广泛拥护基础共享的项目)并使用专门工具简化测试过程。

下面的网络资源有助于本章介绍的主题。

下面的书籍很好地介绍了Python部署和IPython开发环境使用:

[1]例如,一般来说,Python代码和示例甚至可以在大约30美元就能买到的树莓派(http://www.raspberrypi.org)上运行,但是某些应用程序很快会发生内存问题。不过,从硬件来说,Python的要求是相当低的。——原注

[2]对于想要控制所安装的库和软件包的人们,可以使用Miniconda,它仅自带最小化的Python安装。http://conda.pydata.org/miniconda.html。——原注

[3]也有包含来自ContinuumAnalytics的专利库Accelerate的Anaconda版本。这种商业化版本的目标是改进典型Python的操作性能,必须在许可证下使用。——原注

[4]这只是从Python 2.7.x到3.x的一个细微无害的语法更改,但可能使某些Python新手感到困惑。——原注

[5]对于Windows用户和开发人员,Python在Visual Studio中的全面集成是很有吸引力的替代环境。甚至可以找到一整组用于Visual Studio的Python工具(http://pytools.codeplex.com)。——原注

[6]从IPython 2.0起,这种单元格被称作原始MBConvert。——原注

[7]不过,可以为IPython配置自己喜欢的编辑器,用魔法命令%editor FILENAME调用。——原注


一图胜千言。

——Arthur Brisbane(1911)

本章介绍的是matplotlib库(http://www.matplotlib.org)的基本可视化功能。尽管有许多其他的可视化库,但是matplotlib已经确立了一个标杆,在许多情况下,它都是健壮、可靠的可视化工具。对于标准的绘图工作,它很容易理解,进行更复杂的绘图和自定义时,它又很灵活。此外,它与Numpy及其提供的数据结构紧密集成。

本章主要介绍如下主题:

2D绘图

从最简单的图形到具有两种刻度或者不同子图的较高级图形;还介绍典型的金融图表,例如烛柱图。

3D绘图

介绍一些对金融应用有用的3D图形。

本章无法全面地介绍Pythonmatplotlib所能进行的数据可视化,但是提供了对金融学最基本和最重要的功能示例。后续的章节中还可以找到其他示例。例如,第6章说明如何用pandas库可视化时间序列数据。

首先,我们必须导入对应的库。主要的绘图函数在子库matplotlib.pyplot中:

在下面的所有例子中,我们将按照存储在NumPy ndarray对象中的数据绘制图表。当然,matplotlib也能够按照以不同的Python格式存储的数据(如列表对象)绘制图表。首先,我们需要用于绘制图表的数据。为此,我们生成20个标准正态分布(伪)随机数,保存在一个NumPy ndarray中:

pyplot子库中的plot函数是最基础的绘图函数,但是也相当强大。原则上,它需要两组数值。

当然,x和y值的数量必须相等,考虑下面两行代码,其输出如图5-1所示:

图5-1 按照给定的x和y值绘图

plot会注意到何时传递了ndarray对象。在这种情况下,没有必要提供x值的“额外”信息。如果你只提供y值,plot以索引值作为对应的x值。因此,下面一行代码会生成完全一样的输出。(参见图5-2):

图5-2 按照一维数组给出的数据绘图

NumPy数组和matplotlib

可以简单地向matplotlib函数传递NumPy ndarray对象。函数能够解释数据结构以简化绘图工作。但是要注意,不要传递太大或者太复杂的数组。

由于大部分ndarray方法返回的仍然是一个ndarray对象,也可以附加一个方法(有些时候甚至可以附加多个方法)传递对象。我们用样板数据调用ndarray对象上的cumsum方法,可以获得这些数据的总和,并且和预想的一样得到不同的输出(见图5-3):

图5-3 按照给定的一维数组和附加方法绘图

一般来说,默认绘图样式不能满足报表、出版等的典型要求。例如,你可能希望自定义所使用的字体(例如,为了LaTeX字体兼容)、在坐标轴上有标签或者为了更好的可辨认性而绘制网格。因此,matplotlib提供了大量函数以自定义绘图样式。有些函数容易理解,其他的则需要更深入一步研究。例如,操纵坐标轴和增加网格及标签的函数很容易理解(参见图5-4):

图5-4 带有网格和紧凑坐标轴的图表

表5-1列出了plt.axis的其他选项,大部分都以字符串对象的形式传递。

表5-1 plt.axis选项

参数

描述

Empty

返回当前坐标轴限值

off

关闭坐标轴线和标签

equal

使用等刻度

scaled

通过尺寸变化平衡刻度

tight

使所有数据可见(缩小限值)

image

使所有数据可见(使用数据限值)

[xmin, xmax, ymin, ymax]

将设置限制为给定的(一组)值

此外,可以使用plt.xlimplt.ylim设置每个坐标轴的最小值和最大值。下面的代码提供了一个示例,输出如图5-5所示:

图5-5 使用自定义坐标轴限值绘制图表

为了得到更好的易理解性,图表通常包含一些标签——例如描述xy值性质的标题和标签。这些标签分别通过plt.title, plt.xlabeplt.ylabel添加。默认情况下,即使提供的数据点是离散的,plot也绘制连续线条。离散点的绘制通过选择不同的样式选项实现。图5-6覆盖(红色)点和线宽为1.5个点的(蓝色)线条:

图5-6 带有典型标签的图表

默认情况下,plt.plot支持表5-2中的颜色缩写。

表5-2 标准颜色缩写

字符

颜色

b

g

绿

r

c

m

品红

y

k

w

对于线和点的样式,plt.plot支持表5-3中列出的字符。

表5-3 标准样式字符

字符

象征

-

实线样式

--

短划线样式

-.

点实线样式

:

虚线样式

.

点标记

,

像素标记

o

圆标记

v

向下三角形标记

^

向上三角形标记

<

向左三角形标记

>

向右三角形标记

1

Tri_down标记

2

Tri_up标记

3

Tri_left标记

4

Tri_right标记

s

方形标记

p

五边形标记

*

星号

h

六角形标记1

H

六角形标记2

+

加号

x

X标记

D

菱形标记

d

细菱形标记

|

垂直标记

任何颜色缩写都可以与任何样式字符组合,这样,你可以确保不同的数据集能够轻松区分。我们将会看到,绘图样式也会反映到图例中。

按照一维数据绘图可以看做一种特例。一般来说,数据集包含多个单独的子集。这种数据的处理遵循matplotlib处理一维数据时的原则。但是,这种情况会出现其他一些问题,例如,两个数据集可能有不同的刻度,无法用相同的y或x轴刻度绘制。另一个问题是,你可能希望以不同的方式可视化两组不同数据,例如,一组数据使用线图,另一组使用柱状图。

首先,我们生成一个二维样本数据集。下面的代码生成包含标准正态分布(伪)随机数的20×2 NumPy ndarray。在这个数组上调用cumsum计算样本数据在0轴(即第一维)上的总和:

一般来说,也可以将这样的二维数组传递给plt.plot。它将自动把包含的数据解释为单独的数据集(沿着1轴,即第二维)。对应的图表如图5-7所示:

图5-7 用两个数据集绘制图表

在这种情况下,进一步的注释有助于更好地理解图表,可以为每个数据集添加单独的标签并在图例中列出。plt.legend接受不同的位置参数。0表示“最佳位置”,也就是图例尽可能少地遮盖数据。图5-8展示了包含两个数据集的图表,这一次带有图例。在生成代码中,我们没有传递整个ndarray对象,而是分别访问两个数据子集(y[:, 0]和y[:, 0]),可以为它们附加单独的标签:

图5-8 带有数据集的图表

plt.legend的其他位置选项在表5-4中列出。

表5-4 plt.legend选项

位置选项

描述

空白

自动

0

最佳

1

右上

2

左上

3

左下

4

右下

5

6

中左

7

中右

8

中下

9

中上

10

多个具有类似刻度的数据集(如同一金融风险因素的模拟路径)可以用单一的y轴绘制。但是,数据集常常有不同的刻度,用单一y轴刻度绘制这种数据的图表通常会导致可视化信息的显著丢失。为了说明这种效果,我们将两个数据子集中的第一个扩大100倍,再次绘制该图(参见图5-9):

图5-9 包含两个不同刻度数据集的图表

观察图5-9可以看出,第一个数据集仍然是“在视觉上易于辨认的”,而第二个数据集在新的Y轴刻度上看起来像一条直线。在某种程度上,第二个数据集的有关信息现在“在视觉上已经丢失”。解决这个问题有两种基本方法:

我们首先在图表中引入第二个y轴。图5-10中有两个不同的y轴,左侧的y轴用于第一个数据集,右侧的y轴用于第二个数据集,因此,有两个图例:

图5-10 包含两个数据集、两个y轴的图表

管理坐标轴的代码行是关键,如:

通过使用plt.subplots函数,可以直接访问底层绘图对象(图、子图等)。例如,可以用它生成和第一个子图共享x轴的第二个子图。图5-10中有两个相互重叠的子图。

接下来,考虑两个单独子图的情况。这个选项提供了处理两个数据集的更大自由度,如图5-11所示:

   

图5-11 带有两个子图的图表

matplotlib figure对象中子图的定位通过使用一种特殊的坐标系来实现。plt.subplot有3个整数参数,即numrowsnumcolsfignum(可能由逗号分隔,也可能没有)。numrows指定行数numcols指定列数fignum指定子图编号(从1到numrows×numcols)。例如,有9个大小相同子图的图表有numrows=3numcols=3fignum=12,…,9。左下角的子图“坐标”如下:plt.subplot(3,3,9)

有时候,选择两个不同的图表类型来可视化数据可能是必要的或者是理想的。利用子图方法,就可以自由地组合matplotlib提供的任意图表类型[1]。图5-12组合了线图/点图和柱状图:

图5-12 组合线/点子图和柱状子图

对于二维绘图,线图和点图可能是金融学中最重要的;这是因为许多数据集用于表示时间序列数据,此类数据通常可以由这些图表进行可视化。第6章详细探讨金融时间序列数据。但是,现在我们坚持使用二维数据集并说明一些对金融应用程序有用的替代可视化方法。

我们要介绍的第一种图表是散点图,这种图表中一个数据集的值作为其他数据集的x值。图5-13展示了一个这种图表。例如,这种图表类型可用于绘制一个金融时间序列的收益和另一个时间序列收益的对比。在下面的例子中,我们将使用二维数据集和其他一些数据:

图5-13 用plot函数绘制散点图

matplotlib还提供了生成散点图的一个特殊函数。它的工作方式本质上相同,但是提供了一些额外的功能。图5-14展示了与图5-13对应的散点图,这次使用的是scatter函数:

图5-14 通过scatter函数绘制散点图

例如,scatter绘图函数可以加入第三维,通过不同的颜色进行可视化,并使用彩条加以描述。为此,我们用随机数据生成第三个数据集,这次使用的是0和10之间的整数:

图5-15展示的散点图有不同颜色小点表示的第三维,还有作为颜色图例的彩条:

图5-15 具备第三维的散点图

另一种图表类型直方图也常常用于金融收益中。图5-16在同一个图表中放置两个数据集的频率值:

图5-16 两个数据集的直方图

由于直方图是金融应用中的重要图表类型,我们要更认真地观察plt.hist的使用方法。下面的例子说明了所支持的参数:

表5-5提供了plt.hist函数主要参数的描述。

表5-5 plt.hist参数

参数

描述

x

列表对象,ndarray对象

bins

数据组(bin)数

range

数据组的下界和上界

normed

规范化为整数1

weights

x轴上每个值的权重

cumulative

每个数据组包含较低组别的计数

histtype

选项(字符串):bar, barstacked, step, stepfilled

align

选项(字符串):left, mid, right

orientation

选项(字符串):horizontal, vertical

rwidth

条块的相对宽度

log

对数刻度

color

每个数据集的颜色(类似数组)

label

标签所用的字符串或者字符串序列

stacked

堆叠多个数据集

图5-17展示了一个类似的图表;这次,两个数据集的数据在直方图中堆叠:

图5-17 两个数据集堆叠的直方图

另一种实用的图表类型是箱形图。和直方图类似,箱形图可以简洁地概述数据集的特性,很容易比较多个数据集。图5-18展示了按照我们的数据集绘制的这类图表:

图5-18 两个数据集的箱形图

最后一个例子使用plt.setp函数,该函数设置(一组)图表实例的属性。例如,考虑下列代码生成的线图:

使用如下的代码:

将线的样式更改为“短划线”。这样,可以轻松地在图表实例(“艺术家对象”)生成之后改变参数。

在本节的最后一个例证中,我们考虑一个受到数学启迪的图表,这个例子也可以在matplotlib的“展厅”中找到(http://www/matplotlib.org/gallery.html)。它绘制一个函数的图像,并以图形的方式说明了某个下限和上限之间函数图像下方区域的面积——换言之,从下限到上限之间的函数积分值。图5-19展示了结果图表,说明matplotlib能够无缝地处理LaTeX字体设置,在图表中加入数学公式:

图5-19 指数函数、积分面积和LaTeX标签

下面我们一步一步地完成这个图表的生成。第一步是定义需要求取积分的函数:

第二步是定义积分区间,生成必需的数值:


第三,绘制函数图形:

第四步是核心,我们使用Polygon函数生成阴影部分(“补丁”),表示积分面积:

第五步是用plt.textplt.figtext在图表上添加数学公式和一些坐标轴标签。LaTeX代码在两个美元符号之间传递($ … $)。两个函数的前两个参数都是放置对应文本的坐标值:

最后,我们分别设置x和y刻度标签的位置。注意,尽管我们以LaTeX渲染变量名称,但是用于定位的是正确的数字值。我们还添加了网格,在这个特殊例子中,只是为了强调选中的刻度:

matplotlib还提供了少数精选的特殊金融图表。这些图表(如烛柱图)主要用于可视化历史股价数据或者类似的金融时间序列数据,可以在matplotlib.finance子库中找到:

作为一个方便的函数,该子库可以简单地从雅虎财经网站(http://finance.yahoo.com)读取历史股价数据。你所需要的只是起始和结束日期,以及对应的股票代码。下面的代码读取德国DAX指数的数据,其股票代码为^GDAXI:

Web来源的数据质量

现在,有几个Python库都提供了方便的函数,可以从雅虎财经读取数据。但是要注意,尽管这是可视化财经数据集的方便手段,但是数据质量不足以作为任何重要投资决策的基础。例如,拆股会造成“价格大跌”,雅虎财经中的数据往往没有正确地考虑这一点。其他免费的数据源也有类似的情况。

quotes现在包含了DAX指数的时间序列数据,包括日期(采用纪元时间格式)、开盘价、最高价、最低价、收盘价成交量

matplotlib.finance的绘图函数准确地理解可能传递的格式和数据集,例如,传递给candlestick函数的数据。图5-20展示了结果。每日的正收益蓝色的矩形表示,负收益由红色矩形表示。你可能会注意到,matplotlib根据数据集中的日期信息,为x轴设置正确的标签:

图5-20 金融数据的烛柱图

在上述代码中,plt.setp(plt.gca().get_xticklabels(), rotation=30)将x轴标签旋转30度。为此使用了plt.gca函数,该函数返回当前figure对象。然后,调用get_xticklabels方法提供图形的x轴刻度标签。

表5-6提供了mpf.candlestick函数不同参数的说明。

表5-6 mpf.candlestick参数

参数

描述

ax

绘图使用的Axes实例

quotes

绘图使用的金融数据(时间、开盘价、收盘价、最高价、最低价序列)

width

矩形宽度代表的天数

colorup

收盘价 开盘价时的矩形颜色

colordown

收盘价<开盘价时的矩形颜色

alpha

矩形的Alpha级别

plot_day_summary函数提供了一个相当类似的图表类型,使用方法和candlestick函数相同,使用类似的参数。这里,开盘价和收盘价不是由彩色矩形表示,而是由两条短水平线表示,如图5-21所示:


     

图5-21 金融数据每日摘要图表

股价数据往往和成交量数据结合,在一张图表中同时提供市场活动的相关信息。下面的代码说明这种基于雅虎公司股价历史数据的用例,结果如图5-22所示:

图5-22 烛柱图和成交量柱状图组合而成的图表

金融中从3维可视化中获益的领域不是太多。但是,波动率平面是一个应用领域,它可以同时展示许多到期日和行权价的隐含波动率。在下面的例子中,我们人为生成一个类似波动率平面的图表。为此,我们考虑如下因素:

1.行权价格在50~150元之间;

2.到期日在0.5~2.5年之间。

这为我们提供了一个2维坐标系。我们可以使用NumPymeshgrid函数,根据两个1维ndarray对象生成这样的坐标系:

上述代码将两个1维数组转换为2维数组,在必要时重复原始坐标轴值:

现在,根据新的ndarray对象,我们通过简单的比例调整二次函数生成模拟的隐含波动率

下面的代码得出图5-23中的图表:

图5-23 (模拟)隐含波动率的3D曲面图

表5-7提供了plot_surface函数使用的不同参数的描述。

表5-7 plot_surface参数

参数

描述

X, Y, Z

2D数组形式的数据值

rstride

数组行距(步长大小)

cstride

数组列距(步长大小)

color

曲面块颜色

cmap

曲面块颜色映射

facecolors

单独曲面块表面颜色

norm

将值映射为颜色的Normalize实例

vmin

映射的最小值

vmax

映射的最大值

和2维图表一样,线样式可以由单个点或者下例中的单个三角形表示。图5-24用相同的数据绘制3D散点图,但是现在用view_init函数设置不同的视角:

图5-24 (模拟)隐含波动率的3D散点图

matplotlib可以视为Python数据可视化的基准和主力,它与NumPy紧密集成,基本功能可以轻松而方便地访问。但是,另一方面,matplotlib是相当强大的库,具有复杂的API,在本章中无法广泛地概述matplotlib的所有功能。

本章介绍了matplotlib可用于大部分金融环境下的基本2D和3D绘图函数。其他章节提供使用这个可视化基本库的进一步示例。

matplotlib的主要资源可以在下面的网站上找到。

访问展厅已经成为某种标准规程,在那里可以看到相应的可视化示例,从对应的示例代码开始工作。例如,使用IPython Notebook,当你找到合适的示例,只需要一个命令就可以开始了。

[1]可用图表类型的概述可以访问matplotlib展厅(http://mtplotlib.org/gallery.html)。——原注


相关图书

金融软件测试从入门到实践
金融软件测试从入门到实践
金融科技2.0:从数字化到智能化
金融科技2.0:从数字化到智能化
Python金融实战案例精粹(第2版)
Python金融实战案例精粹(第2版)
银行信息科技:构建银行数字化发展新图景
银行信息科技:构建银行数字化发展新图景
金融中的人工智能
金融中的人工智能
Python期货量化交易
Python期货量化交易

相关文章

相关课程