Python金融实战

978-7-115-45707-3
作者: 【美】Yuxing Yan(严玉星)
译者: 张少军严玉星
编辑: 胡俊英

图书目录:

详情

本书是一本关于使用Python进行金融数据分析的权威指南。书中通过易学易懂的示例介绍了关于金融学的相关理论和建模方法,同时也介绍了如何通过Python进行数据分析。通过阅读本书,读者将掌握金融相关的必备知识以及数据处理的技术要点。

图书摘要

版权信息

书名:Python金融实战

ISBN:978-7-115-45707-3

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

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

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

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

• 著    [美] Yuxing Yan

  译    张少军 严玉星

  责任编辑 胡俊英

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

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

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

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

  反盗版热线:(010)81055315


Copyright ©2014 Packt Publishing. First published in the English language under the title Python for Finance.

All rights reserved.

本书由英国Packt Publishing公司授权人民邮电出版社出版。未经出版者书面许可,对本书的任何部分不得以任何方式或任何手段复制和传播。

版权所有,侵权必究。


Python凭借其简单、易读、可扩展性以及拥有巨大而活跃的科学计算社区,在需要数据分析和处理大量数据的金融领域得到了广泛而迅速的应用,并且成为越来越多专业人士首选的编程语言之一。

本书通过12章内容介绍了Python在金融领域的应用,从Python的安装、基础语法,再到一系列简单的编程示例,本书循序渐进地引导读者学习Python。同时,本书还结合Python的各个模块以及金融领域中的期权价格、金融图形绘制、时间序列、期权定价模型、期权定价等内容,深度揭示了Python在金融行业中的应用技巧。

本书适合金融、会计等相关专业的高校师生阅读,也适合金融领域的研究人员和从业人员参考学习。对于有一定计算机编程基础,但想要从事金融行业的读者,本书也是不错的参考用书。


谨以本书献给我的父辈:

 

严仲仪(父) 王秀珍(母)

金清(岳父) 阴家菊(岳母)


首先感谢人民邮电出版社选择了我的书(Python for Finance)并出版中译本。我衷心地感谢胡俊英编辑(人民邮电出版社,信息技术分社)为本书的出版做出的努力,感谢张少军教授(在香港教学的金融学教授)为翻译本书做出的巨大投入。

如果用一句话来总结本书:“这是一本金融学教授写的基于Python编程的图书”。本书将金融理论、金融计算、计算机编程和金融数据有机地结合在一起。由于Python是开源软件,所以本书使用了美国大量公开的经济、金融以及会计数据(开源数据)。

本书的读者是金融系、会计系的硕士研究生或高年级的本科生,以及金融领域的研究人员和想进入金融领域的IT人士。本书亦可用作一学期的课程教科书。在美国,已有两所学校将本书列为教科书。

对书中涉及的Python程序而言,中译本和英文原版有众多的不同。主要原因是使用的Python版本不一样。此外Python语言本身,尤其是其包含的模块也在发展和演变中。一些函数不存了,而另一些函数也有一些变化。对此,我已经在中文版中做了相应的修改。

本书主要的不足之处是没有引用有关中国的经济、金融及会计数据。如果可能的话,我会在本书第3版的写作中加入有关中国的数据。如有研究者、经济学教授、金融学教授或会计学教授能够提供有关中国的经济、金融和会计数据,并希望能用Python以及其他计算机语言(R、SAS、Matlab或C)来加以处理,请与我联系。

——作者 严玉星(Yuxing Yan)

2017年3月于美国水牛城   


严玉星毕业于麦吉尔大学,获金融学博士学位。他有丰富的教学经验,教授过各类本科学位和研究生学位的金融课程,如金融建模、期权和期货、投资组合理论、定量财务分析、企业融资和金融数据库。他曾在8所全球知名的大学任教:两所在加拿大,一所在新加坡,5所在美国。

严博士一直活跃于学术研究的前沿。他的研究成果在多个国际学术期刊发表,包括Journal of Accounting and FinanceJournal of Banking and FinanceJournal of Empirical FinanceReal Estate ReviewPacific Basin Finance JournalApplied Financial EconomicsAnnals of Operation Research。他的最新一篇学术文章是与张少军合著的,发表在Journal of Banking and Finance上。他的研究领域包括投资学、市场微观结构和开放金融。

他精通几种计算机语言,如SAS、R、MATLAB、C和Python。从2003年到2010年,他在沃顿商学院研究数据服务中心(Wharton Research Data Services,WRDS)担任技术总监,为WRDS用户测试了与研究相关的几百个计算机程序。之后,他于2010年开始先后将R引入3所大学的若干门金融定量分析课程。他将讲座笔记编写成一本名为《基于R的金融建模》(Financial Modeling using R)的书。

此外,他还是财务数据方面的专家。在新加坡南洋理工大学任教时,他为博士生讲授一门名为“金融数据库入门”的课程。在WRDS工作期间,他回答了许多有关金融数据库的问题并帮助更新CRSP、Compustat、IBES和TAQ(NYSE高频数据)等数据库。2007年,严博士和朱世武合著由清华大学出版社出版的《金融数据库》一书。目前,他花费相当多的时间和精力在公开财务数据上。如果有任何疑问,读者可以随时通过电子邮件yany@canisius.edu与他联系。


张少军博士,1996年7月毕业于北京清华大学,获应用数学和计算机技术双学士学位。自1996年8月至2001年5月在美国佛罗里达州立大学继续深造,先后获得统计学硕士学位和金融统计学博士学位。现任香港理工大学会计与金融学院副教授。

张博士自2001年6月受聘于新加坡南洋理工大学南洋商学院银行与金融系并担任助理教授。为银行与金融本科专业、精算本科专业、金融工程硕士专业、金融硕士专业以及工商管理硕士(MBA)等学位项目讲授与金融模型、资产定价方法、金融时间序列分析和证券投资学相关的课程,并为来自多家银行的进修班讲授与金融模型、金融衍生产品、风险管理以及基金投资等相关的课程。独立或参与培养了多名博士和硕士研究生,并指导了30多名本科生的毕业论文。任职期间,他获得了新加坡政府及南洋理工大学的多项研究经费,荣获2006年度银行和金融系最佳研究教授奖,并于2008年9月成为美国精算协会(Associate of the Society of Actuaries,ASA)准精算师。自2009年1月起至今,在香港理工大学会计与金融学院任教,为本科学生讲授证券投资学课程,为研究生讲授与证券投资学和风险管理相关的课程。

张博士的学术研究涉及多个金融领域,包括中国股市交易、中国股权分置改革、股权资产定价的实证分析、外汇期权的定价、投资银行在债券发行市场的竞争、公司与投资银行的合作关系等。先后获邀在40多个国际学术会议上报告研究成果,在国际知名的学术期刊上发表论文10多篇,多次获得国际会议与国际期刊授予的研究论文奖,2015年荣获中国教育部人文社科学研究优秀论文三等奖。自2010年7月至今,担任亚洲金融协会理事及司库。如果读者有任何疑问,可以随时通过电子邮件shaojun.zhang@polyu.edu.hk与他联系。


