第1章 为什么将Python用于金融

论坛 期权论坛 期权     
激情的木偶   2017-9-17 05:36   8763   1
第1章 为什么将Python用于金融
分享到 :
0 人收藏

1 个回复

倒序浏览
2#
天天不看java  4级常客 | 2017-10-2 04:58:36 发帖IP地址来自


争议1.1 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在大学、专业院校甚至中小学校中已经成为向学生介绍编程的流行语言[1]。这种现象的主要原因之一是其基本语法即使对于非开发人员也很容易学习和理解。此外,Python支持几乎所有编程风格[2]。
1.1.4 科学栈
某些库的集合被统称为科学栈(Scientific Stack),其中包括如下库。
NumPy
NumPy提供多维数组对象,以存储同构或者异构数据;它还提供操作这一数组对象的优化函数/方法。
SciPy
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[衍生品]定价策略的公司仅在一个完整的衍生品库的构建、维护和改进上就需要投入2500~3600万美元。
——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个计算核心,有时候有必要彻底反思并行性对不同算法的意义。用户通常必须学习新的范型和技术才能利用这种硬件的能力[3],仍是这方面的障碍之一。
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-1)
下面是蒙特卡洛估值过程的算法描述。
1.从标准正态分布中取得 I 个(伪)随机数 z(i ),i∈{1,2,…,I }。
2.为给定的 z (i ) 和公式1-1计算所有到期指数水平ST(i)。
3.计算到期时期权的所有内在价值hT(i)=max(ST(i )鈭扠,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实现。使用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种提高性能的策略。


您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:
帖子:
精华:
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP