书名:基于Python的金融分析与风险管理
ISBN:978-7-115-51611-4
本书由人民邮电出版社发行数字版。版权所有,侵权必究。
您购买的人民邮电出版社电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。
我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。
如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。
著 斯 文
责任编辑 胡俊英
人民邮电出版社出版发行 北京市丰台区成寿寺路11号
邮编 100164 电子邮件 315@ptpress.com.cn
网址 http://www.ptpress.com.cn
读者服务热线:(010)81055410
反盗版热线:(010)81055315
Python是一门开源的编程语言,凭借其易学和灵活的特点,得到了越来越多人的认可和青睐。它在金融领域也有着非常好的应用现状和前景。
本书聚焦于Python在金融分析与风险管理的应用,全书分为入门篇、基础篇和提高篇,共12章。入门篇对Python做了介绍并结合金融场景演示了Python的基本操作;基础篇结合金融场景,讲解NumPy、Pandas、Matplotlib、SciPy等Python模块的具体运用;提高篇详细讨论运用Python分析利率、债券、股票、期货、期权以及风险价值等内容。
本书是专注于Python在金融领域运用的普及性读物,作者斯文博士在金融与风险管理方面有着深厚的积累,同时也有着丰富的编程经验,一直致力于倡导和推广Python在金融领域的运用。
本书适合想要掌握Python应用的金融学习者、金融从业者阅读,也适合想要转行到金融领域的程序员以及对Python在金融领域的实践应用感兴趣的人士阅读,并且不要求读者有Python编程基础。
斯文,笔名华尔街先生,浙江湖州人,经济学博士,中国注册会计师(Certified Public Accountant,CPA),特许金融分析师(Chartered Financial Analyst,CFA),金融风险管理师(Financial Risk Manager,FRM)。在国内某金融控股集团担任高级风控总监,拥有在中外资银行、证券公司、信托公司等机构十余年的金融与风险管理从业经验。
同时,他也是上海财经大学风险管理校友俱乐部的发起人兼理事长、《上财风险管理论坛》杂志主编、上海资产管理行业风险管理同业交流会秘书长,并担任中南财经政法大学、华东政法大学等多所国内高校的金融硕士研究生兼职导师,公开发表学术论文50余篇,出版了专著《中国外汇衍生品市场研究》(上海人民出版社2016年8月出版),多次荣获国家级、省部级的荣誉称号。
除此之外,他还历时3年多推出了《期权、期货及其他衍生产品(第九版)》视频课程(共360讲),累计观看人次超过百万,累计撰写了10万多行与金融相关的Python代码,长期致力于倡导并推广Python在金融领域的运用。
我学习金融、研究金融以及从事金融工作累计已经超过20年,发现大量金融专业的学生和从业者对金融的理解并不深刻,其中一个重要的原因就是缺乏对金融分析工具的掌握。Python作为一门开源的高级计算机编程语言,在金融领域的运用正变得越来越普及和广泛。当我第一次接触Python的时候,就被它的简洁与高效深深吸引,有“一见钟情”与“相见恨晚”的感觉,此后就彻底“爱”上了它,将它作为日常工作、学习,甚至是生活的有机组成部分。在金融领域,Python虽然不是万能的,但没有Python则是万万不能的。从长远来看,Python应该是金融专业学生与从业者的必备工具,就像多年前掌握Excel一样。
为此,我萌生了撰写一本专注于Python在金融领域运用的普及性读物的想法,借此将我个人在学习、运用和推广Python过程中的所思、所想、所感、所悟汇集起来并传承下去。考虑到广大的读者可能和我一样,不一定是理工科背景,也不一定是计算机专业出身,因此这本书会尽量避开专业性很强的计算机领域术语,运用通俗易懂的语言进行描述。本书不可避免地会涉及Python代码,为了能让读者方便地读懂代码,力求Python代码的简洁性和易懂性,我会尽可能给代码加上比较详细的注释。
至于给这本书取名,还有一段有趣的经历。通常而言,国内的中文图书是先有中文名,然后将中文名翻译成对应的英文名。但这本书我却是先想到“Python for Financial Analysis and Risk Management”这个英文书名,然后在考虑如何取一个合适的中文名时,我思考了良久。可以肯定的是,中文书名必须包含3个关键词:金融分析、风险管理以及Python,但是需要把这3个关键词很有逻辑地整合在一起,经过反复思考,不断排列组合,最终确定了本书的中文名是“基于Python的金融分析与风险管理”。金融分析与风险管理是全书的核心,同时这两者之间也是相
辅相成、密不可分的,金融分析是风险管理的基础和起点,风险管理则是
金融分析的落脚点和归宿。与此同时,无论是金融分析还是风险管理,目前正越
来越多地用到了量化和建模,Python不仅是一种计算机编程语言,其本身也是一种可用于分析和管理的便捷工具,因此Python就成了整本书的技术载体。借助Python,学习金融将变得更加有趣和简单,对金融的理解也可以变得更加深刻和全面。
相较于国内外相同主题的书籍,本书有以下四大特色:一是较好地平衡了Python的讲解与金融的运用,即使在专门对Python及其第三方模块进行介绍的章节中,也尽量结合金融案例;二是本书涉及的数据和例子基本是来源于国内金融市场,并且涵盖了货币市场、债券市场、股票市场、期货市场和期权市场等,这样的编排一方面可以增强读者阅读的亲切感,另一方面也可以加深读者对金融市场的认知;三是全面讨论风险管理的工具与方法,本书运用3章的篇幅分析了风险管理的重要工具—期货和期权合约,又用一章对测度风险的重要工具—风险价值进行了论述,即使在探讨债券和股票的章节中也对相关的风险进行了分析;四是内容叙述遵循了循序渐进的原则,考虑到本书的众多读者可能是 Python 的初学者甚至是Python零基础读者,因此内容的设计尽量做到由浅入深、由易到难、层层递进。
由于我本人的能力所限,书中的内容不免会有欠妥之处,诚恳希望得到广大读者的意见和建议,欢迎将意见和建议发送至我的电子邮箱siwen1980@126.com。
最后,衷心祝愿广大读者能够自信、从容地学完本书,真正体验到借助Python学习金融、运用金融所带来的愉悦感和成就感。
斯文于上海陆家嘴
2019年3月28日
斯文博士是我的忘年之交,他致力于在中国国内传播并推广金融风险管理的理念与方法,他的最新著作《基于Python的金融分析与风险管理》由人民邮电出版社出版发行,在这里首先对这本书的面世表示衷心祝贺!
在现代金融和风险管理的领域,从业者们不仅要熟悉包括股票、债券、期货、期权等各类金融产品,还需要借助计算机编程语言完成金融的大数据分析,实现机器学习、深度学习等人工智能在金融中的运用。在诸多的金融大数据分析工具中,Python编程语言越来越多地得到包括交易员、分析师、风险管理师等众多金融从业者的喜爱,在各类编程语言的全球排名中始终位列前茅。Python不仅仅是一门计算机编程语言,更是应用于金融分析和风险管理的利器。而这本《基于Python的金融分析与风险管理》宛如一辆承载Python编程语言的“复兴号”高铁列车,由读者亲自操控去开启神奇的金融之旅,在这样的非凡旅途中,学习金融会变得有趣和简单,对金融的理解也会变得更加深刻与全面。
我很喜欢阅读这本书,全书结构清晰、逻辑缜密、行文流畅,并且内容由易到难、层层递进,这确实是用“专注”与“专业”写成的书。作者不仅拥有在中外资银行、证券公司、信托公司、金融控股集团等十余年的从业经验,同时也获得注册会计师、特许金融分析师和金融风险管理师等高含金量的证书。在本书中,作者结合自己的经验向读者介绍他所钟爱的Python、金融分析与风险管理。在学习书中所涉及的关于中国金融市场与金融产品的实际案例时,相信读者和我一样能够感受到作者丰富的实战经验、扎实的理论功底以及对金融风险的深刻洞察。
作者很推崇Python之父吉多·范罗苏姆,对这位传奇人物的介绍会让读者倍感亲切。作者用通俗易懂的语言介绍了Python编程,包括安装Python软件以及一些基本操作,再到中级和高级的编程应用,循序渐进,环环相扣,书中也有很多数据绘制
图像的实例,内容丰富并且十分有趣。同时,作者对被誉为“华尔街圣经”的
《期权、期货及其他衍生产品》(约翰·赫尔著)也是喜爱有加,本书部分章节中就
包含了“华尔街圣经”中的精华。
本书有许多的特色,在这里我只提两点,其他的就留给读者们花时间去品味。第一大特色就是把金融中复杂甚至是有点高深的数学模型用Python语言生动地表达出来,并且指导读者亲自动手对债券、股票、期货、期权等金融产品开展定量分析,对风险价值进行建模和测度;另一大特色就是借助Python这座“桥梁”将前沿的金融理论与中国金融市场进行有效连接,本书贯穿着债券市场、股票市场、期货市场、期权市场等实际案例与数据的分析,不仅对中国国内的金融从业者非常具有价值,而且关注中国金融市场的海外金融人士也能从中受益良多。
大数据分析与风险量化是驱动金融业不断向前发展的双轮。在如今高科技与智能化的时代,“科技金融”这辆快车将带动中国金融行业在未来5~10年的蓬勃发展。《基于Python的金融分析与风险管理》作为将Python与现代金融理论和应用完美结合的一本专业书籍,恰好迎合了这个时代的需求。我很希望看到这本书能够成为各大高校金融学科的专业教材,成为广大金融从业者学习Python的案头之书。
王树勋 教授
新加坡南洋理工大学保险风险和金融研究中心主任
如果说约翰·赫尔教授的《期权、期货及其他衍生产品》是“华尔街的圣经”,那么斯文博士的《基于Python的金融分析与风险管理》就是“陆家嘴的宝典”,值得每一位国内金融从业者阅读并收藏!
——李刘阳 招商银行首席外汇分析师
为什么要学Python?Python是把“手术刀”,帮助我们高效剖析金融风险。当我们用IT系统计量金融风险时,公司把钱花在系统上,这是IT预算;当我们用Python计量金融风险时,公司把钱花在员工薪资上,这是个人价值。跟着斯文博士这本书,零基础的金融人士也能轻松掌握Python。
——汤仙斌 中银国际证券股份有限公司风险管理部副总经理
程序是呆板的,风险是冷酷的,但是将它们通过有趣的案例链接起来,便产生了化学反应,生成了这本灵动的书。把Python与风险管理相结合,让我们更好地理解和把握这个世界的不确定性。这本书不论是作为工具书,还是用作实操,都是一本不可多得的著作,值得深入去研究和学习。
——么峥 平安集团资管中心风控总监
本书主旨突出、针对性强,在对Python基础知识进行简洁明晰的介绍之后,直奔“如何在金融投资和风险管理中进行场景应用”这一核心主题,通过大量的典型案例细致地描述应用过程,宛如一位循循善诱的老师手把手地演示每个步骤和细节。如果你的征途是金融投资或者风险管理,本书将是载你进行星际穿越的那艘永恒号。
——王几高 歌斐资产管理有限公司高级风险管理董事
这是我读过的少数能将基于Python编程的金融分析讲得如此浅显易懂又有趣的书籍,而且还有如此多的真实示例予以分享,推荐每一个立志于学习Python的人认真读一读这本书,并作为一本工具书予以珍藏。
——姚奕 赛弥斯信用管理(北京)有限公司副总经理、知名风控专家
244个实战案例,聚焦风险管理实践前沿,斯文博士的《基于Python
的金融分析与风险管理》一书堪称风险管理领域的“孙子兵法”,以Python为
“武器”,以金融分析为“军师”,在金融战场所向披靡。本书值得每一位有志于在风险管理领域深耕的从业者研读。
——胡德宝 中国人民大学金融风险管理硕博士项目负责人、副教授
Python自公开发行已来,已经成为最受欢迎的程序设计语言之一。目前,Python被广泛地应用于金融投资和风险管理领域。工欲善其事,必先利其器。斯文博士的著作内容全面,讲解详细,编排合理,由浅入深,易读性强,加之能够结合大量实际案例,能够快速把读者从理论模型带到金融实践环境中来,是面向国内金融市场的不可多得的利器。该书不仅可以作为金融从业人员的工具书,也可以作为金融学本科生和研究生的教科书。
——郭喜才 华东政法大学金融创新与风险管理研究所所长
Python作为全球十分流行并且开源、免费的高级计算机编程语言,在金融领域得到了广泛的运用。本书聚焦于Python在金融分析与风险管理方面的应用,全书分为入门篇、基础篇和提高篇,共计12章。在入门篇中,我们对Python做了介绍并结合金融案例演示了Python的基本操作;在基础篇中,我们结合金融案例讲解了包括NumPy、Pandas、Matplotlib、SciPy等Python常用的第三方模块的具体运用;在提高篇中,我们详细讨论了如何运用Python分析利率、债券、股票、期货、期权以及风险价值等内容。本书提供244个示例、101张图片,并与中国的金融市场结合,可以作为广大金融学习者与从业者的学习用书,也适合作为程序员进入金融科技领域的学习指南。
亲爱的读者,此刻你已经踏上了一条由Python铺设的通往金融殿堂的大道,一路上你会看到许多的“风景”,在此我们给这些“风景”制作一个游览的导图。
第1章介绍Python的优势、版本、安装与学习方法,还介绍了常用的金融数据库。
第2章包含59个示例,在示例中尽量结合金融场景,有针对性地讲解和演示Python的基本操作。
第3章运用37个示例,结合金融场景讲解NumPy模块的操作。
第4章使用25个示例,结合金融时间序列讨论Pandas模块的操作。
第5章采用9个示例,结合金融场景演示Matplotlib模块的可视化功能。
第6章借助16个示例,结合金融场景探讨SciPy、StatsModels、arch和datetime等模块。
第7章基于Python的18个示例,依次展开对利率、债券定价、债券久期与凸性等内容的分析。
第8章使用基于Python的14个示例,论述投资组合理论、资本资产定价模型、股票价格服从的随机过程以及投资组合绩效评估等内容。
第9章采用基于Python的13个示例,剖析股指期货、国债期货的套期保值。
第10章借助基于Python的28个示例,探讨期权到期收益、期权定价、衡量期权风险的希腊字母以及隐含波动率等主题。
第 11 章通过基于Python的20个示例,讨论保本票据、单一期权与单一基础资产的策略、价差策略、组合策略等期权的常用交易策略。
第 12 章采用基于Python的5个示例,讲解风险管理的重要工具—风险价值和压力风险价值等内容。
每章的开篇都设置了导读部分,便于读者能够在较短的时间内对整章的内容有一个概括性的了解。在每章的结尾部分,我们不仅对全章的内容进行总结,而且提供了拓展阅读的文献材料,便于读者能够通过这些文献对相关章节的内容有一个更加全面和深入的掌握。
Python 作为一门计算机编程语言,它的呈现方式是代码,因此 Python的代码也是本书的重要组成部分。为了将代码与其他的内容相区分,凡是涉及代码输入与输出的部分均加上底纹。以下面的代码举例:
In [10]: a='finance'
In [11]: type(a)
Out[11]: str
同时,为了提升阅读体验,针对部分代码的输出结果,在排版方面做了一定的优化。
此外,本书从第4章开始会涉及大量的金融数据,为了便于读者运用这些数据进行Python的编程练习,数据均已存放至Excel表格并上传至异步社区,共计27张Excel表;同时,书中的101张图片(彩图)也已经上传至异步社区。读者可以到异步社区的本书页面下载Excel表格和图片。
在本书的学习过程中,时间与精力的投入是不可或缺的,正如《真心英雄》这首歌的歌词所述:“不经历风雨,怎么见彩虹?没有人能随随便便成功!”如果不花费必要的时间、不经历一定的艰辛,是无法真正体会到在金融领域运用Python所带来的喜悦与成就的。
下面,就正式开启阅读与学习之旅吧!
本书由异步社区出品,社区(https://www.epubit.com/)为您提供相关资源和后续服务。
本书提供配套资源,请在异步社区本书页面中单击,跳转到下载界面,按提示进行操作即可。注意:为保证购书读者的权益,该操作会给出相关提示,要求输入提取码进行验证。
作者和编辑尽最大努力来确保书中内容的准确性,但难免会存在疏漏。欢迎您将发现的问题反馈给我们,帮助我们提升图书的质量。
当您发现错误时,请登录异步社区,按书名搜索,进入本书页面,单击“提交勘误”,输入勘误信息,单击“提交”按钮即可。本书的作者和编辑会对您提交的勘误进行审核,确认并接受后,您将获赠异步社区的100积分。积分可用于在异步社区兑换优惠券、样书或奖品。
我们的联系邮箱是contact@epubit.com.cn。
如果您对本书有任何疑问或建议,请您发邮件给我们,并请在邮件标题中注明本书书名,以便我们更高效地做出反馈。
如果您有兴趣出版图书、录制教学视频,或者参与图书翻译、技术审校等工作,可以发邮件给我们;有意出版图书的作者也可以到异步社区在线提交投稿(直接访问www.epubit. com/selfpublish/submission即可)。
如果学校、培训机构或企业,想批量购买本书或异步社区出版的其他图书,也可以发邮件给我们。
如果您在网上发现有针对异步社区出品图书的各种形式的盗版行为,包括对图书全部或部分内容的非授权传播,请您将怀疑有侵权行为的链接发邮件给我们。您的这一举动是对作者权益的保护,也是我们持续为您提供有价值的内容的动力之源。
“异步社区”是人民邮电出版社旗下IT专业图书社区,致力于出版精品IT技术图书和相关学习产品,为作译者提供优质出版服务。异步社区创办于2015年8月,提供大量精品IT技术图书和电子书,以及高品质技术文章和视频课程。更多详情请访问异步社区官网https://www.epubit.com。
“异步图书”是由异步社区编辑团队策划出版的精品IT专业图书的品牌,依托于人民邮电出版社近30年的计算机图书出版积累和专业编辑团队,相关图书在封面上印有异步图书的LOGO。异步图书的出版领域包括软件开发、大数据、AI、测试、前端、网络技术等。
异步社区
微信服务号
第1章 Python概览
第2章 结合金融演示Python的基本操作
本章导读
在当今的社会,无论是学习金融还是从事金融工作都迫切需要掌握两门语言,一门是人与人之间交流的语言,比如中文、英文等;另一门就是人与计算机交流的语言,也就是计算机编程语言。面对林林总总的计算机编程语言,对于广大金融学习者和从业者而言,Python是一个比较理想的选择,本章对Python做一个概括性介绍。
本章的内容涵盖以下几个主题。
Python官网(见图1-1)给出了如下定义:Python是一种具有动态语义的、解释型、面向对象的高级编程语言。Python的高级内置数据结构,结合动态类型和动态绑定,使其在快速应用程序开发方面非常具有吸引力,并且可用作脚本或粘合语言(glue language,也译为胶水语言)将现有组件连接在一起。Python简单易学的语法强调可读性,因此降低了程序维护的成本。Python支持模块和包,鼓励程序模块化和代码重用。Python解释器和广泛的标准库以源代码或二进制形式免费提供、免费分发,并用于所有主要的平台。
图1-1 Python官方网站的首页
在自动化测试、网络爬虫、数据分析和机器学习等领域,Python是首选的编程语言之一。TIOBE Index[1]已经将Python列为2018年第三大流行的编程语言。表1-1就显示了截止到2018年12月,全球排名前20位的计算机编程语言。
表1-1 计算机编程语言的全球排名
2018年12月排名 |
2017年12月排名 |
编程语言 |
---|---|---|
1 |
1 |
Java |
2 |
2 |
C |
3 |
4 |
Python |
4 |
3 |
C++ |
5 |
7 |
Visual Basic .NET |
6 |
5 |
C# |
7 |
6 |
JavaScript |
8 |
9 |
PHP |
9 |
- |
SQL |
10 |
12 |
Objective-C |
11 |
16 |
Delphi/Object Pascal |
12 |
13 |
Assembly language |
13 |
10 |
MATLAB |
14 |
11 |
Swift |
15 |
17 |
Go |
16 |
8 |
R |
17 |
15 |
Ruby |
18 |
14 |
Perl |
19 |
20 |
Visual Basic |
20 |
19 |
PL/SQL |
目前,在国内已经掀起了一股学习、运用Python的热潮,2018年12月31日通过百度搜索Python关键字发现,相关结果约1亿个。
结合Python官方网站的介绍以及广大用户的体验,相比其他的编程语言,Python具有4个方面的比较优势。
一是语法简单。大道至简,Python有相对较少的关键字,语法结构简单、直接,不仅让使用者编程更加方便,同时也可以让阅读者更容易理解。Python的文档可以在整个编程过程中给用户提供帮助,真正做到以用户为导向。因此,无论是计算机编程的新手还是拥有其他编程语言经验的老手,学Python都可以轻松上手。
二是免费与开源。虽然这个世界上免费的东西可能不会是很好的东西,但是Python绝对是一个例外,是真正精致的编程语言和软件。Python是在开放源代码促进会(Open Source Initiative,OSI)批准的开源许可下开发的,使其可以自由使用和分发,甚至可用于商业用途。Python的许可证由Python软件基金会(Python Software Foundation)负责管理。
三是强大的第三方模块。截止到2019年3月16日,Python Package Index(PyPI)发布的Python第三方模块数量已经高达172 201个。目前,人工智能(artificial intelligence,AI)、机器学习(machine learning,ML)、深度学习(deep learning,DL)都大量运用了Python。
四是与金融的深度结合。国内外的金融机构正在越来越多地运用Python开发投资策略、风险管控模型。搜狐网在2018年10月15日发布了题为“3个月必须学会Python!5家银行资管总谈转型”的报道,该报道中就提到了一家国内商业银行要求从2018年9月份开始所有的金融科技人员和投研人员都必须在3个月掌握Python。
表1-2比较了Python与其他在金融领域常用的数据分析软件(包括Matlab、R、SPSS、SAS、Excel),除了免费以外,无论是编程的简易程度还是运用场景的广泛性,Python都具备优势。
表1-2 Python与金融领域其他常用数据分析软件的比较
名称 |
费用 |
处理逻辑 |
版本更新 |
编程难度 |
运用场景 |
---|---|---|---|---|---|
Python |
免费 |
内存计算 |
快 |
易 |
广 |
Matlab |
收费 |
内存计算 |
中 |
中 |
中 |
R |
免费 |
内存计算 |
快 |
难 |
中 |
SPSS |
收费 |
内存计算 |
中 |
易 |
窄 |
SAS |
收费 |
非内存计算 |
慢 |
中 |
窄 |
Excel |
收费 |
内存计算 |
中 |
难 |
窄 |
正所谓“落其实者思其树,饮其流者怀其源”。当学习和使用Python的时候,同样也需要了解Python的创始人。
Python的诞生本身就注定了这个计算机编程语言会扎根于草根阶层。在1989年12月的圣诞节期间,荷兰程序员吉多•范罗苏姆(Guido van Rossum)利用空闲时间作为一个周末项目开始研究并开发一个新的脚本解释程序(即Python),并将其作为对ABC语言的一种继承。吉多•范罗苏姆曾经参与设计了ABC语言,虽然这种语言非常优美和强大,但是ABC语言并没有成功,一个很重要的原因是ABC语言并非开源,因此吉多•范罗苏姆决心在Python中避免这一错误。同时,他还想实现在ABC中闪现过但未曾实现的许多灵感。从那时起,Python就一步一步发展并最终成为计算机世界中最优秀的编程语言之一。
至于为什么要将新的编程语言取名“Python”,有以下两个原因:一是吉多•范罗苏姆最初认为运用UNIX系统或C语言的黑客们是他的新编程语言的目标用户;二是他喜欢看著名的系列喜剧《蒙提•派森的飞行马戏团》(The Monty Python's Flying Circus),Python这一名字让他印象深刻,因为这个名字符合他的品味,也能吸引他的目标用户。下面,简要介绍吉多•范罗苏姆的生平。
吉多•范罗苏姆(见图1-2)于1956年1月31日在荷兰出生,1982年在阿姆斯特丹大学获得数学和计算机科学硕士学位。后来他在多个研究机构工作,包括荷兰阿姆斯特丹的国家数学和计算机科学研究学会(CWI)、美国马里兰州盖瑟斯堡(Gaithersburg)的国家标准及技术研究所(NIST)以及弗吉尼亚州雷斯顿(Reston)的国家创新研究公司(CNRI)。
图1-2 吉多•范罗苏姆的照片(来源于百度图片)
2005年12月至2012年12月,吉多•范罗苏姆在谷歌(Google)工作,他用Python为谷歌撰写了面向网页的代码浏览工具。从2013年1月至今,吉多•范罗苏姆在Dropbox工作,并且与之前在谷歌一样,他可以将 50%的时间花在Python开发上。
以下是截止到2018年末吉多•范罗苏姆所获的主要荣誉:
在Python社区,吉多•范罗苏姆被人们认为是“仁慈的独裁者(BDFL)”,意思是他仍然关注Python的开发进程,并在必要的时刻做出决定。吉多•范罗苏姆于2018年7月12日通过开发者邮件组宣布要“移交权力”,在邮件中吉多•范罗苏姆提到:“我将完全退出决策层,但仍将作为一名普通核心开发者继续做一些指导性工作,我不一定还能腾出更多时间,但我会给BDFL(仁慈的独裁者)一个永久的假期。”
除此之外,在2006年6月23日吉多•范罗苏姆曾经写过面向中国读者的一封信,并且还有相应的中文博客。
虽然Python从诞生到现在仅仅只有近30年的时光,但是已经经过了多次的更新和迭代。截止到2018年12月末,最新的版本是3.7.2。目前国内外有关Python在金融领域运用的教材,最常用的版本是2.7和3.7及以上,当然这两个版本之间并非100%兼容。
需要注意的是,吉多•范罗苏姆在2018年3月10日对外宣布Python核心团队将于2020年1月1日起终止对Python 2.7版本的支持,此后Python 2.7版本的用户如果想要继续得到与该版本有关的支持,需要付费给相关的商业供应商。
因此,本书撰写过程中运用的是Python 3.7版本,表1-3是Python版本的演进历史。
表1-3 Python的版本演进以及首次发布的日期
版本号 |
首次发布日期 |
---|---|
Python v0.1.0(第1版) |
1990年 |
Python v0.9.5 |
1992年1月 |
Python v1.0.0 |
1994年1月 |
Python v1.1.0 |
1994年1月 |
Python v1.2.0 |
1995年4月 |
Python v1.3.0 |
1995年10月 |
Python v1.4.0 |
1996年10月 |
Python v1.5.0 |
1998年1月 |
Python v1.6.0 |
2000年9月 |
Python v2.0.0 |
2000年10月 |
Python v2.7.0 |
2010年7月 |
Python v3.0.0 |
2008年12月 |
Python v3.6.6 |
2018年6月 |
Python v3.7.0 |
2018年6月 |
由于目前绝大多数的计算机操作系统并没有自带Python程序,因此在使用Python之前,第一步就是需要安装Python,有两种方法,一种是单独安装,另一种是集成安装。
用户可以直接登录Python官网的下载专区下载需要的Python软件,然后进行安装。这里需要注意以下两点。
一是选择匹配的操作系统。针对用户的计算机平台(包括Windows、Linux/UNIX、Mac OS X以及其他操作系统),选择相应的Python安装包,比如用户是Windows系统,则需要下载能够在Windows系统运行的Python安装包。
二是需要区分计算机CPU是64位还是32位。注意,32位的CPU只能安装适合32位的Python安装包,但是64位的CPU可以兼容32位和64位的Python安装包。
单独安装的优势就是灵活并且占用内存小。但是,单独安装的缺点也十分明显,针对需要的Python第三方模块,用户必须自行下载并安装,往往会费时费力。
集成安装就是下载并安装一个集成Python以及Python常用第三方模块的软件,最流行的就是Anaconda。集成安装最大的优势就是一劳永逸,当然集成安装也会有缺点,那就是集成的第三方模块通常会非常多,对于普通用户而言,所集成的绝大多数第三方模块并非都能用到,那些不被使用的第三方模块就白白占用了计算机的内存空间,造成资源的闲置与浪费。
虽然集成安装有一定的缺陷,但从便利性的角度考虑,依然建议用户尤其是初学者选择集成安装的方式安装Python及其相关的第三方模块。本书是通过下载并安装Anaconda来实现对Python的运用。
Anaconda是非常流行的Python和R语言的数据科学软件集成平台,拥有超过1200万用户。集成Python的Anaconda软件包含了720多个数据科学相关的工具包,比如实现科学数据分析的NumPy、Pandas、Numba、Dask等工具包(模块),实现数据可视化的Matplotlib、Bokeh、Datashader、HoloViews等工具包,开发与训练机器学习和深度学习模型的scikit-learn、TensorFlow、Theano等工具包,基本满足了金融领域对Python的需求。
读者需登录相关下载专区自行下载Anaconda软件,具体参见图1-3的下载专区界面。注意,下载专区提供了分别匹配Windows、Mac OS以及Linux这3种不同操作系统的Anaconda软件,与此同时,还提供了集成Python 3.7的Anaconda 3.0版本与集成Python 2.7的Anaconda 2.0版本供选择,下载时还需要依据计算机内存(64位或32位)选择相应的Anaconda软件。本书运用的是Anaconda 3.0版本,操作系统是Windows。
图1-3 Anaconda的下载专区页面
Anaconda 软件安装完成以后,最便捷的方式就是通过 Anaconda Navigator(简称“Navigator”)打开,Navigator是一个用于管理工具包和环境的图形用户界面(Graphical User Interface,GUI),后续涉及的众多管理命令也可以在Navigator中手动实现。图1-4就是打开Navigator以后,用户可以看到的完整界面。
图1-4 Anaconda Navigator的界面
下面简要介绍界面中的8个模块,并且从左往右、从上往下依次介绍。
Jupyter Lab是Jupyter Notebook(后面会介绍)的下一代产品,集成了更多功能,包括能够在多个窗口显示一个文档,快捷查看函数帮助文档,手动拖曳单元(cell),输出结果在单个窗口显示,清除输出结果,临时交互试验等。
Jupyter Notebook是一款开源的网络应用,是一种基于网络的交互式计算环境,可以编辑易于人们阅读的文档,可以展示数据分析的过程。用户可以将说明文本、数学方程、代码和可视化内容全部组合到一个易于共享的文档中,简化工作流程,实现更高的生产力和更便捷的协作。
Qt Console是一个可执行IPython的仿终端图形界面程序,相比于Python shell界面,它可以直接显示代码生成的图形,实现多行代码输入执行,以及内置许多有用的功能和函数。其中,IPython是一个Python的交互式果壳,比默认的Python shell更好用,支持变量自动补全,可自动缩进,又内置了许多很有用的功能和函数。
Spyder是一个使用Python的开放源代码跨平台科学运算的电子集成驱动器(IDE),它可以跨平台,也可以使用附加组件扩充,自带交互式工具以处理数据。Spyder最大的优点就是模仿MATLAB的“工作空间”。本书的代码编写过程就是运用Spyder完成,后面也会具体介绍Spyder。
Visual Studio Code(简称“VS Code”)是一个轻量级且功能强大的源代码编辑器,由微软公司开发,拥有支持语法高亮、智能代码补全、自定义热键、括号匹配、代码片段、代码对比等特性,提供了对JavaScript、TypeScript和Node.js的内置支持,并为其他语言(如C、C#、Java、Python、PHP)提供了一个丰富的扩展生态系统和运行平台(如.NET和Unity)。
Glueviz是一个Python第三方模块,用于探索相关数据集内部和之间的关系。其主要特点包括如下几个。
Orange3是一个开源的机器学习和数据可视化工具,带有很多用于数据挖掘或机器学习模型的交互式数据分析工作流程;可以通过巧妙的数据可视化执行简单的数据分析;能够显示统计分布、箱形图和散点图,或者决策树、层次聚类、热力图和线性投影等;即使是多维数据也可以在二维中变得合理。此外,使用Orange3中可用的各种附加组件可以从外部数据源挖掘数据,执行自然语言处理和文本挖掘,进行网络分析,执行关联规则挖掘等众多功能。
R studio是一款针对R语言的集成开发环境,克服了R语言自带操作环境中的一些不便利性,有效地提升了运用R语言的便捷程度。此外,与R语言一样,R studio也是完全免费的。但需要注意的是,在是否已默认安装R studio方面,不同版本的Anaconda会存在一定的差异性。
前面提到本书的Python代码都是在Spyder上输入和完成的,下面就简要介绍一下Spyder的相关操作。你可以通过单击图1-4中的Spyder模块打开,或者也可以通过Anaconda开始菜单中的Spyder直接进入。Spyder的界面布局经过多年的迭代优化,目前来看已经比较合理和高效,很类似于MATLAB的界面。它的界面由若干窗口构成,用户可以根据自己的喜好调整它们的位置和大小。图1-5展示了最常见的Spyder操作界面。
图1-5 Spyder的操作界面
在图1-5中,左半边的Editor代码编辑窗口是用来撰写Python代码,并且拥有对代码的错误提示功能,同时点击菜单栏“Run”中的“Run cell”就可以快速运行Editor代码编辑窗口中所选定的代码。
右下侧是“IPython console/History log”窗口,其中的“IPython console”是控制台,相当于IPython的命令行窗口,可以直接在窗口中输入代码,按下回车键就能执行相关代码。“History log”是记录之前在“IPython console”中输入过的代码。
右上侧是“variable explorer”窗口,用于显示在“IPython console”中输入的变量类型等信息。
此外,界面的最上方还有菜单和工具栏,涉及许多的功能,最常用的是菜单栏“File”中的“New File”(新建文件)、“Open”(打开文件)以及“Save”(保存文件),以及前面介绍的菜单栏“Run”中的“Run cell”,其余的功能可能会较少使用,限于篇幅在这里不逐一介绍。
关于学习的方法论是一个很重要但经常被忽视的问题,因此本节就从学习Python的态度、原则、技巧等方面展开。
有句名言“在战略上要藐视敌人,在战术上要重视敌人”,这句话完全可以运用在Python的学习上,需要学习者在战略的层面藐视学习Python的困难和艰辛,但是在战术层面也就是细节方面则需要扎扎实实地把Python的内容学懂与学透。
Python的内容可以说是浩如烟海,但根据帕累托定律(俗称“二八定律”),日常学习与工作真正需要运用的内容其实仅占20%甚至更少。因此,对于广大的金融学习者和从业者而言,首先要学习最重要的内容,一旦打好了坚实的基础,再寻求从横向去拓宽、从纵向去深化,这种学习方法就类似一个倒置的梯形。切记不能一开始就求多、求全、求深,否则只会捡了芝麻却丢了西瓜,并且学习自信心会严重受挫。
目前,Python运用于金融其实是要实现两大目的:一是更有效率、更加精确地对金融进行分析与运算,二是更高效、更科学地进行风险决策。因此,需要将Python的学习与金融的学习同步,这样既能掌握对Python的操作又能深化对金融的理解与运用。
“纸上得来终觉浅,绝知此事要躬行。”针对类似于Python等计算机编程语言的学习,除了看书以外,在计算机上的操作练习是必要的更是必需的。如果是初学者,建议上机练习分3步走:第1步,将本书中的代码逐一在计算机的Python平台中输入一遍;第2步,根据本书的案例,自己设计Python代码,查看是否能够获得一致的结果;第3步,寻找本书以外的金融数据与案例并且编写代码,查看能否通过Python实现。
随着互联网越来越普及,大量的学习者已经把互联网作为一个重要的学习平台。本书针对Python的学习,梳理了部分比较优质的免费互联网资源作为学习的辅助工具(见表1-4)。
表1-4 Python的互联网学习资源
网站名称 | 简介 | |
---|---|---|
国内 | CSDN博客 | CSDN成立于1999年,是国内专业的IT社区,致力于为中国软件开发者提供知识传播、在线学习、职业发展等全生命周期服务,其网站上关于Python的内容比较丰富和全面 |
脚本之家 | 该网站建立于2006年,是一个为IT技术脚本开发人员提供资讯、技术、资源等服务的网站,有大量Python代码以及疑难问题的解答 | |
国外 | Python官网 | Python官网不仅提供了Python软件的下载,也提供了Python的文档和社区。其中,文档包罗了从初学者到专业人士所需的大量参考资料,社区则提供了学习者和用户在线讨论的论坛 |
Google's Python Class | 该网站提供了Python的课程、视频以及测验 | |
The Python Challenge | Python Challenge(Python挑战赛)由Nadav Samet创作,是一款在线游戏,但是游戏的每个级别都需要运用Python编程来解决,将Python的学习和游戏进行结合,实现寓教于乐 |
一名成功的学习者应该是一位善于总结的高手。因此,在学习Python的过程中一定要多总结。下面是作者本人在Python运用过程中总结的注意事项的举例:一是正确运用括号,要区分小括号、中括号、大括号的运用,并且括号内也可能还会有括号;二是区分函数的英文大小写,比如在DataFrame、Series等函数中,一些字母是需要大写的,否则就会出现错误;三是正确运用缩进;四是正确使用引号等。
在运用Python开展金融分析与风险管理时,经济、金融数据就是不可或缺的原材料。就目前而言,国内常用的财经金融数据库包括万得、同花顺、CCER经济金融数据库以及国泰安经济金融研究数据库等,并且部分数据库也开发了针对Python的API接口(Application Programming Interface,应用程序编程接口),以方便用户直接通过Python提取需要的数据。下面就简要介绍这些数据库的概况。
万得信息技术股份有限公司(简称“Wind”)是国内一家金融数据、信息和软件服务企业,总部位于上海陆家嘴金融中心。Wind的客户涵盖了国内多数的商业银行、保险公司、证券公司、基金管理公司等金融机构,国内许多高校、学术研究机构、金融监管机构也使用Wind终端,研究报告、学术论文也经常引用Wind提供的数据。
在金融财经数据领域,Wind已建成以金融证券数据为核心的财经、金融数据仓库,数据内容涵盖股票、基金、债券、外汇、保险、金融衍生品、宏观经济、财经新闻等领域。关于Wind的详细介绍,可以登录其官方网站查询。
浙江核新同花顺网络信息股份有限公司(简称“同花顺”)是一家专业的互联网金融信息服务商,主营业务包括网上行情交易系统、移动金融信息服务、基金销售、金融大数据处理及云服务等系列产品与服务。主要客户涵盖金融市场的各层次参与主体,包括券商、基金、私募、银行、保险、政府、科研院所、上市公司等机构客户和广大的个人投资者用户。
代表性的数据产品主要有iFinD金融数据终端、网上行情交易系统等。在金融财经数据领域提供的数据范围与Wind比较相似。关于同花顺的详细介绍,可以登录其官方网站查询。
CCER经济金融数据库是色诺芬信息技术有限责任公司联合北京大学国家发展研究院推出的研究型数据库。该数据库力求为学术研究提供精确、规范和全面的数据服务。除了不断扩充的标准数据,该数据库还提供灵活的数据定制服务,以满足日渐差异化的用户需求。
数据库主要包括股票市场数据库、公募基金数据库、债券市场数据库、货币市场数据库、公司财务数据库、行业统计数据库、全国宏观年度数据库、高频数据库、基金关联交易数据库以及QFII(合格境外机构投资者)数据库等。关于CCER经济金融数据库的详细介绍,可以登录其官方网站查询。
国泰安(CSMAR)经济金融研究数据库是国泰安从学术研究的需求出发,借鉴芝加哥大学CRSP、标准普尔Compustat、纽约交易所TAQ、IBES、Thomson等国际知名数据库的专业标准,并结合中国实际国情开发的经济金融型数据库。经过近20年的不断积累和完善,CSMAR数据库已涵盖因子研究、人物特征、绿色经济、股票、公司等18个系列,包含超过130个数据库、4000多张表、4万多个字段。关于国泰安经济金融研究数据库的详细介绍,可以登录其官方网站查询。
本章首先给出Python的定义,并对比其他计算机编程语言和数据分析软件讨论了Python的优势。之后介绍了Python之父——吉多•范罗苏姆先生。Python从1990年第一版发布至今已经有近30年的历史,目前最常用的版本是Python3.7和Python2.7两个版本,建议使用Python3.7。由于Python需要安装后才能使用,加之在金融领域运用Python会涉及一些第三方模块,建议下载并安装Anaconda软件,同时在Spyder的界面中运行Python会获得比较好的用户体验。学习Python的方法很重要,否则就是事倍而功半,甚至会导致半途而废。金融涉及大量的数据,万得、同花顺、CCER、CSMAR等国内主要的财经金融数据库都可以提供相关的分析数据源。
[1] Python的官方网站提供了全面和详实的关于Python的各类学习资料。
[2] Python Package Index(PyPI)的官方网站提供了全部Python第三方模块的下载安装包和详细文档资料。
[1] TIOBE Index专注于评估和跟踪软件质量,通过应用广泛接受的编码标准来衡量软件系统的质量,是由TIOBE Software BV推出并发布,TIOBE这个名字代表着“认真的重要性(The Importance of Being Earnest)”。
本章导读
第1章对Python做了概览性介绍,本章将探讨Python的具体操作。鉴于Python的内容非常庞杂,如果希望用一章的篇幅来穷尽所有的内容无疑是天方夜谭。因此,本章的策略是不追求大而全,而是有的放矢,并且结合金融场景展开对Python操作的讲解和演示。
本章的内容涵盖以下几个主题:
在Python的世界中有一句名言:“一切皆为对象”;在金融的世界中也有类似的一句名言:“一切皆为变量”,所以本章就从在Python中给金融变量赋值讲起。
当打开一张财经报纸时,映入眼帘的往往是金融市场各种指数或资产的价格与涨跌幅信息,比如,2019年1月2日上证综指涨跌幅为−1.15%,这条信息转换成Python的语言就是一个典型的赋值,其中,用变量代表上证综指涨跌幅,赋给该变量的数值就是−0.0115。
在Python中,每个变量在使用前都必须赋值,并且是运用等号(=)来给变量赋值。等号(=)运算符左边是一个变量名,右边是存储在该变量中的值,即:
变量 = 值
Python的变量名可以用英文字母、数字和下划线构成,但是必须记住以下四点注意事项:
一是可以单独用英文字母或者下划线作为变量名,同时英文字母需要注意区分大小写;
二是数字不能单独用于表示变量,比如3不能作为变量名;
三是变量不能以数字开头,比如1a不能作为变量名,a1却可以作为变量名;
四是变量的命名应该简洁易懂。比如,在金融领域,对于变量的命名尽可能运用该变量的英文名、英文缩写或者英文名的首字母。
【例 2-1】 假定利率是8%,需要在Python中赋值,可以采用如下Python的代码对利率变量进行赋值:
In [1]: rate=0.08 #利率等于8%
或者是
In [2]: r=0.08
这里请注意,凡是以#开始输入的内容,属于注释语句,Python是不会读取的。因此,编程者可以通过注释语句让阅读者更好地理解代码的含义。此外,8%在Python输入中必须用0.08表示,因为“%”在Python中有特殊的含义,我们会在2.4节介绍。
Python拥有丰富的数据类型,典型的数据类型包括数字、字符串、布尔值与空值。这里我们着重讨论数字和字符串两种,其中数字包括整型(int)、长整型(long)、浮点型(float)以及复数(complex)。关于布尔值,我们会在2.4节中结合关系运算符号进行介绍。
整数是数字的重要组成部分,类似−100、0、9、369这样的数称为整数,整数可细分为正整数、零和负整数,并且有无穷多个。整数也是金融领域经常用到的数字,比如上市公司的数量、股票数量、投资者人数、债券面值、交易日天数等都需要用到整数。在Python中,与整数相对应的就是整型(也称为整数),同样,整型也是Python的基础数据类型之一,在Python中显示为int(即整数英文单词integer的缩写);此外,长整型可以表示无限大的整数。考虑到在金融领域中,整型已经可以有效满足日常分析和建模的需要,长整型的运用并不多见,因此下面就侧重于讨论整型。
【例 2-2】 假定A投资者持有一家上市公司100股股票,通过Python进行赋值,并且通过type函数判断数据类型,具体的代码如下:
In [3]: share=100 #股票数量等于100
In [4]: type(share)
Out[4]: int
注意,在Python中,整型有以下特征:一是必须为数字,二是不能出现小数点。如果出现小数点,就是接下来要讨论的浮点型。
在金融领域运用Python时,浮点型(也称为浮点数)是最常用的数据类型,包括利率、汇率、股价、财务比率、收益率、波动率等变量都是浮点型。浮点型就是由整数、小数点和小数(非必需)构成的数字。在2.1节中关于利率的示例(例2-1)就是一个浮点型。
In [5]: type(rate)
Out[5]: float
需要注意的是,在Python中输入数字时,如果数字中带有小数点,无论实质上是否为整数,Python均会将其视作浮点型。
【例2-3】 运用前面例2-2中的相关信息,在Python中输入数字时,用户在100后面增加了一个小数点,则数据类型结果就是浮点型而非整型,具体的代码如下:
In [6]: share=100.
In [7]: type(share)
Out[7]: float
在数学中,当a、b均为实数,z = a + bi就被称为复数(complex number),其中a称为实部,b称为虚部,i称为虚数单位,复数是由意大利米兰学者卡当在16世纪首次引入。复数在金融领域的运用相对较窄,主要运用于金融的时间序列分析、美式期权定价(运用傅里叶变换)。注意,在Python中,虚数单位是用小写的英文字母j表示。
【例 2-4】 一个变量a等于复数2+3i,在Python中进行输入,并且判断数据类型,具体的代码如下:
In [8]: a=2+3j
In [9]: type(a)
Out[9]: complex
在金融领域,经常遇到包括公司名称、金融产品要素名称等非数字的文本信息,在Python中针对这些表示文本的基本数据类型就需要用到字符串(string)。同时,关于字符串有四大特征:输入时需用引号、可索引性、可截取性以及可替换性,下面就依次进行讨论并演示。
特征之一:输入时需用引号。在Python中,用英文的单引号' '、双引号" "以及三引号''' '''来标识字符串,其中,三引号往往是用于多行文本。此外,引号内无论中文、英文字母、符号、数字甚至是空格,均被视为字符串。需要说明的是,在Python中,字符串的类型是用str显示(即英文string的缩写)。
【例 2-5】 在Python中,以字符串的数据类型依次输入finance、risk management、金融风险管理、888、1+1,具体的代码如下:
In [10]: a='finance'
In [11]: type(a)
Out[11]: str
In [12]: b="risk management"
In [13]: type(b)
Out[13]: str
注意,risk与management之间的空格也是占据一个字符。
In [14]: c='金融风险管理'
In [15]: type(c)
Out[15]: str
In [16]: d='888'
In [17]: type(d)
Out[17]: str
In [18]: e='1+1'
In [19]: type(e)
Out[19]: str
特征之二:可索引性。字符串是可以被索引的,并且如果针对字符串是从左向右的索引,则默认是从0开始,最大范围就是字符串长度减去1,并且需要用到中括号;相反,从右向左的索引,默认是从−1开始,最大范围是字符串开头。
以上的索引规则不仅仅适用于字符串,对于Python中涉及的其他索引也全都适用。
【例2-6】 运用例2-5中输入的字符串finance,依次索引finance这个单词的首字母f、单词的第4个字母a以及单词最后一个字母e,具体的代码如下:
In [20]: a[0] #索引首字母
Out[20]: 'f'
In [21]: a[3] #索引第4个字母
Out[21]: 'a'
In [22]: a[-1] #索引最后一个字母
Out[22]: 'e'
特征之三:可截取性。假如,用户要从字符串“I love risk”选取子字符串“risk”,就需要用到字符串的截取功能。截取也称为切片(slice),是从一个字符串中获取子字符串(也就是字符串的一部分),需要使用中括号、起始索引值(start)、终止索引值(end)以及可选的步长(step)来定义。截取的输入格式如下:
字符串[start: end: step]
下面,就结合Python的演示讲解具体的字符串截取操作方法。
【例 2-7】 假定用户在Python中输入字符串“I love risk”,并且在该字符串中截取子字符串“love”,具体的代码如下:
In [23]: x='I love risk'
In [24]: x[2:6] #截取字符串love
Out[24]: 'love'
在例2-7中,字符串和索引位置之间的对应关系如下:
字符串 I love risk
索引位置 012345678910
需要注意两点,一是在截取的操作中,截取的子字符串是截止到输入的终止索引值的前一位,二是不输入步长的参数时,默认的步长是1(也就是逐个选取)。
如果仅输入起始索引值但不输入终止索引值,则表示截取从起始索引值一直到字符串末尾的子字符串。
【例2-8】 沿用例2-7的信息,假定用户希望从“I love risk”的字符串中截取“love risk”,具体的代码如下:
In [25]: x[2:] #从第3位开始一直到最后一位
Out[25]: 'love risk'
不输入起始索引值但输入终止索引值,表示截取从字符串的部首一直到终止索引值前一位的子字符串。
【例2-9】 沿用例2-7的信息,假定用户希望从“I love risk”的字符串中截取“I love”,具体的Python代码如下:
In [26]: x[:6]
Out[26]: 'I love'
前面3个例子中演示的是截取步长都是1的情况,接着通过一个例题演示当截取的步长选择大于1的情形。
【例2-10】 假定用户在Python中输入字符串“I love risk management”,并且希望从该字符串中截取从第3位至第9位并且步长为3(也就是跳2格选取)的子字符串,具体的代码如下:
In [27]: x='I love risk management'
In [28]: x[2:9:3] #截取从第3位至第9位并且步长为3的子字符串
Out[28]: 'lei'
特征之四:可替换性。如果用户发现在Python输入字符串中的部分子字符串出现错误,这时用户就可以运用replace函数实现修正和替换,下面就通过一道例题进行演示。
【例 2-11】 假定用户在事后检查中发现,原本希望在Python中输入“I love finance”,但是却误写成了“I love management”,此时运用replace函数进行修改,具体的代码如下:
In [29]: y='I love management' #错误的输入
In [30]: y.replace('management','finance') #进行更正
Out[30]: 'I love finance'
注意,在replace( )中,第一个引号中是输入原有内容,第二个引号中是输入修正后的内容。
在前面讲解Python数据类型的基础上,本节将进入对数据结构的介绍。到目前为止,Python共包括元组、列表、集合、字典、数组和数据框这6种数据结构,具体见表2-1。
表2-1 不同数据结构的对比
数据结构类型 |
简介和特征 |
特征性标识 |
金融领域运用 |
---|---|---|---|
元组 |
一种高级的数据结构,可索引,但不可修改 |
用小括号 ( ) 标识 |
较少运用 |
列表 |
与元组类似,除了可索引以外,更重要的是可以修改,能够理解为元组的升级版,而元组则是稳定版的列表 |
用中括号[ ]标识 |
经常运用 |
集合 |
类似于数学的集合,每个集合中的元素具有无序性、不重复性的特征 |
用大括号{ }标识 |
很少运用 |
字典 |
与日常生活中的字典用法很类似,通过“名称(键key)→内容(值value)”来构建 |
用大括号{ }标识 |
较少运用 |
数组 |
科学计算和代数运算常用的数据类型,类似于线性代数的向量和矩阵 |
用array、小括号、中括号共同标识 |
经常运用 |
数据框 |
数据分析处理常用的数据类型,带有索引(index)和列名(column),类似于Excel的工作表 |
用DataFrame、小括号、中括号共同标识 |
经常运用 |
注:关于数组、数据框的内容将分别在第3章讨论NumPy模块、第4章讨论Pandas模块时详细阐述。
虽然,元组(tuple)是一种高级的数据结构,但在金融领域的Python运用中仍然是十分有限的,创建方式比较简单,具体如下:
变量 = (元素1, 元素2, 元素3, …)
【例2-12】 在Python中,创建一个空元组,具体的代码如下:
In [31]: tup1=( )
In [32]: type(tup1)
Out[32]: tuple
需要注意的是,如果元组中只包含一个元素时,需要在该元素后面添加一个逗号,否则就无法构成一个元组。
【例2-13】 在Python中,创建一个仅包含一个元素3的元组,具体的代码如下:
In [33]: tup2=(3,) #在元素后面加一个逗号
In [34]: type(tup2)
Out[34]: tuple
In [35]: tup3=(3) #没有在元素后面加一个逗号
In [36]: type(tup3)
Out[36]: int
【例 2-14】 在Python中创建一个元组,该元组包含的元素包括finance、风险管理、2019、8.88,相关的代码如下:
In [37]: tup4=('finance', '风险管理', 2019, 8.88)
In [38]: type(tup4)
Out[38]: tuple
元组一旦创建以后,元组中的元素是不可修改的,只能进行访问。访问的方式与前面介绍的字符串索引是非常类似的。
【例 2-15】 沿用例2-14中的信息,分别访问元组的第1个元素、最后一个元素以及同时访问第2个和第3个元素,相关的代码如下:
In [39]: tup4[0] #访问元组的第一个元素
Out[39]: 'finance'
In [40]: tup4[-1] #访问元组最后一个元素
Out[40]: 8.88
In [41]: tup4[1:3] #访问元组第2个至第3个元素
Out[41]: ('风险管理', 2019)
列表(list)可以说是金融领域运用最常见的Python数据结构之一,因此,需要用一定的篇幅进行讨论。列表的创建方式与元组是比较相似的,只不过是运用中括号,具体如下:
变量 = [元素1, 元素2, 元素3, …]
表2-2就梳理了元组与列表之间的不同点和相同点。
表2-2 列表与元组之间的异同
不同点 | 相同点 | |
---|---|---|
元组 | 每个元素都是不可修改的,用小括号标识 | 1.可以容纳Python的任何对象 2.元素是有序的,即每个元素都有一个索引值 |
列表 | 每个元素是可修改的,用中括号标识 |
【例2-16】 在Python中创建一个空列表,相关的代码如下:
In [42]: list1=[ ]
In [43]: type(list1)
Out[43]: list
【例2-17】 在Python中创建一个列表,该列表包含的元素包括finance、risk management、金融风险管理、2020、8.88,具体的代码如下:
In [44]: list2=['finance', 'risk management','金融风险管理', 2020, 88.8]
In [45]: type(list2)
Out[45]: list
访问列表与访问元组的方式是类似的。
【例2-18】 对例2-17中创建的列表进行访问,分别访问该列表中的第一个元素、最后一个元素以及从第3个至第4个元素,相关的代码如下:
In [46]: list2[0]
Out[46]: 'finance'
In [47]: list2[-1]
Out[47]: 88.8
In [48]: list2[2:4]
Out[48]: ['金融风险管理', 2020]
【例 2-19】 对例2-17中创建的列表中,得到元素2020在列表中的索引值,需要运用index函数,具体的代码如下:
In [49]: list2.index(2020)
Out[49]: 3
注意,前面已经多次提到过,因为0代表的是第1个元素,所以索引值等于3代表的是第4个元素。
对于已有列表,在新增元素时可以运用append函数,并且新元素是添加到列表的结尾。
【例2-20】 在例2-16创建的空列表中添加新的元素,新的元素是2018年1月15日至19日这一个交易周沪深300指数(本书第8章的8.1节将介绍主要的股票指数)每日的涨跌幅,分别是−0.54%、0.77%、0.24%、0.87%以及0.38%,具体的代码如下:
In [50]: list1.append(-0.0054)
In [51]: list1.append(0.0077)
In [52]: list1.append(0.0024)
In [53]: list1.append(0.0087)
In [54]: list1.append(0.0038)
In [55]: list1
Out[55]: [-0.0054, 0.0077, 0.0024, 0.0087, 0.0038]
对列表中元素的删除分为两类:第一类是删除指定的元素,运用remove函数;第二类是删除列表中全部的元素,也就是清空列表,需要运用clear函数。
【例2-21】 对例2-20的列表list1,删除列表中第3个元素0.0024,具体的代码如下:
In [56]: list1.remove(0.0024)
In [57]: list1
Out[57]: [-0.0054, 0.0077, 0.0087, 0.0038]
需要注意的是,如果在一个列表中有多个相同值的元素x,则remove(x)是删除列表中值为x的第1个元素,而非全部x的元素。
【例2-22】 针对包括2、4、6、8、10、2、4、2元素的列表,删除列表中数值是2的第1个元素,具体的代码如下:
In [58]: list3=[2,4,6,8,10,2,4,2]
In [59]: list3.remove(2) #删除列表中值为2的第1个元素
In [60]: list3
Out[60]: [4, 6, 8, 10, 2, 4, 2]
【例2-23】 对例2-22中的列表list3,将列表中的全部元素进行清空处理,返回一个空列表,具体的代码如下:
In [61]: list3.clear()
In [62]: list3
Out[62]: []
针对列表的指定位置插入元素,就需要运用insert函数,该函数需要输入两个参数:第1个参数是位置参数,相当于索引值;第2个参数就是需要插入的元素值。
【例2-24】 针对例2-21中的列表list1,在列表第3个元素的位置重新插入元素0.0024,具体的代码如下:
In [63]: list1.insert(2,0.0024)
In [64]: list1
Out[64]: [-0.0054, 0.0077, 0.0024, 0.0087, 0.0038]
证券交易所每个交易日都会公布股票的涨跌幅排行榜,投资者会定期对过往投资的单只证券和投资组合的盈亏情况进行分析,因此就涉及排序的问题。针对数字的排序,分为由小到大、由大到小这两种排序方式,其中,由小到大排序需要运用sort函数,由大到小排序则运用reverse函数。
【例2-25】 针对例2-24的列表list1,分别按照由小到大、由大到小进行排序,具体操的代码如下:
In [65]: list1.sort() #由小到大排序
In [66]: list1
Out[66]: [-0.0054, 0.0024, 0.0038, 0.0077, 0.0087]
In [67]: list1.reverse() #由大到小排序
In [68]: list1
Out[68]: [0.0087, 0.0077, 0.0038, 0.0024, -0.0054]
比如,在一个证券投资组合中,往往会出现某只证券被反复交易(买入、卖出),就需要计算该证券的交易次数。同样,在一个列表中,假定某一个元素多次出现,就需要计算该元素出现的次数,需要用到count函数。
【例 2-26】 假定有一个列表[1,2,3,1,5,1,6,2,9,1,2,7],需要计算该列表中,数字1和2出现的次数,具体的代码如下:
In [69]: list4=[1,2,3,1,5,1,6,2,9,1,2,7]
In [70]: list4.count(1) #计算列表中数字1出现的次数
Out[70]: 4
In [71]: list4.count(2) #计算列表中数字2出现的次数
Out[71]: 3
假定将发行A股的上市公司看成是一个集合,将发行H股的上市公司(即在香港证券交易所上市)看成是另一个集合,这两个集合的交集就是既发行A股又发行H股的上市公司,并集则是发行A股或发行H股的上市公司,差集就是只发行A股(或者只发行H股)的上市公司。在Python中,集合(set)的概念接近数学上的集合。每个集合中的元素是无序且不重复的,因此就可以通过集合去判断数据的从属关系,有时还可以通过集合把数据结构中重复的元素过滤掉。
集合的创建方式如下:
变量 = {元素1, 元素2, 元素3, …}
但是,需要注意的是,集合不可以被截取,也不能被索引,只能包括并集、差集、交集等集合运算,同时,集合元素可以被添加和删除。
下面,通过构建包括全球主要股指的两个集合来演示具体在Python中的运用。
【例 2-27】 分别创建两个集合,一个集合包含上证综指、深圳成指、恒生指数、日经225指数、道琼斯指数等元素,另一个集合则包含标普500指数、道琼斯指数、沪深300指数、日经225指数、法国CAC40指数、德国DAX指数等元素,具体的代码如下:
In [72]: set1={"上证综指","深圳成指","恒生指数","日经225指数","道琼斯指数"}
In [73]: type(set1)
Out[73]: set
In [74]: set2={"标普500指数","道琼斯指数","沪深300指数","日经225指数","法国CAC40指数",
"德国DAX指数"}
In [75]: type(set2)
Out[75]: set
针对集合求并集时,需要运用到符号“|”,下面来看一个例题。
【例2-28】 针对例2-27中创建的两个集合,求这两个集合的并集,具体的代码如下:
In [76]: set1|set2
Out[76]:
{'上证综指',
'德国DAX指数',
'恒生指数',
'日经225指数',
'标普500指数',
'沪深300指数',
'法国CAC40指数',
'深圳成指',
'道琼斯指数'}
针对集合求交集时,需要运用到符号“&”或者运用intersection函数。
【例2-29】 针对例2-27中创建的两个集合,求这两个集合的交集,具体的代码如下:
In [77]: set1&set2
Out[77]: {'日经225指数', '道琼斯指数'}
In [78]: set1.intersection(set2)
Out[78]: {'日经225指数', '道琼斯指数'}
针对集合求差集时,需要运用到数学中的减号“−”。
【例 2-30】 针对例2-27中创建的两个集合,分别求set1对set2的差集、set2对set1的差集,具体的代码如下:
In [79]: set1-set2 #set1对set2的差集
Out[79]: {'上证综指', '恒生指数', '深圳成指'}
In [80]: set2-set1 #set2对set1的差集
Out[80]: {'德国DAX指数', '标普500指数', '沪深300指数', '法国CAC40指数'}
用户可以在已经创建的集合中添加新的元素,需要运用add函数,并且输出的结果可能会自行排列。
【例2-31】 针对例2-27中创建的集合set1,在集合中增加元素“德国DAX指数”,具体的代码如下:
In [81]: set1.add('德国DAX指数')
In [82]: set1
Out[82]: {'上证综指', '德国DAX指数', '恒生指数', '日经225指数', '深圳成指', '道琼斯指数'}
对集合删除元素时,运用discard,并且输出的结果可能会自行排列。
【例2-32】 针对例2-27中创建的集合set1,删除集合中的元素“日经225指数”,具体的代码如下:
In [83]: set1.discard('日经225指数')
In [84]: set1
Out[84]: {'上证综指', '德国DAX指数', '恒生指数', '深圳成指', '道琼斯指数'}
假定需要将表2-3中的沪深300指数信息输入到Python中,就需要运用到一种名为“字典(dict,英文单词dictionary的前4个字母)”的数据结构。
表2-3 沪深300指数的信息
指数名称 |
证券代码 |
交易日期 |
涨跌幅 |
---|---|---|---|
沪深300 |
000300 |
2019-01-08 |
−0.22% |
字典的形式如下:
变量 = {键1: 值1, 键2: 值2, 键3: 值3, …}
需要注意的是,字典有3个特征:一是字典中的元素必须以键(key)和值(value)的形式成对出现,也就是所谓的键值存储;二是键不可以重复,但是值可以重复;三是键不可修改,但是值可以修改,并且数值可以是任意的数据类型。
字典的创建可以采用两种不同的方式:一是直接法,就是一次输入全部的键与值;二是间接法,也就是先创建一个空字典,然后逐对输入键与值。
【例2-33】 将表2-3中的信息以字典的形式在Python中输入,并且分别运用直接法和间接法进行输入,具体的代码如下:
In [85]: dict1={'指数名称': '沪深300', '证券代码': '000300' ,'交易日期' : '2019-01-08' ,
'涨跌幅' : -0.0022} #直接法创建
In [86]: dict1
Out[86]: {'指数名称': '沪深300', '证券代码': '000300', '交易日期': '2019-01-08', '涨跌幅': -0.0022}
In [87]: type(dict1)
Out[87]: dict
In [88]: dict2={} #间接法创建
In [89]: dict2['指数名称']='沪深300'
...: dict2['证券代码']='000300'
...: dict2['交易日期']='2019-01-08'
...: dict2['涨跌幅']=-0.0022
In [90]: dict2
Out[90]: {'指数名称': '沪深300', '证券代码': '000300', '交易日期': '2019-01-08', '涨跌幅': -0.0022}
In [91]: type(dict2)
Out[91]: dict
通过keys函数访问并输出字典中的全部键,用values函数访问并输出字典中的全部值。
【例2-34】 针对例2-33中创建的字典,访问并输出字典中的全部键和值,具体的代码如下:
In [92]: dict1.keys() #输出全部键
Out[92]: dict_keys(['指数名称', '证券代码', '交易日期', '涨跌幅'])
In [93]: dict1.values() #输出全部值
Out[93]: dict_values(['沪深300', '000300', '2019-01-08', -0.0022])
也可以通过items遍历字典的全部元素,也就是将字典中的每个元素(即每对键与值)组成一个元组并放在列表中输出。
【例2-35】 针对例2-33中创建的字典,遍历字典的全部元素,具体的代码如下:
In [94]: dict1.items()
Out[94]: dict_items([('指数名称', '沪深300'), ('证券代码', '000300'), ('交易日期', '2019-01-08'), ('涨跌幅', -0.0022)])
如果仅仅是查询某个键对应的值,可以直接通过在中括号内输入键码的方式完成。
【例2-36】 针对例2-33中创建的字典,查找并输出涨跌幅对应的具体金额,具体的代码如下:
In [95]: dict1['涨跌幅'] #注意是用中括号
Out[95]: -0.0022
【例 2-37】 针对例2-33中创建的字典,用户希望将字典中的“交易日期”对应的“2019-01-08”修改为“2019-01-07”,涨跌幅对应的−0.22%相应调整为0.61%,具体的代码如下:
In [96]: dict1['交易日期']='2019-01-07'
...: dict1['涨跌幅']=0.0061
In [97]: dict1
Out[97]: {'指数名称': '沪深300', '证券代码': '000300', '交易日期': '2019-01-07', '涨跌幅': 0.0061}
如果在已经创建的字典中,新增加键与值,可以运用update函数。
【例 2-38】 针对例2-33中创建的字典,增加当日的收盘价3054.3以及成交额1057.04亿元的信息,具体的代码如下:
In [98]: dict1.update({'收盘价':3054.3,'成交额(亿元)':1057.04}) #注意外面是小括号、里面是大括号
In [99]: dict1
Out[99]:
{'指数名称': '沪深300',
'证券代码': '000300',
'交易日期': '2019-01-07',
'涨跌幅': 0.0061,
'收盘价': 3054.3,
'成交额(亿元)': 1057.04}
如果在已经创建的字典中,删除相应的键与值,需要运用del命令。
【例2-39】 针对例2-33中创建的字典,用户希望将字典中的证券代码删除,具体的代码如下:
In [100]: del dict1['证券代码']
In [101]: dict1
Out[101]:
{'指数名称': '沪深300',
'交易日期': '2019-01-07',
'涨跌幅': 0.0061,
'收盘价': 3054.3,
'成交额(亿元)': 1057.04}
本节进入到Python具体的运算环节。既然是运算就需要有相应的运算符号,具体包括算术运算、关系运算、赋值运算、逻辑运算,这些运算在金融领域都是经常使用的。
从最简单的“加、减、乘、幂、除、模、整除”等基础的算术运算说起,这些也是金融领域最基本的运算。表2-4介绍了在Python中相应的算术运算符号。
表2-4 Python中的算术运算符号
运算符号 | 描述 | 示例 | 在金融领域的运用情况 |
---|---|---|---|
+ | 加法 | 1+1→2 | 经常使用 |
− | 减法 | 1−1→0 | |
* | 乘法 | 1*2→2 | |
/ | 除法 | 1/2→0.5 | |
** | 幂运算 | 2**3→8 | |
% | 模运算 (取余数) |
5%2→1 | 较少使用 |
// | 整除 (商的整数部分) |
9//4→2 |
需要注意的是,在“加法、减法、乘法以及幂运算”中,存在以下3个规律:一是整型与整型之间的运算,得到的结果是整型;二是整型与浮点型之间的运算,得到的结果是浮点型;三是浮点型与浮点型之间的运算,得到的结果是浮点型。
【例2-40】 在Python中输入整型和浮点型,并且进行相应的加法运算,具体的代码如下:
In [102]: a=2 #整型
In [103]: b=5 #整型
In [104]: c=1. #浮点型
In [105]: d=3.8 #浮点型
In [106]: e=6.95 #浮点型
In [107]: a+b #整型与整型相加
Out[107]: 7
In [108]: a+c #整型与浮点型相加
Out[108]: 3.0
In [109]: d+e #浮点型与浮点型相加
Out[109]: 10.75
【例2-41】 对例2-40中输入的整型和浮点型,进行相应的减法运算,具体的代码如下:
In [110]: a-b #整型与整型相减
Out[110]: -3
In [111]: a-c #整型与浮点型相减
Out[111]: 1.0
In [112]: a-e #整型与浮点型相减
Out[112]: -4.95
In [113]: d-e #浮点型与浮点型相减
Out[113]: -3.1500000000000004
注意,输出−3.1500000000000004的结果是因为浮点型在计算机内存中是以二进制形式表示的,通常这不会影响计算。
此外,如果控制计算结果的小数点以后的位数,可以运用round函数,其中,round函数中的第一个参数代表了需要输出的结果,第二个参数代表输出结果的小数位数。
【例2-42】 针对例2-41中,d-e输出结果需要保留小数点后2位,具体的代码如下:
In [114]: round(d-e,2) #保留小数点2位
Out[114]: -3.15
【例2-43】 对例2-40中输入的整型和浮点型,进行相应的乘法运算,具体的代码如下:
In [115]: a*b #整型与整型相乘
Out[115]: 10
In [116]: a*c #整型与浮点型相乘
Out[116]: 2.0
In [117]: d*e #浮点型与浮点型相乘
Out[117]: 26.41
【例2-44】 对例2-40中输入的整型和浮点型,进行相应的幂运算,具体的代码如下:
In [118]: a**b #整型与整型的幂运算
Out[118]: 32
In [119]: b**a #整型与整型的幂运算
Out[119]: 25
In [120]: a**c #整型与浮点型的幂运算
Out[120]: 2.0
In [121]: d**e #浮点型与浮点型的幂运算
Out[121]: 10702.765165970346
注意,对于除法而言,得到的结果始终是浮点型。
【例2-45】 对例2-40中输入的整型和浮点型,进行相应的除法运算,具体的代码如下:
In [122]: f=4
In [123]: f/a #整型与整型相除
Out[123]: 2.0
In [124]: b/a #整型与整型相除
Out[124]: 2.5
In [125]: a/c #整型与浮点型相除
Out[125]: 2.0
In [126]: e/d #浮点型与浮点型相除
Out[126]: 1.8289473684210527
请注意,在Python 2.X版本中,整型除以整型,只能得出整型,如果要得到有小数的结果,需要把其中一个数改成浮点型。
所谓的模运算就是计算余数,并且在Python中是用%符号表示,因此对于百分比的输入切记要转化为具有小数位的浮点型进行输入,否则就会失之毫厘,谬以千里。
【例2-46】 对例2-40、例2-45中输入的整型和浮点型,进行相应的模运算,具体的代码如下:
In [127]: f%a
Out[127]: 0
In [128]: b%a
Out[128]: 1
In [129]: d%a
Out[129]: 1.7999999999999998
In [130]: d%e
Out[130]: 3.8
In [131]: e%d
Out[131]: 3.1500000000000004
整除就是只输出商的整数部分,并且是向下取整(或着是在数轴上向左取整)之后的结果。同时需要注意,如果除数和被除数均是整型,输出的结果就是整型;如果除数和被除数只要有一个是浮点型,输出的结果是浮点型的整数。
【例 2-47】 对例2-40中输入的整型和浮点型,进行相应的整除运算,具体的代码如下:
In [132]: b//a #均是整型
Out[132]: 2
In [133]: b//d #一个整型一个浮点型
Out[133]: 1.0
In [134]: e//a #一个整型一个浮点型
Out[134]: 3.0
In [135]: e//d #均是浮点型
Out[135]: 1.0
在基金投资中,基金经理需要根据基金投资者的风险偏好和投资策略配置相应的证券资产,比如要求基金配置的股票必须是主板上市公司、不能是产能过剩的行业、股价波动率低于30%、上市公司股息分配率超过3%等投资的限制性条件,这就涉及数学中的关系运算,具体包括了等于、不等于、大于、大于等于、小于、小于等于这六大类,也是金融领域最主要的关系运算,在Python的关系运算符号如表2-5所示。
表2-5 Python中的关系运算符号
运算符 | 描述 | Python的示例 | 在金融领域的运用情况 |
---|---|---|---|
== | 相等 | In [136]: 2==2 Out[136]: True In [137]: 2==3 Out[137]: False |
经常使用 |
!= | 不等于 | In [138]: 2!=3 Out[138]: True In [139]: 2!=2 Out[139]: False |
|
> | 大于 | In [140]: 2>1 Out[140]: True In [141]: 2>3 Out[141]: False |
|
>= | 大于等于 | In [142]: 2>=1 Out[142]: True In [143]: 2>=3 Out[143]: False |
|
< | 小于 | In [144]: 2<3 Out[144]: True In [145]: 2<1 Out[145]: False |
|
<= | 小于等于 | In [146]: 2<=3 Out[146]: True In [147]: 2<=1 Out[147]: False |
需要注意的是,数学中的等于号,在Python中是用双等号“==”表示,而单等号“=”则是赋值符号(在2.1节已经介绍),切记这两个符号不能混淆。同时,表2-5中的输出结果True和False就是布尔值(bool)。
在前面2.1节就介绍了Python最基础的赋值方法,也就是基本赋值运算符号“=”。此外,Python中还有将不同的算数运算符号与基本赋值运算符号结合在一起而形成的高级赋值运算符号,具体见表2-6。
表2-6 Python中的赋值运算符号
运算符 | 描述 | 举例 | Python的示例 | 在金融领域的运用情况 |
---|---|---|---|---|
+= | 加法赋值运算符,等价于 y = y + x 注:相当于对等式左边的变量y进行新的赋值(下同) |
y+=x | In [148]: x1=3 In [149]: y1=10 In [150]: y1+=x1 In [151]: y1 Out[151]: 13 |
经常使用 |
−= | 减法赋值运算符,等价于 y = y − x |
y−=x | In [152]: x2=5 In [153]: y2=12 In [154]: y2-=x2 In [155]: y2 Out[155]: 7 |
|
*= | 乘法赋值运算符,等价于 y = y * x |
y*=x | In [156]: x3=4 In [157]: y3=6 In [158]: y3*=x3 In [159]: y3 Out[159]: 24 |
有时使用 |
/= | 除法赋值运算符,等价于 y = y / x |
y/=x | In [160]: x4=8 In [161]: y4=16 In [162]: y4/=x4 In [163]: y4 Out[163]: 2.0 |
|
**= | 幂赋值运算符,等价于 y=y**x |
y**=x | In [164]: x5=3 In [165]: y5=5 In [166]: y5**=x5 In [167]: y5 Out[167]: 125 |
|
%= | 模赋值运算符,等价于 y = y%x |
y%=x | In [168]: x6=4 In [169]: y6=9 In [170]: y6%=x6 In [171]: y6 Out[171]: 1 |
较少使用 |
//= | 整除赋值运算符,等价于 y = y//x |
y//=x | In [172]: y7=10 In [173]: x7=4 In [174]: y7//=x7 In [175]: y7 Out[175]: 2 |
假定需要从沪深300指数中找出10只符合一定投资标准(比如市值、市盈率、换手率等)的股票,并且运用Python编写相应的程序,就会运用成员运算符号,并且往往需要结合循环语句、假设语句进行使用。Python的成员运算符号,可以判断一个元素是否在某一个列表中,可以判断一个字符是否属于某个字符串。表2-7就归纳了相应的成员运算符号。
表2-7 Python中的成员运算符号
成员运算符 |
具体描述 |
---|---|
in |
如果一个变量在指定的另一个变量(列表、元组、字符串等)中找到相应的值,则返回True,否则返回False |
not in |
如果一个变量在指定的另一个变量中没有找到相应的值,返回True,否则返回False |
下面通过数字和字符串两个例子演示在Python中成员运算符号的运用。
【例2-48】 在Python中考察相应的数字是否在一个列表中,相关的代码如下:
In [176]: a=1
In [177]: b=3
In [178]: c=[1,2,4,8,16]
In [179]: a in c
Out[179]: True
In [180]: b in c
Out[180]: False
【例2-49】 在Python中考察相应的字符串是否在一个列表中,相关的代码如下:
In [181]: d='金融'
In [182]: e='风险管理'
In [183]: f=['finance','风险管理','波动率']
In [184]: d in f
Out[184]: False
In [185]: e in f
Out[185]: True
Python内置函数就是指直接调用而无须导入(import),是Python自带的函数,任何时候都可以被直接使用。Python的内置函数有许多,可以运用命令dir(__builtins__)查看,具体的代码输入和输出结果如下:
In [186]: dir(__builtins__)
Out[186]: ['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException', 'BlockingIOError', 'BrokenPipeError', 'BufferError', 'BytesWarning', 'ChildProcessError', 'ConnectionAbortedError', 'ConnectionError', 'ConnectionRefusedError', 'ConnectionResetError', 'DeprecationWarning', 'EOFError', 'Ellipsis', 'EnvironmentError', 'Exception', 'False', 'FileExistsError', 'FileNotFoundError', 'FloatingPointError', 'FutureWarning', 'GeneratorExit', 'IOError', 'ImportError', 'ImportWarning', 'IndentationError', 'IndexError', 'InterruptedError', 'IsADirectoryError', 'KeyError', 'KeyboardInterrupt', 'LookupError', 'MemoryError', 'ModuleNotFoundError', 'NameError', 'None', 'NotADirectoryError', 'NotImplemented', 'NotImplementedError', 'OSError', 'OverflowError', 'PendingDeprecationWarning', 'PermissionError', 'ProcessLookupError', 'RecursionError', 'ReferenceError', 'ResourceWarning', 'RuntimeError',
'RuntimeWarning', 'StopAsyncIteration', 'StopIteration', 'SyntaxError', 'SyntaxWarning', 'SystemError', 'SystemExit', 'TabError', 'TimeoutError', 'True', 'TypeError', 'UnboundLocalError', 'UnicodeDecodeError', 'UnicodeEncodeError', 'UnicodeError', 'UnicodeTranslateError', 'UnicodeWarning', 'UserWarning', 'ValueError', 'Warning', 'WindowsError', 'ZeroDivisionError', '__IPYTHON__', '__build_class__', '__debug__', '__doc__', '__import__', '__loader__', '__name__',
'__package__', '__spec__', 'abs', 'all', 'any', 'ascii', 'bin', 'bool', 'breakpoint', 'bytearray', 'bytes', 'callable', 'chr', 'classmethod', 'compile', 'complex', 'copyright', 'credits', 'debugfile', 'delattr', 'dict', 'dir', 'display', 'divmod', 'enumerate', 'eval', 'exec', 'filter', 'float', 'format', 'frozenset', 'get_ipython', 'getattr', 'globals', 'hasattr', 'hash', 'help', 'hex', 'id', 'input', 'int', 'isinstance', 'issubclass', 'iter', 'len', 'license', 'list', 'locals', 'map', 'max', 'memoryview', 'min', 'next', 'object', 'oct', 'open', 'ord', 'pow', 'print', 'property', 'range', 'repr', 'reversed', 'round', 'runfile', 'set', 'setattr', 'slice', 'sorted', 'staticmethod', 'str', 'sum', 'super', 'tuple', 'type', 'vars', 'zip']
Python的内置函数从abs开始一直到zip结束,共计75个。表2-8就梳理了在金融领域中,经常用到的Python内置函数。
表2-8 金融领域中常用的Python内置函数
函数名称 |
功能 |
Python代码示例 |
---|---|---|
abs |
求绝对值 |
|
enumerate |
将对象(如列表、元组或字符串)组合为一个带有索引的序列,一般用于for循环中 |
|
float |
数字或字符串转换为浮点型 |
整型转化为浮点型的举例 |
int |
数字或字符串转换为整型 |
浮点型转为整型的举例 |
len |
输出对象(包括字符串、列表、元组等)长度或元素个数,len是长度英文单词length的缩写 |
输出字符串长度的举例 |
max |
求最大值 |
以输出2018年1月15日至1月19日沪深300指数每日涨跌幅的最大值作为举例 |
min |
求最小值 |
以输出2018年1月15日至1月19日沪深300指数每日涨跌幅的最小值作为举例 |
pow |
幂函数 |
pow(x,y)是输出xy(x的y次方)的值 |
|
输出字符串和变量等 |
|
range |
输出一个整数数列,一般用于for循环中 |
函数语法结构:range(x, y, z) |
reversed |
输出一个逆序排列的序列(包括数列、元组、字符串等) |
|
sorted |
输出一个顺序排列的序列(包括数列、元组、字符串等) |
|
sum |
求和 |
|
zip |
将对象中对应的元素打包成一个个元组,并返回由这些元组组成的列表 |
|
针对上面没有具体介绍的Python内置函数,如果大家感兴趣,可以运用help函数查询各种函数的具体用法,help函数的运用非常简单,输入的格式就是help()的括号内输入需要查询的函数。下面,以查询函数bin的用法作为例子进行演示,具体的代码如下:
In [223]: help(bin)
Help on built-in function bin in module builtins:
bin(number, /)
Return the binary representation of an integer.
>>> bin(2796202)
'0b1010101010101010101010'
以上的这些函数显然是无法满足金融分析和风险管理的需要,就需要用户使用Python自定义的函数,定义函数有两种方式,一种是用def语法构建新的函数,另一种是直接运用lambda函数构建新的函数,下面就依次进行讨论。
运用def语法时,函数的基本框架如下:
def 函数名(参数):
'''函数说明文档'''
函数主体
return 返回对象
注意,函数说明文档可以选择不写。此外,要注意缩进,具体就是在输入函数主体以及return的前面要缩进,在Python中缩进是运用Tab键来完成,但是在IPython中会自动进行缩进。
下面通过def语法定义计算平均收益率的函数作为举例。需要注意的是,平均收益率分为算术平均收益率和几何平均收益率,首先定义计算算术平均收益率的函数,而针对计算几何平均收益率的函数,放在后面结合for语法进行介绍。
算术平均收益率的表达式如下:
(2-1)
其中,表示算术平均收益率,表示第个观察到的收益率,是1~的自然数。
【例2-50】 通过Python自定义一个计算算术平均收益率的函数,具体的代码如下:
In [224]: def mean_a(r):
...: ''' 定义一个求解算术平均收益率的函数
...: r:代表收益率的一个列表。'''
...: total=sum(r)
...: return total/len(r)
这样就把计算算术平均收益率的函数mean_a在Python中做了定义。
【例2-51】 运用在例2-50中自定义的函数mean_a求解2018年1月15日至1月19日沪深300指数每日涨跌幅(收益率)的算数平均值,具体的代码如下:
In [225]: list1=[-0.0054, 0.0077, 0.0024, 0.0087, 0.0038]
In [226]: mean_a(r=list1)
Out[226]: 0.00344
通过以上的计算得到算术平均收益率是0.344%。此外,可以通过另一种方法验算该结果是否正确。
In [227]: sum(list1)/5
Out[227]: 0.00344
显然,两种不同的方法计算的结果都是完全一致的。
lambda函数在Python中被称为是匿名函数,具体的函数基本格式如下:
函数名 = lambda参数:表达式
运用lambda定义函数时,撰写的代码通常是控制在一行以内,因此可以用lambda写相对简单的函数,或者是复杂函数的一个组成部分。
【例2-52】 用lambda定义计算算术平均收益率的函数,并且依然用新定义的函数求解2018年1月15日至1月19日沪深300指数每日涨跌幅的算数平均值,具体的代码如下:
In [228]: mean_A=lambda r: sum(r)/len(r) #用lambda定义函数
In [229]: mean_A(r=list1)
Out[229]: 0.00344
显然,计算的结果与用def所定义函数的计算结果是完全一样的。
在Python中,编程的语句分为条件语句和循环语句两大类,可以单独运用,也可以结合使用。
条件语句是通过一条或多条语句的执行结果(True或者False)来决定执行的代码块。条件语句的基本语法框架分为以下三大类型。
第1种类型是只有一个判断条件,基本的语法框架如下:
if 判断语句:
执行语句1
else:
执行语句2
第2种类型是有两个判断条件,基本的语法框架如下:
if 判断语句1:
执行语句1
elif 判断语句2:
执行语句2
else:
执行语句3
第3种类型是有3个或者3个以上的判断条件,基本的语法框架如下:
if 判断语句1:
执行语句1
elif 判断语句2:
执行语句2
elif 判断语句3:
执行语句3
…
elif 判断语句n:
执行语句n
else:
执行语句n+1
需要注意的是,在执行语句前面需要缩进,缩进依然是运用Tab键,并且在IPython中会自动进行缩进。
【例 2-53】 2019年1月4日,沪深300指数当天收盘上涨了2.4%,需要通过Python的条件语句并设定一个判断条件,用于判断是正收益还是非正收益,具体的代码如下:
In [230]: r1=0.024
In [231]: if r1>0:
...: print('正收益:', r1)
...: else:
...: print('非正收益:', r1)
正收益: 0.024
【例2-54】 2019年1月14日,沪深300指数当天收盘下跌了0.74%,需要设定两个判断条件,用于区分是正收益、零收益或负收益,具体的代码如下:
In [232]: r2=-0.0074
In [233]: if r2>0:
...: print('正收益:', r2)
...: elif r2==0:
...: print('零收益:', r2)
...: else:
...: print('负收益:', r2)
负收益: -0.0074
在Python中,循环语句包括了for循环和while循环,但是在金融领域中,常用的是for循环。
for循环可以遍历各种序列的项目,如一个列表或者字符串。for循环的语法结构如下:
for 迭代变量(iterating_var)in序列(比如列表、字符串等):
陈述(statements)
注意,在陈述前面需要缩进,并且缩进依然是运用Tab键,在IPython中会自动缩进。
下面,通过讨论几何平均收益率演示for循环。几何平均收益率的表达式如下:
(2-2)
其中,表示几何平均收益率,依然表示第个观察到的收益率,也是1~的自然数。
【例2-55】 通过Python定义一个计算几何平均收益率的函数,具体的代码如下:
In [234]: def mean_g(r):
...: '''定义一个计算几何平均收益率的函数
...: r:代表收益率的一个列表'''
...: total=1
...: for i in r:
...: total=total*(1+i)
...: return pow(total,1/len(r))-1
【例2-56】 运用在例2-55中定义的函数mean_g计算2018年1月15日至1月19日沪深300指数每日涨跌幅(收益率)的几何平均值,代码如下:
In [235]: mean_g(list1)
Out[235]: 0.0034274943754675213
通过以上的计算得到几何平均收益率是0.343%,显然比例2-51的算数平均收益率0.344%要略小一些。
while语句是用于循环执行程序,具体就是在某条件下,循环执行某段程序,以处理需要重复处理的相同任务。基本的语法结构如下:
while判断条件:
执行语句
注意,在执行语句前面需要缩进,并且缩进依然是运用Tab键,在IPython中会自动缩进。
【例2-57】 假定需要依次输出0~10的数字,并且运用while语句编写,具体的代码如下:
In [236]: n=0
In [237]: while n<=10:
...: print('输出数字是:', n)
...: n+=1
...: print('完')
输出数字是: 0
输出数字是: 1
输出数字是: 2
输出数字是: 3
输出数字是: 4
输出数字是: 5
输出数字是: 6
输出数字是: 7
输出数字是: 8
输出数字是: 9
输出数字是: 10
完
【例 2-58】 在Python中,可以通过range函数生成整数数列,同时,也可以通过while语句生成同样的整数数列。通过while语句生成0~9的整数数列,具体的代码如下:
In [238]: n=0
In [239]: list1=[]
In [240]: while n<10:
...: list1.append(n)
...: n+=1
...: print(list1)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
在Python中,循环控制语句包括了break、continue和pass,表2-9列出了循环控制语句的名称以及相关的功能。
表2-9 Python的循环控制语句名称与功能
循环控制语句名称 |
具体功能 |
---|---|
break |
终止当前循环,且跳出整个循环 |
continue |
终止当次循环,跳出该次循环,直接执行下一次循环 |
pass |
不执行任何操作,一般用于占据一个位置 |
通常而言,循环控制语句是嵌入在条件语句和循环语句相结合的代码撰写中。下面就通过一道例题具体演示如何将条件语句、循环语句进行结合使用。
【例2-59】 2019年1月2日至1月18日,沪深300指数的每日涨跌幅如下:−1.37%、−0.16%、2.4%、0.61%、−0.22%、1.01%、−0.19%、0.72%、−0.87%、1.96%、0.02%、−0.55%、1.82%。对此,分别完成若干个编程任务。
任务 1:在依次访问以上这些涨跌幅数据时,一旦访问到涨幅大于2%时,就终止整个程序,并且输出已经访问的数据。就需要运用到for、if和break搭配的语句,具体的代码如下:
In [241]: r_list=[-0.0137, -0.0016, 0.024, 0.0061, -0.0022, 0.0101, -0.0019, 0.0072, -0.0087, 0.0196, 0.0002, -0.0055, 0.0182]
In [242]: for i in r_list:
...: if i>0.02:
...: break
...: print('收益率数据:',i)
收益率数据: -0.0137
收益率数据: -0.0016
任务 2:在依次访问以上这些涨跌幅数据时,一旦访问到涨跌幅为负数时,就跳过这些负数的数据,并且输出全部非负数的数据。这时,可以有两种不同的代码:
第1种:运用到for、if和continue搭配的语句结构,具体的代码如下:
In [243]: for i in r_list:
...: if i<0:
...: continue
...: print('非负收益率数据:', i)
非负收益率数据: 0.024
非负收益率数据: 0.0061
非负收益率数据: 0.0101
非负收益率数据: 0.0072
非负收益率数据: 0.0196
非负收益率数据: 0.0002
非负收益率数据: 0.0182
第2种:运用到for、if、pass和else搭配的语句结构,具体的代码如下:
In [244]: for i in r_list:
...: if i<0:
...: pass #涨跌幅为负数时,不执行任何操作
...: else:
...: print('非负收益率数据:', i)
非负收益率数据: 0.024
非负收益率数据: 0.0061
非负收益率数据: 0.0101
非负收益率数据: 0.0072
非负收益率数据: 0.0196
非负收益率数据: 0.0002
非负收益率数据: 0.0182
任务 3:在依次访问以上这些涨跌幅数据时,按照以下3类标准:(1)涨跌幅超过1%;(2)跌幅超过−1%;(3)涨跌幅处于−1%~1%区间,将相应的数据找出来并且以数列的方式输出。就需要运用for、if、elif和else搭配的语句结构,以下是具体的代码:
In [245]: r3=[] #存放涨幅超过1%的数据列表
...: r4=[] #存放跌幅超过-1%的数据列表
...: r5=[] #存放涨跌幅处于-1%至1%区间的数据列表
In [246]: for i in r_list:
...: if i>0.01:
...: r3.append(i)
...: elif i<-0.01:
...: r4.append(i)
...: else:
...: r5.append(i)
In [247]: print('涨幅超过1%的数据列表:', r3)
...: print('跌幅超过-1%的数据列表:', r4)
...: print('涨跌幅处于[-1%,1%]区间的数据列表:', r5)
涨幅超过1%的数据列表: [0.024, 0.0101, 0.0196, 0.0182]
跌幅超过-1%的数据列表: [-0.0137]
涨跌幅处于[-1%,1%]区间的数据列表: [-0.0016, 0.0061, -0.0022, -0.0019, 0.0072, -0.0087, 0.0002, -0.0055]
在金融领域,除了加减乘除等基本的数学运算之外,还需要涉及比较复杂的数学运算、统计分析等,这时就需要用到大量的模块[1]。此外,需要注意的是,当安装好Python 之后,有一些模块就已经默认安装了,这些模块称为“标准库”,“标准库”中的模块无须另行安装,就可以直接使用。比如,math模块属于标准库,不用安装就可以直接使用,而其他的模块(非标准库)如NumPy、Pandas、SciPy、Matplotlib等则需要安装。当运用Anoconda时,大量的非标准库也都已经集成安装完成了(可详见1.4节)。
在Python中,模块不能直接使用,在每次启动Python以后如果要使用相关模块,需要导入该模块,对于模块的导入存在若干种方法,具体见表2-10。
表2-10 在Python中导入模块的不同方法
|
Python的代码 |
具体说明与示例 |
---|---|---|
方法1 |
import模块名 |
直接导入整个模块,这种导入方式比较占用内存。具体的示例如下: |
方法2 |
import模块名as名称缩写 |
导入整个模块的同时给该模块取一个别名,往往是用在模块名字比较长的情况下,这样能节省调用该模块时的输入时间。具体的示例如下: |
方法3 |
import模块名.子模块名as名称缩写 |
导入某个模块的子模块,并且给该子模块取一个别名,当然是否取别名是一个可选项,这样占用的内存也比较少。具体的示例如下: |
方法4 |
from 模块名 import 函数 |
从特定模块中导入某个或者某几个函数(不同函数之间用英文逗号隔开,这样不仅占用的内存比较少,而且这些函数可以直接以函数名字的方式使用。具体的示例如下: |
方法5 |
from模块名.子模块名import函数 |
与方法4很相似,只不过是从特定模块的子模块中导入某个或者某几个函数。具体的示例如下: |
针对比较复杂的数学运算,比如求解正弦、余弦以及对数运算等,就会用到Python的数学模块math。依然可以通过dir命令查看math模块包含了哪些函数和数学符号,具体的代码如下:
In [255]: dir(math)
Out[255]: ['__doc__', '__loader__', '__name__', '__package__', '__spec__', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'copysign', 'cos', 'cosh', 'degrees', 'e', 'erf', 'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'gcd', 'hypot', 'inf', 'isclose', 'isfinite', 'isinf', 'isnan', 'ldexp', 'lgamma', 'log', 'log10', 'log1p', 'log2', 'modf', 'nan', 'pi', 'pow', 'radians', 'remainder', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'tau', 'trunc']
从acos开始一直到trunc共计50个函数。表2-11介绍了在math模块中,金融领域常用的数学运算函数和符号。
表2-11 math模块中的函数和符号(函数中的变量统一设为x)
函数或符号 |
用途 |
Python中的演示 |
---|---|---|
ceil |
取大于等于变量x的最小整数值,如果变量x是一个整型,则直接输出x |
|
cos |
求变量x的余弦(cosine),注意x必须是弧度 |
|
e |
表示数学中的一个常量e,它是自然对数的底数,并且是一个无限不循环小数,具体等于2.71828… |
|
exp |
表示变量x的ex运算结果 |
|
fabs |
求变量x的绝对值,等价于是Python中的内置函数abs的用法 |
|
factorial |
求变量x的阶乘的值,也就是 |
|
floor |
求小于等于变量x的最大整数值,如果x是一个整型,则直接输出x |
|
fsum |
求和,等价于Python内置函数的sum |
|
log |
函数形式是log(x,y),表示得到以变量y为底的变量x的对数,也就是logyx;此外,如果不输入y,则输出x的自然对数 |
|
log10 |
求以10为底的变量x的对数 |
|
log2 |
求以2为底的变量x的对数 |
|
pi |
表示圆周率 |
|
pow |
函数的形式pow(x,y),也就是得到x的y次方(即xy),等价于Python的内置函数pow |
|
sin |
求变量x的正弦值,注意x必须是弧度 |
|
sqrt |
求变量x的平方根 |
|
tan |
求变量x的正切值,注意x必须是弧度 |
|
trunc |
取变量x的整数部分 |
|
到现在为止,关于Python的基本操作就讨论完毕了,从第3章开始将进入对Python第三方模块的讨论,主要选取了在金融领域最常用的NumPy、Pandas、Matplotlib、SciPy等模块,并且也同样结合金融进行演示。
本章结合金融对Python的基本操作进行讲解并演示。首先,介绍在Python中如何对金融的变量进行赋值;随后,讨论了包括整型、浮点型、复数以及字符串等4种数据类型;接着,逐一介绍了元组、列表、集合和字典等数据结构;然后,分析了算术运算、关系运算、赋值运算和逻辑运算等运算符号;此后,重点讲解了在金融领域比较常用的Python内置函数,并且也讨论了运用Python方便地定义函数的两种方法;此外,还详细讨论运用循环语句、条件语句以及两者结合的方式进行编程;最后,介绍导入模块的不同方法以及math模块。
[1] 由人民邮电出版社出版的《Python金融大数据分析》,该书是目前讨论Python在金融数据分析领域很有影响力的一本书,内容比较全面,层次比较清晰,同时对Python技术性的内容也涉及较多。
[2] 由人民邮电出版社出版的《Python金融实战》,该书是有一定影响力的讨论Python运用于金融的一本教材,内容深入浅出,主题比较侧重于金融投资。
[1] 模块在Python中扮演非常重要的作用,可以理解为Python的扩展工具。换言之,虽然Python在默认情况下提供了一些可用的东西,但是这些默认情况下提供的还远远无法满足编程的需要,于是就有人专门制作了另外一些工具以弥补Python的不足,这些工具被称之为“模块”。