我要感谢Ben Amoako-Adu和Brian Smith(他们教授我最早学习的两门金融课程,并在我毕业后的许多年里给予我坚定的支持),George Athanassakos(他布置的作业逼着我学习C语言)、Jin-Chun Duan、Wen-Hung Mao、Jerome Detemple、Bill Sealey、Chris Jacobs、Mo Chaudhury(我在McGill大学的金融学教授)和Laurence Kryzanowski(他精彩的教学启发我专注于实证金融。虽然不是我的博士论文指导老师,但他逐字逐句地批阅了我的博士论文)。

在沃顿商学院的经历毫无疑问地塑造了我的思维方式并且增强了我的技能。感谢Chris Schull和Michael Boldin给我这份工作,感谢Mark Keintz、Dong Xu、Steven Crispi和Dave Robinson,他们在最初的两年给我巨大的帮助,还要感谢Eric Zhu、Paul Ratnaraj、Premal Vora、Shuguang Zhang、Michelle Duan、Nicholle Mcniece、Russ Ney、Robin Nussbaum-Gold和Mireia Gine给我的帮助。

此外,我要感谢Shaobo Ji、Tong Yu、Shaoming Huang、Xing Zhang、Changwen Miao、Karyl Leggio、Lisa Fairchild、K.G. Viswanathan、Na Wang、Mark Lennon和Qiyu(Jason)Zhang在许多方面对我的帮助。我也要感谢张少军和孙谦,我在新加坡南洋理工大学的同事和论文合作者,谢谢他们的宝贵意见和讨论。

出版一本好书需要许多出众的出版专业人士和外部审稿人共同做出贡献。我要感谢Packt出版社的工作人员做出的优秀努力和付出,特别是Llewellyn F. Rozario、Swati Kumari、Arwa Manasawala、Ruchita Bhansali、Apeksha Chitnis和Pramila Balan。也感谢外部审稿人Martin Olveyra、Mourad MOURAFIQ和Loucas Parayiannis的宝贵意见、批评和建议。还要感谢人民邮电出版社把这本书的中文版呈现给读者,感谢出版社胡俊英女士的大力支持和细致工作,才使得中文版得以顺利及时地与大家见面。

最后,最重要的是,我感谢我的妻子金晓宁、女儿严晶和儿子严加加的大力支持。感谢他们多年来给予我的理解和关爱。


Jiri Pik是一名与投资银行、对冲基金和其他金融机构合作的财务和商业信息顾问。他为多个行业的客户构思并搭建了有突破性的交易、投资组合和风险管理系统,以及决策支持系统。

他的咨询公司WIXESYS,为客户提供经过认证的专业知识、快速的判断和执行能力。WIXESYS通过网站http://spearian.com 提供功能强大的工具,包括具有革命性的Excel和Outlook插件等。

Loucas Papayiannis在塞浦路斯出生和长大,毕业于尼科西亚的英语学校。在塞浦路斯国民警卫队服完义务兵役后,Loucas前往加州大学伯克利分校,在那里获得了电气工程和计算机科学学士学位。在伯克利学习期间,他得到了在帕洛阿尔托的博世研究中心工作的机会,并对开发人机界面产生了强烈的兴趣。

一段意想不到的经历让他在完成学业之后获得了一个在伦敦为彭博公司工作的机会。尽管开发金融软件是他职业发展方向的一个转折点,Loucas还是抓住这次机会并搬到伦敦。他很快成长并喜欢上这一新的领域。他在伦敦全职工作的同时,入读国王学院的金融数学硕士课程,并在2011年获得了学位。

他于2010年开始在高盛工作,然后于2012年8月加入了巴克莱资本。直到现在,他的工作主要是使用C++开发与外汇期权相关的应用程序。这些年他已经在工作中使用了各种编程语言和技术。他是一个Linux和Python的爱好者,喜欢在空闲时间用它们实验和开发应用程序。

Mourad MOURAFIQ是一名软件工程师和数据科学家。他在成功完成应用数学专业的学习后,在一家投资银行担任结构性产品领域的定量分析师,专门研究ABS、CDO和CDS,并在法国最大的银行担任量化分析师。

在金融领域几年之后,他发现了对机器学习和计算数学的热情,并决定加入一个创业公司,该公司专注于软件挖掘和人工智能领域。

“我要感谢导师们在我初到交易大厅的那段日子里对我的关照和培养”。


我们正处在一个信息爆炸的大数据时代。在计算机和网络科技的推动下,瞬息万变的金融市场不停地产生出大量的电子化数据,其中大部分是对公众免费的。计算机是有效地利用这些数据的必不可少的工具。我们坚信读者应该能掌握至少一门计算机语言。而Python则是可供学习的计算机语言中一个比较好的选择。

为什么选择Python?

选择Python有多种原因。首先,Python是开源的,公众可以免费使用。Python可用于几乎所有的主流操作系统上,如Windows、Linux/Unix、OS/2、Mac和Amiga,等等。学习和使用免费软件有众多的好处。毕业以后,学生可以把他们所学到的Python编程技能用在任何工作岗位,包括在金融领域。与此相反,收费软件如SAS和MATLAB取决于公司或单位是否订购。其次,Python功能强大、灵活、简单易学。它能够解决几乎所有的金融和经济方面的计量问题。第三,Python有处理大数据的能力。Dasgupta(2013)认为R和Python是当前最流行的两个用于数据分析的开源软件。第四,Python有许多有用的模块。模块是为完成一个特殊的任务而开发的。在本书中,我们将学习NumPy、SciPy、Matplotlib、Statsmodels和Pandas等模块。

这是一本由金融学教授撰写的编程图书

毫无疑问,大多数的编程图书是由计算机专业的教授和专家撰写的。由一位金融学教授撰写本书来介绍一门编程语言似乎十分奇怪。其实不然,本书的重点和众多由计算机专家所写的书完全不同。计算机专家们会把重点放在Python语言本身,而正如本书的书名所示,本书的重点是介绍Python在金融领域的应用。作者希望为读者提供一本将Python与金融紧密结合的书。

侧重短小而实用的Python程序

作者曾经在多所世界著名大学任教,包括加拿大的麦吉尔大学和劳里埃大学、新加坡的南洋理工大学、美国的Loyola大学、UMUC、Hofstra大学、水牛城大学和Canisius学院。他还在美国的沃顿商学院从事过8年的技术咨询工作。丰富的教学和咨询经验告诉他,大多数金融专业的学生需要掌握编写短小的程序以完成某些特定的任务。大多数编程类图书只提供了几个完整但复杂的程序,但对于循序渐进的学习过程而言,程序的数目远远不足,这将导致两种后果。首先,读者往往淹没于复杂程序的细节之中,从而产生畏惧心理,最终失去学习计算机语言的任何兴趣。其次,他们不知道如何灵活运用编程语言来解决金融领域的一系列问题,例如,如何用1990年~2013年的数据和资本资产定价模型(CAPM)来估计IBM的市场风险系数。本书提供了大约300个与许多金融领域相关的Python程序。

使用真实数据

编程类的图书往往有一个共同点,就是它们常常使用虚构的数据。本书将大量使用与各种金融课题相关的真实数据。例如,不仅仅只是介绍资本资产定价模型CAPM和市场风险系数(贝塔值或β),读者学习如何利用实际数据来估计IBM、苹果和沃尔玛等公司的贝塔值,而不仅仅只是讲解用来估算投资组合的收益和风险的数学公式。本书会给出Python程序来从互联网上直接下载实时的交易数据,构造不同的股票组合,然后计算其收益和风险,包括在险价值(VaR)。

本书的主要内容

第1章简短地介绍Python并讨论如何安装、启动和退出Python,以及一些相关的问题。

第2章讲解一些基本概念和几个常用的Python内置函数,如赋值、数值精度、加法、减法、除法、幂函数和平方根函数。

第3章介绍如何编写一些简单的Python函数来完成常见的金融计算,例如一个未来现金流量的现值、当前现金的未来价值、年金的现值及未来值、永续年金的现值、债券的价格和内部收益率(IRR)等。

第4章介绍读者在对Python和期权不了解的情况下,如何用几行Python代码计算看涨期权价格。

第5章介绍模块的基础知识,例如查找所有可用或已安装的模块,以及如何安装一个新的模块。

第6章介绍用于科研和金融计算的两个重要模块:NumPy和SciPy模块。

第7章通过matplotlib模块绘制金融相关的图形,展示如何利用matplotlib模块绘制不同颜色和大小的图表和图形来生动地解释有关的金融概念。

第8章结合实际数据探讨与统计相关的许多概念和问题。具体内容包括如何由雅虎财经网站下载历史数据;计算收益率、全部风险、市场风险、个股之间的相关性、不同市场之间的相关性;构造各种投资组合以及构建最优投资组合。

第9章详细讲解与Black-Scholes-Merton期权定价模型相关的内容,包括看涨期权和看跌期权的收益和利润/损失函数、不同的期权交易策略、绘制收益和利润/损失函数的图形、正态分布、与期权相关的希腊值以及期权的平价关系。

第10章介绍不同类型的循环,并且演示如何估算欧式和美式期权的隐含波动率。

第11章讨论如何利用蒙特卡罗模拟方法为欧式、美式、均价、回望式和障碍式期权定价。

第12章介绍波动率的测度以及ARCH和GARCH模型。

读完本书后有什么收获?

我们通过一些具体的例子来说明本书可能带给读者的收获。首先,本书的前两章能够帮助读者使用Python来计算现值、未来值、年金现值、内部收益率,以及许多其他常用的金融公式。也就是说,我们可以使用Python作为一个普通计算器来解决不少与金融相关的问题。其次,第3章能够帮助读者把几十个短小的Python程序结合成一个大的Python模块,从而用Python完成金融专业计算器的功能。这自制的模块与其他Python模块一样使用。第三,读者学习如何编写Python程序来下载和处理各类开源数据,包括雅虎财经网站、谷歌财经网站、美联储的数据库和French教授的在线数据库等。第四,读者将理解与模块相关的基本概念。模块是指由专家、其他用户或自己编写的用于特定用途的程序包。第五,在了解了matplotlib模块的特性后,读者可以制作各种图表。例如,通过绘制图形展示不同股票和期权的交易策略的收益/利润函数。第六,读者将能够下载IBM的每日交易价格、市场指数 (S&P500)、雅虎财经网站的数据和运用CAPM估计市场风险系数(贝塔值)。亦可以用不同的证券(如国债券、企业债券和股票、构建投资组合),并且应用马科维茨的均值-方差模型来优化自己的投资组合。此外,读者会知道如何估计其投资组合的在险价值(VaR)。第七,读者应该能够应用Black-Scholes-Merton期权定价模型和蒙特卡罗模拟为欧式或美式期权定价。最后,读者能够学习量度波动率的几种方法,特别是自回归条件异方差(ARCH)和广义自回归条件异方差(GARCH)模型。

本书的目标读者

本书面向金融相关专业的从业人士,尤其是计算金融、金融建模、金融工程和商业分析等专业方向的读者,会发现本书大有裨益。对金融领域感兴趣的读者也可以通过本书学习Python,并把它用于许多金融项目之中。个人投资者也能从本书受益。

约定

本书用不同的文本样式区分不同种类的内容。下面给出一些例子,帮助认识这些样式并了解它们的意义。

文本里的代码、数据库名、文件夹名、文件名、文件扩展名、路径名、网址、用户输入和Twitter昵称以这样的方式显示:“根据计算机操作系统,选择合适的套餐,例如,Python Windows x86 MSI Installer (Windows binary -- does not include source)”。

我们用到的Python代码会如下显示:

from matplotlib.finance import quotes_historical_yahoo 
import numpy as np
import pandas as pd
import statsmodels.api as sm
ticker='IBM' 
begdate=(2008,10,1) 
enddate=(2013,11,30)
p = quotes_historical_yahoo(ticker, begdate, enddate,asobject=True,
adjusted=True)

任何命令行输入或输出如下所示:

>>>from matplotlib.pyplot import *
>>>plot([1,2,3,10])
>>>xlabel("x- axis")
>>>ylabel("my numbers")
>>>title("my figure")
>>>show()

新术语和重要的话以粗体显示。在菜单或对话框出现的文字,以粗体显示:“单击开始按钮,然后启动所有程序”。

使用本书的两种方式

通常有两种方式来使用本书:自己阅读或参加课程。初学者可以放慢进度,计划每两周学习一章。第8章是个例外,它可能需要至少3周。掌握另一门编程语言的专业人士可以相对快速地掌握前几章,尽快接触到后面章节的内容。他们可以把更多精力放在期权理论、隐含波动率、波动率的度量和GARCH模型。本书的另一特点是,第3章之后的大多数章节之间没有很强的前后关系。读者在学习了前3章和第5章之后可以跳到其他自己感兴趣的章节。

此外,本书非常适合用作教科书。它能让量化投资、计算金融或金融工程等专业的硕士生学习如何在金融领域应用Python。本书的内容适合一个学期的硕士生课程,如果用在高年级本科生的课程,可以适当降低难度。

读者反馈

读者反馈是我们一直期盼的。请让我们知道你对本书的意见,包括喜欢或不喜欢的地方。我们渴望读者从本书得到最大的收获。因此,你的反馈意见至关重要。请把反馈意见以电子邮件发送至feedback@packtpub.com,并在邮件的主题里包括本书的书名。

客户支持

作为Packt出版物的拥有者,你应当感到自豪,同时也会获得我们在多方面提供的服务。

下载示例代码

你可以通过http://www.packtpub.com网站的帐户下载所有已购买的Packt图书里包含的示例代码。如果是在其他地方购买了本书,你可以在http://www.packtpub.com/support网站注册并通过电子邮件直接获得相关的文件。

下载书中的彩色插图

我们还为你准备了一个PDF文件,里面包含本书中用到的截屏/图形的彩色图像。这些彩色图像可以帮助你更好地了解输出结果。读者可以在以下网址下载这些文件:https://www.packtpub.com/sites/default/files/downloads/4375OS_Images.pdf

勘误表

虽然我们已尽力确保内容的准确性,错误难免会发生。如果你发现书里的文本或者代码有错误,请务必来信告知,我们将不胜感激。这样一来,可以让其他读者少受困惑,也帮助我们提高本书再版的质量。如果发现任何错误,请访问http://www.packtpub.com/submit- errata网页,选择你的书,点击勘误表提交表单链接,并输入勘误的详细信息。一旦你的勘误表验证通过,提交的内容会被接受,勘误就会在网站上出现,或添加到该书的现有勘误列表里。你可以从http://www.packtpub.com/support网站选择书名查看任何现有的勘误表。

关于盗版行为

互联网上的侵权盗版行为是所有出版商一直面临的问题。Packt出版社非常重视保护版权和许可证。如果你发现任何对我们出版物的非法拷贝,不论其在互联网上是以任何形式出现的,请立刻向我们提供网址或网站名称,以便我们可以及时补救。

请把涉嫌盗版材料的链接发送到copyright@packtpub.com。非常感谢你帮助保护我们的作者,协助我们继续有能力为你带来有价值的内容。

读者疑问

如果你对本书有任何方面的疑问,你可以通过questions@packtpub.com与我们联系,我们一定尽力来解决。


本章首先介绍为什么采用Python作为计算工具和使用Python有哪些优点,然后讨论如何安装、启动和退出Python,是否区分大小写等问题,以及一些简单的例子。

本章主要内容如下。

人类在多年前已经进入信息化时代。事实上,我们如今是淹没在信息的海洋之中,时时刻刻都有大量的电子邮件需要阅读或太多的网页亟待浏览。互联网提供了大量关于任何事物的信息,从重要的事件到如何学习Python。我们可以借助互联网搜索任何一家上市公司的信息。如果想收集与国际商业机器(IBM)相关的财务信息,可以使用雅虎财经网站、谷歌财经网站、美国证券交易委员会(SEC)网站公布的公司报表和该公司的网页,等等。在这样的背景下,投资者、专业人士和研究人员需要一个强有力的工具来处理如此大量的公开信息。同时,我们的社会趋向于更加开放和透明。在金融领域,开源金融的概念应运而生。Dane和Masters(2009)提出了开源金融的3个组成部分:开源软件、公开的数据和开放的代码。作为开源金融的第一个组成部分,Python是开源软件的最好选择之一。另一同样流行的开源软件是R。下面总结学习和运用Python于金融领域的一些优点。

首先,Python是免费的开源软件。免费带来许多好处。我们可以设想一个简单的实验。假设一个读者没有学习过期权理论,对Python也一无所知。你觉得他/她需要多长时间能够用Python来计算看涨期权的价格(Black-Scholes-Merton模型)。我们的答案是:2小时之内!首先,下载和安装Python,这不会超过10分钟。再花10分钟学习如何启动并退出Python,并试运行几个简单例子,然后在4.1节,找到著名的Black-Scholes- Merton看涨期权模型的代码,总共只有13行代码。读者可以在接下来的40分钟输入代码,调试纠错。2小时之内,他/她应该能够自如地运行Python程序给看涨期权定价了。当然,当公司采用一种新的计算机语言时,应考虑多方面的成本:如软件的年费、维护成本、可调用的软件包和技术支持等。换言之,软件是否开源只是一个因素。

再看另外一个涉及美国证券交易委员会的例子。2010年,美国证券交易委员会提议,所有的金融机构在提交申请发售新的资产支持证券时,需要提供一个能够计算和演示该证券的合同现金流量的软件程序(www.sec.gov/rules/proposed/2010/33-9117.pdf),并建议使用Python作为编写该程序的计算机语言。考虑Python的重要原因之一是其开源性。因为任何投资者都可以免费地学习和使用它。

Roger Ehrenberg(2007)建议对债券或信用风险的分析引进开源金融的概念。是否要求机构投资者一定按照债券评级来决定买卖并不重要,重要的是知晓金融机构是如何裁定可投资债券风险的级别。试想一下,如果很多金融机构把自身的债务评级模型公之于众,并由众人加以改进,这对债券或信用风险的分析有多么大的推进作用啊!为了促进这方面的发展,Python(或R)是用作计算工具的理想选择之一。

其次,Python功能强大、灵活,并且简单易学。它能够帮助解决几乎所有与金融和经济相关的计量问题。Python适用于所有主要的操作系统,包括Windows、Linux/Unix、OS/2、Mac和Amiga,等等。

第三,Python适合大数据的应用。Dasgupta(2013)认为R和Python是两个最受欢迎的用于数据分析的开源编程语言。与R相比较,Python是一个更好的广泛式语言,尤其是考虑它与面向对象编程功能的融合。与SciPy/NumPyMatplotlibStatsmodel相组合,它提供了一个强有力的数据分析工具。本书还会讨论一个称为Pandas的处理财务数据的模块。

第四,类似于MATLAB的工具箱和R的软件包,Python拥有许多非常有用的模块。每个模块都完成一些特定的功能。在本书中,我们将学习十几个模块。其中,将特别关注5个对金融最有用的模块:NumPySciPyMatplotlibStatsmodelsPandas。前两个模块与统计分析、公式计算、矩阵及其操作、数据结构和数据操作有关。Matplotlib是图形模块。第8章将使用这个模块深入讲解如何用图形呈现各种交易策略的收益函数和利润/损失函数。Statsmodels是与计量经济学相关的模块,该模块包括T-检验、F-检验和GA RCH模型等。Pandas是用于金融数据分析的模块。

当然我们应该指出Python的一些缺点。由于它是免费的,最主要的缺点是缺乏客户支持。一些专家认为,Python社区需要进一步成长,应该包括更多的统计学家和数学家。

采取以下两个步骤来安装Python。

1.访问Python的官方网站下载。

2.根据计算机的系统,选择适当的软件,比如Python 3.3.2 Windows x86 MSI Installer

在当前阶段,初学者只需选择Python最新版本即可。他们可以跳过下一节有关版本的讨论而直接学习如何启动Python的章节。

通常用以下3种方法来运行Python。

这3种方式将在第1.4.1、1.4.2和1.4.3节介绍。

有关Python安装最常见的问题之一是:我们应该下载哪个版本?在这个阶段,任何最新的版本都可以。换言之,对于初学者而言版本并不重要,原因有三。

在以后的有关章节中,将解释模块与Python版本的兼容关系。模块是许多Python程序的集合,由一个或一组专家为完成一些特殊的功能而编写的。例如我们将讨论一个叫作Statsmodels模块,这是与统计和计量经济模型、线性回归等有关的模块。我们常常会用到内置模块、标准模块、第三方提供的模块和自行建造的模块。我们将在多个章节讨论模块这个重要的课题。

在本书中,我们会学习大约20多个模块,其中详细讨论NumPySciPyMatplotlibPandasStatsmodels模块。NumPyMatplotlibStatsmodels模块需要Python 2.7以上版本。有些模块也与Python 2.x版本(2.5-2.6以上,依情况而定)兼容。

以下介绍启动Python的3种方式。

用GUI启动Python的步骤如下。

1.单击开始菜单,然后展开“所有程序”菜单项。

2.找到Python 3.3。

3.如图1-1所示,单击IDLE(Python GUI)。

图1-1

4.启动Python后,出现如图1-2所示的窗口。

图1-2

计算未来现金流的现值的公式如下。

(1-1)

在此等式中,PV是现值,FV是未来值,R是折现率,n是周期数。根据前面的公式,可以输入这些数值来计算未来现金流的现值。假设将在一年后获得100美元,如果年折现率是10%,这100美元的现值是多少呢?下面的几行代码用来解答这个问题。

>>>100/(1+0.1)
90.9090909090909
>>>

 提示 

三重大于号(>>>)是Python提示符。

在电脑桌面创建一个Python图标是一个好主意。除了前述的方法外,接下来的两节会介绍其他的方法来运行Python。

初学者可以跳过这一部分并转到退出Python部分,学会如何用GUI启动Python已经够用了。首先,我们知道如何使用Python IDLE或点击桌面上的Python图标来启动Python。其次,可以方便地使用Python IDLE来保存并运行Python程序。

从Python命令行启动Python的步骤如下。

1.单击开始菜单,展开“所有程序”选项。

2.找到Python 3.3。

3.如图1-3所示,单击Python(command line)。

图1-3

4.单击Python(command line)之后,会看到如图1-4所示的窗口。

图1-4

可以打开一个DOS窗口,找到包含Python程序的子目录,然后从那里运行Python。为此,执行以下步骤。

1.单击开始菜单,然后在如图1-5所示的运行窗口中输入cmd。

图1-5

2.输入cd c:\python33移动到相应的目录。

3.输入python命令来运行软件,如图1-6所示。

如果要从其他目录启动Python,必须在搜索路径上包括Python所在的目录。假设Python安装在C:\python33,以上第2步应当用下面的DOS命令。

set path=%path%;C:\python33

图1-6

以下是退出Python的几种常用方法。

在本书后面部分,将解释如何利用代码在程序运行结束之后自动退出Python。

对于前面的例子,如果100美元在两年后获得,输入100/(1+0.1)^2而不是100/(1+0.1)**2,会看到下面的出错信息。它告诉我们,不支持^运算符号。

>>>100/(1+0.1)^2
Traceback (most recent call_last):
File "<psyhell#1>, line 1, in <module> 
100/(1+0.1)^2
TypeError: unsupported operand type(s) for ^: 'float' and 'int'
>>>

初学者需要注意以上错误信息的最后一句。最后一行告诉我们,符号^不被支持。应该使用双乘法符号**而不是^作为幂函数。第2章将介绍一个真正的幂函数pow()

 下载示例代码 

可以从网站http://www.packtpub.com上的账户下载所有已购买的书籍,包括的示例代码。如果你在其他地方购买了这本书,可以访问http://www.packtpub.com/ support并注册,这样含有的代码文件通过电子邮件直接发送给你。

区分大小写意味着小写的x不同于大写的X,变量John不同于变量john。如果为变量x(小写字母x)赋值,然后调用变量X(大写字母X),会得到以下出错信息。

>>>x=2
>>>X
Traceback (most recent call last):
         File "<pyshell#1>", line 1, in <module> 
             X
         NameError: name 'X' is not defined
>>>

在上面的例子中,变量X没有被赋值。因此,当输入X试图显示其值时,会收到一条出错信息。请注意,最后一行提及NameError而不是TypeError。在Python中,我们称变量为name

在以上例子中,给变量x赋值之后,就可以使用它。这正如在其他计算机语言,如FORTRAN和C/C++中定义一个变量。类似地,如果一个变量在Python中没有被赋值,就无法使用它。与C/C++或FORTRAN语言不同的是,我们不需要把变量x定义为整数类型,就可以把10赋值给它。

Python语言的另一个优点是,可以改变一个变量的数据类型。对于FORTRAN语言,x被定义为整数类型后,将无法把字符串赋值予它。由于Python语言只有对变量的赋值,没有对变量的定义,可以给一个变量赋任何值。例如,可以将x赋值为10。再把一个字符串,如“Hello World”,赋值予它。这样做与数据类型转换是不同的。将在后面的章节讨论不同数据类型之间的转换,如整数转换为字符串。

启动Python之后,输入help()打开在线帮助(如以下代码所示)。在线帮助的提示符是help>。只需按一次回车键或输入quit就可以退出在线帮助。退出之后,Python提示符>>>将再次出现。

>>>help()
Welcome to Python 3.3!  This is the interactive help utility.
If this is your first time using Python, you should definitely check out
the tutorial on the Internet at http://docs.python.org/3.3/tutorial/.
Enter the name of any module, keyword, or topic to get help on writing 
Python programs and using Python modules. To quit this help utility and
return to the interpreter, just type "quit".
To get a list of available modules, keywords, or topics, type "modules", 
"keywords", or "topics". Each module also comes with a one-line summary 
of what it does; to list the modules whose summaries contain a given word 
such as "spam", type "modules spam".
help>

输入keywords后,将得到如下信息。

>>>help> keywords
Here is a list of the Python keywords. Enter any keyword to get more help.
False       def        if        raise
None        del        import    return
True        elif       in        try
and         else       is        while
as          except     Lambda    With
assert      finally    Nonlocal  Yield
break       for        Not
class       from       Or
continue    global     Pass

help>

另外,输入topics后,将会看到许多关键词,如图1-7所示。

图1-7

在此阶段,初学者并不需要深入了解这些主题。只需记住,我们通过一个命令就可以找到所有可能用到的主题。

有很多方法都可以找到Python的手册和其他相关材料。常用的资料已经随软件安装在电脑里或者可以在Python网页上找到。以下进一步说明如何获取这些资料。

执行以下步骤来得到已经安装在电脑里的资料。

1.单击开始菜单,然后展开“所有程序”选项。

2.找到Python 3.3。

3.单击Python Manuals,如图1-8所示。

图1-8

4.单击Python Manuals之后,会看到图1-9所示的窗口。

图1-9

另外一个主要的资料来源是Python的主页。

此外,Python初学者可以在下面网站找到Python的很多其他学习资料。

当Python启动时,第1行会显示当前的版本。另一种查看Python版本的方法是,在运行Python后,使用以下Python代码:

>>>import sys
>>>sys.version
'3.3.2 (v3.3.2:d047928ae3f6, May 16 2013, 00:03:43) [MSC v.1600 32 bit
(Intel)]'
>>>

第1行命令导入一个名为sys的模块。该模块包含了许多有用的Python程序。了解模块是学习Python的关键,将在以下几章更深入地讨论模块:第5章模块简介;第6章介绍NumPy和SciPy模块;第7章介绍通过matplotlib模块绘制与金融相关的图形;第8章介绍时间序列的统计分析。

本章重点讨论了如何安装、启动和退出Python,大小写是否一样,以及其他问题,并给出了一些简单的例子。因为操作简单明了,任何初学者都能轻松下载并在几分钟内安装好Python,然后开始运行Python代码。此外,我们还了解为何采用Python作为计算工具和使用Python的优缺点。

下一章将介绍一些基本概念和常用的Python内置函数,并且演示如何使用Python完成普通计算器的功能,并解答许多与财务相关的问题。比如,计算一个未来现金流量的现值、一笔现金的未来价值、永续年金的现值或成长型永续年金的现值,等等。还将讨论dir()type()floor()round()help()等函数。

1.用几句话来介绍Python软件。

2.使用Python作为计算工具有什么优势和劣势?

3.从何处可以下载Python?如何安装?

4.Python是否区分大小写?

5.是否可以不定义就使用一个变量?

6.是否可以不给一个变量赋值就使用它呢?

7.对于初学者,Python的版本重要吗?在学习了这本书之后呢?

8.有哪几种方式可以运行Python?

9.在哪里可以找到有关如何安装Python的视频?

10.Python主页的网址是什么?

11.使用Python计算直径为10的圆的面积。

