为啥Python 将会成为金融金融工程编程语言言

作者:Venkatesan Murugan
翻译:李静儿
Java将死的言论每隔一段时间就会出来,但现实总会给这样的言论啪啪打脸。可是,随着数据挖掘、机器学习、AI等热门技术的流行,Python越来越受欢迎了,本文作者不禁提出,Python会比Java更受欢迎吗?以下为译文:
根据现在的IT编程趋势,从作业数量、Java开发人员数量和IT行业的整体使用数据这几个方面来看,现在Java是最受欢迎的编程语言。根据某个技术调查网站发布的最新使用统计数据来看,有3.0%的网站使用Java作为服务器端的编程语言,而使用Python的只有0.2%。但是,最近所有报告都强调:对比Java,Python的使用率和受欢迎程度持续快速增长,Java的使用率已经连续好几年都在下降。
据myTectra统计,从2013年就开始关注Python和Java,数据来源于Naurki对Bangalore地区2013年以来发布的作业数量。从下表中可以看到对Java的需求连续几年都在减少,而对Python的需求连续增长,2014年为200,到2017年已高于6500。
从Indeed作业发布的统计数据来看,Python是持续增长的唯一编程语言,而Java却在大幅下降。
所以,让程序员了解这两种流行的编程语言之间的主要区别还是很有必要的。
Java和Python之间的重要区别
二者都是通用的编程语言。Java是静态语言,需要显示声明所有的变量名;而Python是动态语言,无需显示声明变量名。
在一般编程任务中,Java要求开发人员把代码行写得比较长。还要另外花时间来组织、维护和更新Java代码库。而短小精悍的Python句法让开发人员可以轻松表达概念。这进一步强调了代码生成的可重用性和可读性。因此,程序员在维护和更新代码库就更容易了。两种语言都是定期更新的。程序员可以用Java 8来获得一些新功能,包括lambda表达式、新的日期/时间接口和一些新功能的接口。更可喜的是,开发者可以轻易地从版本7切换到版本8。但要在Python 2.x和Python 3.x之间作出抉择就不太容易了。这两个版本是平行维护的,因此在两个版本之间切换不太容易。
Java让程序员更容易创建轻便的跨平台应用。这些应用可以在安装了JVM的任何设备上使用。另一方面,开发人员需要使用Python编译器来将Python写的代码转换成特定操作系统可读的代码。因为很多设备上都有安装JVM,开发人员可以在多种设备上运行Java写的应用,无需特定工具和编译器。
两种编程语言的性能和速度有所不同。许多程序员都说Java比Python快。Python不能用于处理CPU密集的任务,但开发人员通常会有很多办法来提高Python的执行速度。他们得用CPython、PyPy或Cython来弥补Cython的固有运行时间,大大提高执行速度。而Java无需借助其他工具就能轻易优化性能。
除了作为流行的Web技术,Java还被广泛用于开发全球最受欢迎的手机操作系统,也就是安卓。安卓的SDK包含了许多标准Java库。开发人员利用网络系统、数据结构、图表算法和数学程序库,很容易就能创建一个安卓应用。他们还可以利用各种工具和框架加快安卓应用的研发。但用过Python做开发的人都知道,不能只用Python一种语言来开发手机应用。开发人员必须使用一些框架和工具来开发手机应用。许多程序员更喜欢用Java来开发手机应用,因为省时省力。
Python越来越受欢迎及其用户数量每年都大幅增长的原因在于Python逐渐成为所有流行IT技术的首选语言。几乎所有的IT领域,包括Web研发、云计算(AWS、OpenStack、VMware、Google云、Oracle云等)、基础设施自动化、软件测试、移动端测试、大数据和Hadoop、数据科学等,都将Python作为首选的编程语言。
via:ITeye资讯
转载请注明来自36大数据(): &
除非特别注明,本站所有文章均不代表本站观点。报道中出现的商标属于其合法持有人。请遵守理性,宽容,换位思考的原则。&&&&义博!量化投资:&以Python&为工具&Python编程语言入门教程书籍&...
邀请好友参加吧
版 次:1页 数:字 数:印刷时间:日开 本:128开纸 张:胶版纸印 次:1包 装:平装-胶订是否套装:否国际标准书号ISBN:6所属分类:&&&
下载免费当当读书APP
品味海量优质电子书,尊享优雅的阅读体验,只差手机下载一个当当读书APP
本商品暂无详情。
当当价:为商品的销售价,具体的成交价可能因会员使用优惠券、积分等发生变化,最终以订单结算页价格为准。
划线价:划线价格可能是图书封底定价、商品吊牌价、品牌专柜价或由品牌供应商提供的正品零售价(如厂商指导价、建议零售价等)或该商品曾经展示过的销售价等,由于地区、时间的差异化和市场行情波动,商品吊牌价、品牌专柜价等可能会与您购物时展示的不一致,该价格仅供您参考。
折扣:折扣指在划线价(图书定价、商品吊牌价、品牌专柜价、厂商指导价等)某一价格基础上计算出的优惠比例或优惠金额。如有疑问,您可在购买前联系客服咨询。
异常问题:如您发现活动商品销售价或促销信息有异常,请立即联系我们补正,以便您能顺利购物。
当当购物客户端手机端1元秒
当当读书客户端万本电子书免费读为什么将Python用于金融 - 异步社区
为什么将Python用于金融
第1章 为什么将Python用于金融
银行本质上是技术公司。
——Hugo Banziger
1.1 Python 是什么
Python 是一种高级的多用途编程语言,广泛用于各种非技术和技术领域。在 Python 网站上,你可以找到如下行动纲领():
Python是一种具备动态语义、面向对象的解释型高级编程语言。它的高级内建数据结构和动态类型及动态绑定相结合,使其在快速应用开发上极具吸引力,也适合于作为脚本或者“粘合剂”语言,将现有组件连接起来。Python 简单、易学的语法强调可读性,因此可以降低程序维护成本。Python 支持模块和软件包,鼓励模块化和代码重用。Python 解释程序和大量标准库可以源代码或者二进制形式免费取得,用于所有主要平台,并且可以随意分发。
上述纲领很好地描述了 Python 成为当今主要编程语言之一的原因。当前,在学校、Web 公司、大型企业和金融机构以及任何科学领域,都有初学者和熟练的专业开发人员在使用 Python。
Python有如下特征。
Python和大部分可用的支持库及工具都是开源的,通常使用相当灵活和开放的许可证。
Cpython参考实现是该语言的一个解释程序,在运行时将Python代码翻译为可执行字节代码。
Python支持不同的编程和实现范型,例如面向对象和命令式、函数式或者过程式编程。
Python可以用于快速、交互式代码开发,也可以用于构建大型应用程序;它可以用于低级系统操作,也可以承担高级分析任务。
Python可用于大部分重要的操作系统,如Windows、Linux和Mac OS;它用于构建桌面应用和Web应用;可以在最大的群集和最强大的服务器上使用,也可以在树莓派()这样的小设备上运行。
Python中的类型通常在运行时推知,而不像大部分编译语言那样静态声明。
和大部分其他编程语言不同,Python使用缩进标记代码块,代替圆括号、方括号或者分号。
Python具有自动垃圾收集机制,避免程序员管理内存。
关于Python语法及其意义,Python增强提案20——即所谓的“Python之禅”——提供了重要的指导方针。每个交互shell都可以用命令import this访问它:
1.1.1 Python简史
Python对于某些人来说可能还是个新事物,但是它已经出现了很长时间。实际上,早在20世纪80年代,荷兰人Guido van Rossum就开始了开发工作。他现在仍然活跃于Python开发中,被Python社区授予“仁慈独裁者”的称号()。下面是Python开发的里程碑:
1991年发行的Python 0.9.0(第一个发行版本);
1994年发行的Python 1.0;
2000年发行的Python 2.0;
2008年发行的Python 2.6;
2010年发行的Python 2.7;
2008年发行的Python 3.0;
2010年发行的Python 3.3;
2014年发行的Python 3.4。
值得注意的是,有两个可用的主要版本仍然在开发之中,更重要的是,它们从2008年起并行使用,这有时候令Python初学者感到困惑。到本书编著之时,这种情况已经持续了一段时间,因为两个版本之间没有100%的代码兼容性,而且不是所有流行程序库都可以用于Python 3.x。大部分可用和生产代码仍然是用Python 2.6/2.7编写的,本书基于2.7.x版本,但是大部分代码示例应该可以在3.x版本上运行。
1.1.2 Python生态系统
Python作为一个生态系统,而不仅仅是一种编程语言,其主要特征是有大量可用的库和工具。这些库和工具通常必须在需要(例如,绘图库)时导入或者作为单独的系统进程(例如,Python开发环境)启动。导入意味着使某个库可用于当前命名空间和当前Python解释程序进程。
Python本身自带了一组大型的程序库,在不同方面增强了基本解释程序。例如,基本数学计算可以在不做任何导入的情况下完成,而更复杂的数学函数必须通过数学库导入:
虽然所谓的“星号导入”(也就是通过from library import *指令导入库中的所有内容)有时候很方便,但是通常应该使用替代方法,避免命名空间和函数与库的关系方面的歧义。这采用如下方式实现:
任何安装中math都是可用的标准Python库,但是还有许多库是可选安装的,可以和标准库相同的方式使用。这些库来自不同的(Web)来源。然而,通常建议使用某种Python分发版本,确保所有库的相互一致(这个主题的更多内容参见第2章)。
目前为止介绍的代码示例都使用IPython(),这可能是最流行的Python交互式开发环境(IDE),虽然它出现的时候只是一个增强的shell,但是现在已经有了许多典型的IDE特性(例如,支持性能分析和调试)。它缺乏由Sublime Text()等高级文本/代码编辑器所提供的功能,因此,将IPython与人们选择的某种文本/代码编辑器组合使用、组成Python开发过程基本工具集的情况也不少见。
IPyhon有时候也被称作Python生态系统的“杀手级应用”。它从许多方面增强了标准交互式Shell。例如,它提供了改进的命令行历史功能,并且能够进行简单的对象检查。例如,在函数名称后添加一个?就可以打印函数的帮助文本(添加??将提供更多信息):
IPython有3个不同版本:Shell版本、基于QT图形用户界面(QT console)的版本和基于浏览器的版本(Notebook)。这里只是一个摘要的说明,现在还无需操心这些版本的细节,第2章将更详细介绍IPython。
1.1.3 Python用户谱系
Python不仅对专业软件开发人员有吸引力,临时开发人员和领域专家、科研开发人员也使用它。
专业软件开发人员寻求高效构建大型应用程序所需的一切工具。Python支持几乎所有编程范式;有强大的开发工具;从理论上说,Python可以对付任何工作。这些类型的用户通常构建自己的框架和类,也依靠基础的Python和科学栈进行工作,并且尽最大的努力利用生态系统。
科研开发人员和领域专家通常频繁使用某些库和框架,构建他们长年改进和优化的应用程序,并且根据特定的需求调整生态系统。这组用户通常参与较长的交互式会话,快速建立新代码原型,并探索和可视化其研究及领域数据集。
临时开发人员喜欢在已知Python具有优势的特定问题上使用Python。例如,访问Matplotlib的展示页面,复制那里提供的某一段可视化代码,根据特殊需求调整这些代码,可能是对这些人有益的一个用例。
Python用户还有另一个重要的群体:编程入门者,也就是刚刚开始编程的人。现在,Python在大学、专业院校甚至中小学校中已经成为向学生介绍编程的流行语言。这种现象的主要原因之一是其基本语法即使对于非开发人员也很容易学习和理解。此外,Python支持几乎所有编程风格。
1.1.4 科学栈
某些库的集合被统称为科学栈(Scientific Stack),其中包括如下库。
NumPy提供多维数组对象,以存储同构或者异构数据;它还提供操作这一数组对象的优化函数/方法。
SciPy是一组子库和函数,实现科学或者金融中常常需要的重要标准功能;例如,你可以找到三次样条插值和数值积分的函数。
Matplotlib()
这是最流行的Python绘图和可视化库,提供2D和3D可视化功能。
PyTables()
PyTables是流行的HDF5数据存储库封装器();这个库实现基于层次数据库/文件格式的优化磁盘I/O操作。
pandas()
pandas在NumPy基础上构建,提供更丰富的时间序列和表格数据管理及分析类;它与Matplotlib在绘图上、与PyTables在数据存储和读取上紧密集成。
根据特定的领域或者问题,科学栈可以通过更多的库进行扩展,这些库多半在一个或者多个上述的基本库基础上构建。但是,最小公分母(或称基本组成部分)通常是NumPy ndarray类(参见第4章)。
仅从编程语言来讲,有许多其他语言在语法和简洁性上可与Python比肩。例如,Ruby也是相当流行的语言,可与Python相提并论。在该语言的网站上(),你可以找到如下的描述:
一种动态的开放源码编程语言,重视简洁性和效率。它具备简洁的语法,阅读自然、易于编写。
大部分Python使用者可能也赞成用相同的陈述描述Python本身。但是,对于许多Python用户而言,它与Ruby等同样具有吸引力的语言之间的区别在于科学栈。这使Python不仅是优秀、简洁的语言,还可以代替Matlab或者R等领域专用语言和工具集。此外,它默认提供各种人员(例如熟练的Web开发人员或者系统管理员)所需要的任何功能。
1.2 金融中的科技
现在,我们对Python已经有了大致的认识,回头简短地介绍一下科技在金融中的作用就很有意义了。这将使我们更好地评判Python在金融行业中已经承担的任务,更重要的是,还可以评判未来承担的任务。
在某种意义上,科技对于金融机构(例如与工业企业相比)或者财务部门(与其他企业职能部门相比,如后勤)没有什么特别的作用。然而,近年来,在创新和监管的刺激下,银行和其他金融机构(如对冲基金)越来越多地发展成为技术公司而不仅仅是金融中介机构。科技成为了全球几乎所有金融机构的重要资产,具备导致竞争优势和劣势的潜力。某些背景信息可以解释这种发展的原因。
1.2.1 科技开销
银行和金融机构共同组成了每年在科技上投入最多的行业。因此,下面的陈述不仅说明科技对金融行业的重要性,也说明了金融行业对科技的重要性:
据IDC分析师称,银行在2014年的科技投入比2013年多4.2%。这位分析师说,全球金融服务的总体IT花费在2014年将超过4300亿美元,2020年将会超过5000亿美元。
——Crosman 2013
当今的大型跨国银行通常雇佣数千名开发人员,以维护现有系统、构建新系统。具有大量科技需求的大型投资银行每年的科技预算往往达到数十亿美元。
1.2.2 作为业务引擎的科技
科技发展对金融行业的创新和效率增进也有贡献:
科技创新已经为更高效的衍生品市场做出了显著的贡献。通过交易技术的创新,尽管交易量和商品报价数量猛增,欧洲期货交易所(Eurex)的交易速度仍然远快于10年前…这些显著改进只有在衍生品交易所和票据交换所不断地在IT上投入巨额资金的情况下才可能实现。
——德意志交易所集团2008
效率提高的副作用之一就是,金融机构往往必须在更为复杂的产品或者交易中寻求竞争优势。这当然会使风险增大,并使风险管理和监控、监管越来越困难。2007年和2008年的金融危机说明了这些发展带来的潜在危险。同样,“算法和计算机失控”也给金融市场带来潜在的风险;2010年5月的所谓“闪电崩盘”事件戏剧性地展现了上述风险,自动化卖出导致某些股票和股票指数在当日大幅度下跌()。
1.2.3 作为进入门槛的科技和人才
一方面,在其他条件不变的情况下,随着时间的推移,科技的进步会降低成本。另一方面,金融机构持续在科技上投入巨资,以增大市场份额、保持自身地位。在今天的金融市场上取得一席之地往往需要在科技和熟练人员上大规模投资。考虑衍生品分析领域的一个例子(也可参见本书第3部分的案例研究):
在整个软件生命期中,采用内部OTC[衍生品]定价策略的公司仅在一个完整的衍生品库的构建、维护和改进上就需要投入万美元。
——Ding 2010
构建一个完善的衍生品分析库不仅成本高昂和费时,而且需要有足够的专业人士来进行这项工作。这些专业人士必须有正确的工具和技术,才能完成他们的任务。
我们以下引用的另一段有关美国长期资本管理公司(LTCM)的陈述进一步支持关于科技和人才的观点,LTCM曾是最受尊敬的计量对冲基金,但是在20世纪90年代末破产:
Meriwether在最新型计算机系统上花费了2000万美元,并雇用一个由一流金融工程师组成的团队在LTCM操纵该系统,他们在康涅狄格州的格林威治开始工作。这是行业级别的风险管理。
——Patterson 2010
Meriwether花费数百万美元才能得到的计算能力在今天可能只需要几千美元就能实现。另一方面,大型金融机构的交易、定价和风险管理已经变得非常复杂,以致于现在必须部署具有数万个计算核心的IT基础架构。
1.2.4 不断提高的速度、频率、数据量
金融行业有一个方面最受科技进步的影响:金融交易决策和执行的速度及频率。Lewis最近的著作(2014)生动而详细地描述了所谓的“闪电交易”——也就是以可能的最高速度进行的交易。
一方面,可用数据的尺度越来越小使实时反应成为必需的能力。另一方面,交易的速度和频率的提高使数据量进一步增大。这两方面相互补充,推动了金融交易平均时间标度的系统性下降:
复兴资本公司的“大奖章”基金在2008年获得了80%的惊人增长率,它以闪电般速度的计算机抓住了市场极端活跃的机会。Jim Simons是当年世界盈利最高的对冲基金管理人,收入达到25亿美元。
——Patterson 2010
单只股票30年的每日股价数据大致包含7500个报价。这类数据是大部分现代金融理论的基础。例如,现代投资组合理论(MPT)、资本定价模型(CAPM)和风险价值(VaR)等理论都以每日股价数据为基础。
相比之下,苹果公司(AAPL)典型交易日报价次数大约为15000——两倍于30年间日终报价的数量。这带来了许多挑战。
考虑和处理股票日终报价或者其他金融计量是不够的;在每周的7天、每天的24个小时内,某些计量措施上发生的事情“太多了”。
决策往往必须在几毫秒甚至更短的时间内作出,有必要构建个别分析能力,实时分析大量数据。
虽然传统金融理论和概念远称不上完美,但是它们经受了时间的考验(有些时候受到排斥);对于毫秒级计量能力很重要的今天,仍然缺乏在很长时间内证明是稳定的一致性概念和理论。
原则上,上述挑战都只能由现代科技应对。令人有些惊讶的是,缺乏一致性理论的问题也常常通过技术方法处理,在这种情况下,高速算法利用的是市场微观结构要素(例如,订单流、买卖价差),而不依赖于某种金融推理方法。
1.2.5 实时分析的兴起
金融行业中有一个学科的重要性正在强劲增长:金融和数据分析。这种现象与行业中速度、频率和数据率飞速增长有紧密的关系。实际上,实时分析可以视为该行业对这种趋势的反应。
粗略地讲,“金融和数据分析”指的是应用软件和科技,与(可能是先进的)算法和数据收集、处理及分析方法相结合,以获得深刻理解、作出决策或者满足监管需求的学科。这类分析的例子包括银行零售部门中某个金融产品定价结构的变化对销售情况影响的估算。另一个例子是投资银行衍生品复杂投资组合信用价值调整(CVA)的大规模隔夜计算。
金融机构在这种环境下面对两种主要挑战。
甚至在“大数据”这一术语出现之前,银行和其他金融机构就必须处理海量数据;然而,单一分析任务所处理的数据量随着时间的推移而有了很大的增长,要求计算能力的提高和更大的内存与存储能力。
过去,决策者只能依赖结构化的定期计划、决策和(风险)管理过程,而今天面对的是实时完成这些任务的需求;过去在后台通过隔夜批量运行可以完成的任务,现在已经转向前台实时执行。
同样,人们可以观察到科技和金融/商业方法发展之间的相互作用。一方面,有通过现代科技的应用不断改进分析方法速度和能力的需求。另一方面,科技方面的进步使几年甚至几个月之前认为不可能(或者由于预算约束而不可行)的新分析方法成为可能。
分析领域的一个重要趋势是利用CPU(中央处理单元)的并行结构和GPGPU(通用图形处理单元)的大规模并行结构。现在的GPGPU往往有超过1000个计算核心,有时候有必要彻底反思并行性对不同算法的意义。用户通常必须学习新的范型和技术才能利用这种硬件的能力,仍是这方面的障碍之一。
1.3 用于金融的Python
前一小节介绍了科技在金融中发挥作用的一些领域:
金融行业中的科技成本;
作为新业务和创新业务引擎的科技;
作为金融行业进入门槛的科技;
不断提升的速度、频率和数据量;
实时分析的兴起。
本节,我们分析Python如何帮助你应对这些方面的多种挑战。不过首先让我从更为基础的方面——语言和语法——介绍用于金融的Python。
1.3.1 金融和Python语法
在金融环境中迈出使用Python第一步的大部分人都可能要攻克某个算法问题。这和想要解出微分方程、求取积分或者可视化某些数据的科学工作者类似。一般来说,在这一阶段,对正规开发过程、测试、文档或者部署没有太多的思考。然而,这一阶段似乎是人们特别容易爱上Python的时候,主要原因是Python的语法总体上和用于描述科学问题或者金融算法的数学语法相当接近。
我们可以通过一个简单的金融算法来说明这一现象——通过蒙特卡洛模拟方法估计欧式看涨期权的价值。我们将考虑Black-Scholes-Merton(BSM)模型(参见第3章),在这种模型中期权潜在风险遵循几何布朗运动。
假定我们使用如下数值化参数进行估值:
初始股票指数水平S0=100;
欧式看涨期权的行权价格K=105;
到期时间T=1年;
固定无风险短期利率r=5%;
固定波动率σ=20%。
在BSM模型中,到期指数水平是一个随机变量,由公式1-1给出,其中z是一个标准正态分布随机变量。
公式1-1 Black-Scholes-Merton(1973)到期指数水平
下面是蒙特卡洛估值过程的算法描述。
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 欧式期权的蒙特卡洛估算函数
现在,我们将这个问题和算法翻译为Python代码。读者可以使用IPython跟踪单独的步骤——但是在这一阶段实际上并不是必需的。
首先,我们从参数值开始。这真的很简单。
接下来是估值算法。这里,我们第一次使用NumPy,它使我们的第二项任务变得相当轻松。
第三步是打印结果。
输出可能是如下所示:
有下面3个方面值得注意。
Python语法与数学语法相当接近,例如,在参数赋值的方面。
每条数学或者算法语句一般都可以翻译为单行Python代码。
NumPy的强项之一是紧凑的向量化语法,例如,允许在单一代码行中进行10万次计算。
这段代码可以用于IPython等交互式环境。但是,需要频繁重用的代码一般组织为所谓的模块(或者脚本),也就是带有.py后缀的Python(文本)文件。本例的这种模块如例1-1所示,可以保存为名为bsm_msc_euro.py的文件。
例1-1 欧式看涨期权的蒙特卡洛估值
这一小节中的简单算法示例说明Python的基本语法很适合为经典的科学语言二重奏——英语和数学——提供补充。在科学语言组合中添加Python似乎使其更加全面。我们现在拥有:
用于写作和谈论科学和金融等问题的英语;
用于简洁、精确地描述抽象特征、算法、复数等并为其建模的数学;
从技术上建立抽象特征、算法、复数等的模型并加以实现的Python。
数学和Python语法
几乎没有任何编程语言像Python这样接近数学语法。因此,数值算法很容易从数学表示翻译为Python实现。使用Python,可以在这些领域中高效地进行原型化、开发和代码维护。
在某些领域中,使用伪代码是常见的做法,从而引入了第4个语言家族成员。举个例子,伪代码的任务是以更技术性的方式表示金融算法,不但仍然接近于数学表示,而且和技术实现已经相当接近。除了算法本身,伪代码还考虑了计算机的工作原理。
采用这种方法一般是因为使用大部分编程语言时,技术实现和正式的数学表现形式距离相当“遥远”。大部分编程语言都必须包含许多只在技术上必要的元素,在数学和代码之间很难看到等价的元素。
时下,Python常常以伪代码方式使用,因为它的语法和数学很类似,而且技术“开销”可以控制到最低。这一点是通过该语言所体现的一些高层概念实现的,这些概念不仅有其优势,也带来了风险和其他代价。不过可以肯定,可以在需求出现的时候使用Python,从一开始就遵循其他语言可能需要的严格实现和编码方法。从这个意义上说,Python可以在两个世界中提供最佳的平衡:高层次的抽象和严格的实现。
1.3.2 Python的效率和生产率
从较高的层次看,使用Python的好处可以从3个维度衡量。
Python如何更快地获得结果、节约成本、节约时间?
Python如何在相同的资源(人员、资产等)下完成更多的工作?
Python能够让我们做哪些替代技术所不能做到的事情?
对这些特性的讨论当然不可能很全面。然而,可以将某些参数作为出发点。
在更短的时间里得到成果
Python效率较为明显的领域之一是交互式的数据分析。这些领域从IPython等有力工具和pandas之类的程序库获益良多。
考虑一位正在撰写硕士论文的金融专业学生,她对Google的股价感兴趣,想要分析5年的历史股价信息,以了解股价变动在这段时间内的波动性。她希望找到证据证明这种变动性与某些典型的模型假设相反,是随时间变动而决非固定。而且,结果应该进行可视化,主要的工作如下:
从网络上下载Google的股价数据;
计算收益率的滚动标准差(波动率);
绘制股价数据和结果图表。
这些任务很复杂,在不久之前还被认为是专业金融分析师才能完成的。而在今天,即使是金融专业的学生也可以轻松地对付这类问题。我们来看看具体的做法——此时还不用操心语法的细节(后续的章节中将对所有细节进行解释)。
首先,确保所有必要的库可用。
其次,读取数据(例如从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线程(而非仅使用一个线程)即可实现。
1.3.3 从原型化到生产
从执行速度的角度看,交互式分析的效率和性能当然是Python值得考虑的两个好处。在金融学中使用Python的另一个好处初看似乎比较细微;但是细看之下就会发现它本身是一个重要的战略因素。这就是以端到端(从原型化到生产)的方式使用Python的可能性。
当今全球金融机构的金融开发过程往往是一个分离的两步式过程。一方面,量化分析师(“quants”也称“宽客”)负责模型开发和技术原型化。他们喜欢使用MatLab和R等工具和环境实现快速、交互式的应用程序开发。在开发的这一阶段,性能、稳定性、异常管理、数据访问分离和分析等问题都不重要。人们的主要目标是一种概念验证或者原型,展现某种算法或者整个应用程序主要的必需功能。
一旦原型完成,IT部门中的开发人员接管工作,他们负责将现有原型代码翻译为可靠、易于维护和高性能的生产代码。这一阶段通常在用于满足生产性能的C++或者Java语言中有一个范型转换的过程。而且,正规的开发过程还要应用专业工具、版本控制等技术。
这种两步式方法通常会产生一些意外的结果。
原型代码不能重用;算法必须实现两次;多余的工作消耗时间和资源。
多种技能集
不同部门展现不同的技能集合,使用不同的语言实现“相同的工作”。
代码必须以不同的语言存在和维护,往往使用不同的实现风格(例如,从架构的观点上看)。
另一方面,使用Python可以实现从最初的交互式原型化步骤到高可靠性、易于维护的生产代码的合理化端到端过程。不同部门之间的沟通变得更加简单,工作人员的培训也更为合理,只有一种主要语言覆盖金融应用构建的所有领域,还避免了在开发过程不同步骤中使用不同技术的低效和冗余性。总而言之,Python可以为金融应用开发和算法实现提供一致性的技术框架。
Python作为一种语言——但是更多的是作为生态系统——是金融业理想的技术框架。它的特性中有许多好处,比如简洁的语法、高效的开发方法和原型化及生产的易用性等。利用Python大量的可用库和工具,似乎能够应付当今金融业中分析、数据量和频率、依从性及监管所引发的大部分问题。即使在较大型的金融机构中,它也具备提供单一、强大、一致性的框架,简化端到端开发和生产工作的潜力。
1.5 延伸阅读
下面两本书介绍Python在金融中的应用:
Fletcher, Shayne and Christopher Gardner (2009): Financial Modelling in Python.John Wiley & Sons, Chichester, England.
Hilpisch, Yves (2015): Derivatives Analytics with Python. Wiley Finance, Chichester, England.
本章中引用了如下资源:
Crosman, Penny (2013): “Top 8 Ways Banks Will Spend Their 2014 IT Budgets.”Bank Technology News.
Deutsche B?rse Group (2008): “The Global Derivatives Market—An Introduction.”White paper.
Ding, Cubillas (2010):“Optimizing the OTC Pricing and Valuation Infrastructure.”Celent study.
Lewis, Michael (2014): Flash Boys. W. W. Norton & Company, New York.
Patterson, Scott (2010): The Quants. Crown Business, New York.
金融分析和开发
数据类型和结构
金融时间序列
输入/输出操作
高性能的Python
推断统计学
面向对象和图形用户界面
衍生品分析库
金融模型的模拟
衍生品估值
投资组合估值
波动率期权
精选的最佳实践
看涨期权类
日期和时间

我要回帖

更多关于 编程语言排行榜2016 的文章

 

随机推荐