12.如何赋值给一个新的变量?

13.如何能找到与Python有关的一些示例?

14.如何取得Python的在线帮助?

15.你的电脑上安装的Python位于哪个目录?如何找到其路径?

16.定义一个变量和赋值给一个变量有什么区别?


本章将介绍一些基本概念和几个常用的Python内置函数,如赋值、数值精度、加、减、乘、除、幂函数和平方根函数。将学习如何使用Python作为一个普通的计算器来解决许多与金融相关的问题。本章主要内容如下:

赋值给一个Python变量非常简单。我们不需要定义一个变量就可以给它赋值。这一点与其他语言,如C++或FORTRAN不同。

>>>pv=22
>>>pv+2 
24

可以同时给几个变量赋予同样的值。在下面的例子中,一次给3个变量xyz赋值100

>>>x=y=z=100

为显示一个变量的值,只需输入其名称。例如:

>>>pv=100
>>>pv 
100
>>>R=0.1
>>>R 
0.1

如果使用sqrt()函数来估计,将得到以下出错信息。

>>>sqrt(3)
Traceback (most recent call last):
  File "<pyshell#17>", line 1, in <module> 
    sqrt(3)
NameError: name 'sqrt' is not defined

以上提示的最后一行告诉我们,Python软件没找到sqrt()函数。在学习完本章之后,大家就会知道sqrt()函数是包含在math模块里的。必须先导入该模块,才可以调用其包含的函数。模块是围绕某个特定主题将一些相关的函数捆绑在一起的软件包。

如果从未赋值给变量abcde,输入abcde后,将得到以下出错信息。

>>>abcde
Traceback (most recent call last):
  File "<pyshell#0>", line 1, in <module> 
    abcde
NameError: name 'abcde' is not defined
>>>

最后一行告诉我们,这个变量没有定义。在某种意义上,赋值给一个变量相当于做了两件事:定义一个变量,并在同一时间赋值给它。

永久年金是指未来每隔一段时间有等额的现金支付,直到永远。比如,在未来每年的年底收到5美元,或者像英国政府发行的一种称为consol的债券支付定额的利息。假定第1笔支付发生在第1个周期的结束,可用下面的公式估计永久年金的现值。

PV(永久年金)=

(2-1)

这里,PV是现值,C是每个周期的定额支付,R是每周期折现率。CR应该有一致的周期,也就是说,如果C是年度(月度)的现金流,那么R必须是年度(月度)的折现率。假设定额的年度支付为10美元,在第1年结束时收到第1笔支付,年度折现率为10%。比较以下两种命名变量的方式。

>>>x=10        # bad way for variable names
>>>y=0.1
>>>z=x/y
>>>Z 
100
>>>C=10        # good way for assignments
>>>R=0.1
>>>pv=C/R
>>>pv 
100

使用C作为定额支付变量名比用x好,使用R表示折现率比用y更好,因为CR与公式(2-1)中使用的变量名相同,而xy没有任何特定的含意。

增长型永久年金是指未来的现金流以恒定的速度g增长。以下公式给出其现值。

PV(永久年金)=

(2-2)

在这个公式中,C是第1个周期末发生的现金流,R是每周期的折现率,g是每周期的增长率。显然,增长率g应小于折现率R。考虑购买每年支付为C和每年折现率为R的永久年金。计算它今天的价值时,需要考虑未来的通货膨胀率;如果未来年度通胀率是CPI(消费者物价指数),那么增长速度将等于负的CPI。

为几个变量赋值后,可以使用dir()函数来检查它们是否存在。下面的例子显示npvr等变量。现在不用理会最前面的4个变量,它们的名字开头和结尾各有两个下划线。

>>>pv=100
>>>r=0.1
>>>n=5
>>>dir()
['__builtins__', '__doc__', '__name__', '__package__', 'n', 'pv', 'r']
>>>

编写程序时,有时需要删除那些不再需要的变量。在这种情况下,可以使用del命令删除一个指定的变量。在下面的例子中,给变量rate赋值,显示其值,将其删除,然后输入变量名试图再次显示其值。

>>>rate=0.075
>>>rate
0.075

以上代码显示rate的值为0.075。以下代码先删除该变量,然后试图再次显示其值。

>>>del rate
>>>rate
Traceback (most recent call last):
File "<pyshell#72>", line 1, in <module> 
    Rate
NameError: name 'rate' is not defined [End of codes]

以上出错信息最后一句告诉我们,变量rate没有被定义。如果需要一次删除几个变量,可以用逗号把它们分隔,例如:

>>>pv=100
>>>r=0.85
>>>dir()
['__builtins__', '__doc__', '__name__', '__package__', 'pv', 'r']
>>>del pv, r
>>>dir()
['__builtins__', '__doc__', '__name__', '__package__']

Python中基本的数学运算采用传统的数学运算符:+(加)、−(减)、*(乘)、/(除)运算。下面一行代码包括所有这些运算符。

>>>3.09+2.1*5.2-3/0.56
8.652857142857144

如果意外地输入除号两次(//),会得到一个奇怪的结果。双斜杠//代表整数除法,运算结果是给出一个比商数小的最大整数。7除以3的结果为2.332是比2.33小的最大整数。例如:

>>>7./3 
2.3333333333333335

在Python 2.x版本下,7/3可能是2,而不是2.333。因此,我们必须小心。在金融计算中较少使用整数除法。为了避免整数除法,可以使用7./27/2.,即这两个数中至少有一个是真正的浮点数。

>>>7//3 
2

以下代码显示,n//m等价于取整函数int(n/m)

>>>x=7./3
>>>x 
2.3333333333333335
>>>int(x) 
2

使用幂函数来计算FV=PV(1+R)n。取整函数给出比输入参数值小的最大整数。余数是整数除法后剩下的值。给定一个正的折现率,未来现金流量的现值总是比其相应的未来值要小。下面公式给出当前值和未来值之间的关系。

(2-3)

在这个公式中,PV为现值,FV是未来值,R为每期的折现率,n是周期数。假设在两年后将获得100美元,年贴现率为10%,今天的价值是多少?

>>>100/(1+0.1)**2 
82.64462809917354

这里,**用来计算幂函数。%运算符用于计算余数。下面的例子显示这些运算符的结果。

>>>17/4        # normal division
4.25
>>>17//4       # save as floor(17/4)
4
>>>17%4        # find out the remainder
1

假设第1笔现金流发生在第9年年底,之后每年年底获得10美元,直到永远,如果折现率为每年8%,这个永久年金的现值是多少?可以结合公式(2-1)和(2-3)来回答这个问题。

PV(永久年金,第1笔现金流发生m周期末)=

(2-4)

在这个公式中,C是每个周期定额的现金支付,R是每周期的折现率,第1笔现金的支付发生在第m个周期的期末。当m取值为1时,公式(2-4)等同于公式(2-1)。以下代码运用公式(2-4)来得到现值67.53美元。

>>>10/0.08/(1+0.08)**(9-1)
67.53361056274696

如果今天存入100美元,年利率为10%,该存款一年后值多少?如果FV代表未来值,PV代表现值,R为年度利率,n是年数,可以得到以下的公式。

FV=PV(1+R)n

(2-5)

需要注意的是变量Rn对应相同的周期,也就是说,如果R是月有效利率,n必须是月的数目。如果R是年有效利率,n必须是年的数目。以下代码计算未来值。

>>>pv=100
>>>r=0.1
>>>n=1
>>>pv*(1+r)**n 
110.00000000000001

这里,两个乘法符号**代表幂函数。事实上,Python有计算xy的内置函数pow(),例如:

>>>pow(2,3) 
8
>>>100*pow((1+0.1),1)
110.00000000000001

在上面的例子中,这个幂函数pow(x,y)有两个输入参数,这个情况下,它等效于x**y。实际上,该函数可以有第3个输入参数。在上面的例子中,pow((1+0.1),1)pow(1+0.1,1)一样,包含1+0.1的括号是没有必要的,但能帮助函数表达式更清楚。

要了解有关函数的更多信息,可以使用help()找到此函数的详细信息,请参考下面的输出。

>>>help(pow)
Help on built-in function pow in module builtins: 
pow(...)
    pow(x, y[, z]) -> number
    With two arguments, equivalent to x**y. With three arguments, 
equivalent to (x**y) % z, but may be more efficient (e.g. for longs).

根据上述的内容,可以这样使用该函数。

>>>pow(3,10,4) 
1
>>>3**10%4 
1
>>>3**10 
59049
>>>59049%4
1

Python所谓的LEGB规则与局部变量和全局变量有关。该规则如表2-1所示。

表2-1

L

内部的,是指在函数内(def)赋值的,且没有被定义为全局变量的变量

E

封闭的,是指在任何封闭函数内(def)局部范围使用的变量

G

全局的,是指那些在模块的顶部定义的变量,或在函数中(def)定义成全局变量的变量

B

内置的,是指在内置模块中固定的名词,如open、range和SyntaxError

Python的默认精度为16位小数,例如:

>>>7/3.
2.3333333333333335

对大多数与金融有关的问题或研究这样的精度足够高了,可以使用round()函数来改变精度。

>>>payment1=3/7.
>>>payment1
0.42857142857142855
>>>payment2=round(payment1,5)
>>>payment2
0.42857

假设payment1payment2的单位是百万。如果应用round()函数只保留两位小数,可能会导致巨大的差异。如果以一个美元为单位,确切的支付等于428571美元。然而,如果以百万美元为单位,并且保留小数点后两位的精度,将得到43万,相差1429美元。

>>>payment1*10**6 
428571.4285714285
>>>payment2=round(payment1,2)
>>>payment2 
0.43
>>>payment2*10**6 
430000.0

要了解某一个数学函数的详细信息,可以使用help()函数,比如help(round),如以下代码所示。

>>>help(round)
Help on built-in function round in module builtins: 
round(...)
    round(number[, ndigits]) -> number
Round a number to a given precision in decimal
digits (default 0 digits). This returns an int when
called with one argument, otherwise the same type as
the number. ndigits may be negative.

为了找出所有内置函数,采取以下两个步骤。首先,我们用dir()列出代表所有内置函数的默认名称,即__builtins__。注意该名称有两个下划线为前缀和另外两个下划线为后缀。

>>>dir()
['__builtins__', '__doc__', '__name__', '__package__', 'x']

然后,输入dir(__builtins__),第1行和最后几行的输出结果如下。

>>>dir(__builtins__)
['ArithmeticError', 'AssertionError', 'AttributeError',
'BaseException', 'BlockingIOError', 'BrokenPipeError',
'BufferError', 'BytesWarning', 'ChildProcessError',
…
'range', 'repr', 'reversed', 'round', 'set', 'setattr',
'slice', 'sorted', 'staticmethod', 'str', 'sum',
'super', 'tuple', 'type', 'vars', 'zip']

使用金融市场的实际数据解答许多问题,比如从雅虎财经网站下载数据,构建最佳的投资组合,估计个股或股票组合的波动率,找出最佳组合。针对每一个问题,有关专家开发了相应的模块。必须将其导入Python,然后才能使用它。例如,可以用import math导入常用的数学函数。下面的代码用来计算一个数值的平方根。

>>>import math
>>>math.sqrt(3) 
1.732050807568772

为了找出数学模块中包含的所有函数,再次调用dir()函数如下。

>>>import math
>>>dir(math)
['__doc__', '__name__', '__package__', 'acos', 'acosh', 'asin', 'asinh', 
'atan', 'atan2', 'atanh', 'ceil', 'copysign', 'cos', 'cosh', 'degrees', 'e', 
'erf', 'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 
'frexp', 'fsum', 'gamma', 'hypot', 'isinf', 'isnan', 'ldexp', 'lgamma', 
'log', 'log10', 'log1p', 'modf', 'pi', 'pow', 'radians', 'sin', 'sinh', 
'sqrt', 'tan', 'tanh', 'trunc']

为使编程语句更加简洁,可以给math模块取一个单个字母的名字。

>>>import math as m
>>>m.sqrt(5)
2.23606797749979

π(3.14159265,在Python程序中用“pi”表示)和e(2.71828)是数学的常量,用以下代码显示它们的值。第1个命令导入math模块。现阶段,初学者只需要记住这些命令,暂时不需要了解它们的含义。以后有4章内容详细解释模块的用途。

>>>import math
>>>math.pi 
3.141592653589793
>>>math.e 
2.718281828459045
>>>math.exp(2.2) 
9.025013499434122
>>>math.log(math.e)  # log() is a natural log function 
1.0
>>>math.log10(10)    # log10() 
1.0

只需输入pi或e就可以得到它们的值。因为它们是保留的关键字,请不要用它们作为变量名。

使用from math import *可以使程序更简单。以sqrt()函数为例。如果使用import math,就必须用math.sqrt(2)。如果使用from math import *,就只需要用sqrt(2)

>>>from math import *
>>>dir()

['__builtins__', '__doc__', '__name__', '__package__', 'acos', 'acosh', 
'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'copysign', 'cos', 
'cosh', 'degrees', 'e', 'erf', 'erfc', 'exp', 'expm1', 'fabs', 'factorial', 
'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'hypot', 'isinf', 'isnan', 
'ldexp', 'lgamma', 'log', 'log10', 'log1p', 'modf', 'pi', 'pow', 'radians', 
'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'trunc']

也就是说,可以直接调用这些函数或保留值,如pi和e。使用math.pi反而是错误的。例如:

>>>pi 
3.141592653589793
>>>math.pi
Traceback (most recent call last):
  File "<pyshell#25>", line 1, in <module> 
    math.pi
NameError: name 'math' is not defined

这样处理的一个优点是使编程稍微容易一些,因为这些数学函数都可以直接调用。如果给e或pi赋值,它的值将改变。这里需要小心对待。

>> pi 
3.141592653589793
>>>pi=10
>>>pi 
10

可以从某个模块,如math模块,导入若干指定的函数。在导入前:

>>>dir()
['__builtins__', '__doc__', '__name__', '__package__']
>>>

在导入后:

>>>from math import sqrt,log
>>>dir()
['__builtins__', '__doc__', '__name__', '__package__', 'log', 'sqrt']

这一节将简要讨论几个经常使用的函数:print()type()upper()strip()和下划线_。此外,还将学习如何合并两个字符串以及幂函数pow()

有时,需要在屏幕上显示一些内容。一种方法是应用print()函数,例如:

>>>import math
>>>print('pi=',math.pi) 
pi= 3.141592653589793

在Python中,type()函数告诉我们一个变量的类型,例如:

>>>pv=100.23
>>>type(pv)
<class 'float'>
>>>n=10
>>>type(n)
<class 'int'>
>>>

从这些结果,我们知道变量pv的类型是浮点数,n为整数类型。整数和浮点数是金融计算中最常用的两种类型。本书还会讨论其他数据类型。

在交互模式中,下划线符号“_”代表前面最后一个表达式的结果。

>>>x=1.56
>>>y=5.77
>>>x+y 
7.33000000000000000001
>>>9+_ 
16.32999999999999998
>>>round(_,1) 
16.3

可以通过多种方式使用字符串。有以下两种方式为字符变量赋值。

>>>x='This is '
>>>y=" a great job!"

第1行使用单引号,第2行采用双引号。把它们结合的结果如下。

>>>x+y
'This is a great job!'

upper()函数将整个字符串全部转换为大写字母。

>>>x='This is a sentence'
>>>x.upper()
'THIS IS A SENTENCE'

请注意我们是如何调用函数的。这是我们第一次看到这样调用函数:变量名.函数名。可以使用strip()函数删除字符串开头和结尾的空格,例如:

>>>x=" Hello "
>>>y=x.strip()
>>>y
'Hello'
>>>

可以把赋值操作和strip()函数连起来用。

>>>z=" Hello ".strip()

可以用dir('')命令列出所有的字符串函数。

>>>dir('') # list all string functions

此命令的输出结果如下。

>>>dir('')
['__add__', '__class__', '__contains__', '__delattr__', '__doc__', 
'__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', 
'__getnewargs__', '__getslice__', '__gt__', '__hash__', '__init__', 
'__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', 
'__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', 
'__setattr__', '__sizeof__', '__str__', '__subclasshook__', 
'_formatter_field_name_split', '_formatter_parser', 'capitalize', 
'center', 'count', 'decode', 'encode', 'endswith', 'expandtabs', 'find', 
'format', 'index', 'isalnum', 'isalpha', 'isdigit', 'islower', 'isspace', 
'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'partition', 
'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 
'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 
'translate', 'upper', 'zfill'] 
>>>

可以使用下面的代码了解某个字符串函数的具体信息。

>>>help(''.upper)

有关内置函数upper()的在线帮助内容显示如下。

upper(...)
    S.upper() -> string
    Return a copy of the string S converted to uppercase.

下面是使用另一个内置函数capitalize()的例子。

>>>help(''.capitalize)

有关内置函数capitalize()的在线帮助内容显示如下。

capitalize(...) 
    S.capitalize() -> string
    Return a copy of the string S with only its first character 
    capitalized.
>>>

元组是Python的一种数据类型。一个元组类型的变量可以包含多种数据类型,如整数、浮点数、字符串,甚至是另外一个元组。所有数据项都包含在一对圆括号中。

>>>x=('John',21)
>>>x 
('John', 21)

可以使用len()函数找出一个变量中包含多少数据项。与C++语言类似,元组的下标从0开始。如果一个元组变量包含10个数据项,它们的下标将从0~9。

>>>x=('John',21)
>>>len(x) 
2
>>>x[0]
'John'
>>>type(x[1])
<class 'int'>

下面的命令定义一个没有数据的元组变量和只有一个数据项的元组变量。

>>>z=()
>>>type(z)
<class 'tuple'>
>>>y=(1,)          # generate one item tuple
>>>type(y)
<class 'tuple'>
>>>x=(1)           # is x a tuple?

以下代码显示元组最重要的特征之一:无法修改一个元组的值,即元组是不可改变的。下一章将讨论另一种数据类型:列表。可以修改一个列表的值。

>>>investment=('NPV',100,'R=',0.08,'year',10)
>>>investment[1] 
100
>>>investment[1]=345

Traceback (most recent call last):
  File "<pyshell#3>", line 1, in <module> 
    investment[1]=345
TypeError: 'tuple' object does not support item assignment

可以使用元组类型将John和21分别作为姓名和年龄分配给一个元组类型变量x,然后打印“My name is John and 21 year-old”。注意%d表示打印整数类型的格式。后面的章节会介绍用来打印的其他数据类型。

>>>x=('John',21)
>>>print('My name is %s and %d year-old' % x) 
My name is John and 21 year-old

本章介绍了一些基本概念和常用的Python内置函数,如赋值、数值精度、加、减、乘、除、幂函数以及平方根函数。演示了如何使用Python作为一个普通的计算器来解决与金融相关的计算问题,比如计算一个未来现金流的现值、一个现金流的未来价值、永久年金的现值以及增长型永久年金的现值等。讨论了dir()type()floor()round()help()等函数,展示了如何列出Python的所有内置函数,以及如何获得一个特定函数的在线帮助。基于本章及前一章的学习,将在下一章介绍如何使用Python编写一个金融计算器。

1.展示变量是否存在和显示它们的值之间有什么差异?

2.如何得到某个指定函数,如print()的详细信息?

3.内置函数的定义是什么?

4.元组是什么?

5.如何生成只含有一项的元组?下列生成只含有一项的元组的方式有什么不对?

>>>abc=("John")

6.如何改变一个元组的值?

7.pow()是不是一个内置函数?如何使用它?

8.如何找到所有内置函数?有多少个内置函数?

9.应该使用哪个Python函数来计算

10.假设一个永续年金的现值是124美元和每年的现金流是50美元,相应的年度折现率是多少?

11.基于前一个问题的答案,相应的季度折现率是多少?

12.增长型永续年金的定义是:现金流量按固定的增长率逐年增长直到永远。有以下公式:

PV(增长型永续年金)=

这里,PV为现值,C是第一个周期末的现金流,g是增长率,R为折现率。如果第1个现金流为12.50美元,年增长率为2.5%,而年折现率是8.5%。这一增长型永续年金的现值等于多少?

13.对于n天股票回报率的方差,有以下公式:

这里,为日收益的方差,为日收益的标准方差(波动率)。如果一只股票的日回报率的标准方差等于0.2,它的10天回报率的标准方差是多少?

14.我们期望5年后有25 000美元。如果每年的存款利率是4.5%,今天需要存款多少?

15.如何把This is great!转换成所有都是大写字母?

16.如何限制函数的输出值以美分为单位,比如将2.567四舍五入至2.57?

17.符号/和//有何区别?

18.班里有41名学生。如果3个学生组成一个作业小组,会有多少组?有几位学生不属于任何一个三人小组?如果每组有7个学生,答案又是什么?

19.lower()是不是一个内置函数?如何获得它的在线帮助?

20.用round()函数解释如下结果。

>>> x=5.566
>>> round(x,2)
5.57
>>>

21.当增长速度高于折现率(g>r)时,增长型永续年金的现值是多少?

PV(增长型永续年金)=


相关图书

深度学习的数学——使用Python语言
深度学习的数学——使用Python语言
动手学自然语言处理
动手学自然语言处理
Web应用安全
Web应用安全
Python高性能编程(第2版)
Python高性能编程(第2版)
图像处理与计算机视觉实践——基于OpenCV和Python
图像处理与计算机视觉实践——基于OpenCV和Python
Python数据科学实战
Python数据科学实战

相关文章

相关课程