Python 金融编程第二版(GPT 重译)(一)(3)

简介: Python 金融编程第二版(GPT 重译)(一)

Python 金融编程第二版(GPT 重译)(一)(2)https://developer.aliyun.com/article/1559383


使用云实例

本节展示了如何在 DigitalOcean 云实例上设置一个完整的 Python 基础设施。还有许多其他的云服务提供商,其中包括 亚马逊网络服务(AWS)作为领先的提供商。然而,DigitalOcean 以其简单性和相对较低的价格而闻名,他们称之为 droplet 的较小的云实例。最小的 droplet,通常足够用于探索和开发目的,每月只需 5 美元或每小时 0.007 美元。用户只按小时计费,因此您可以轻松地为 2 小时启动一个 droplet,然后销毁它,仅需收取 0.014 美元。如果您还没有账户,请在这个 注册页面 上注册一个账户,这可以为您提供 10 美元的起始信用额。

本节的目标是在 DigitalOcean 上设置一个 droplet,其中包含 Python 3.6 安装和通常所需的包(例如 NumPypandas),以及一个密码保护和安全套接字层(SSL)加密的 Jupyter Notebook 服务器安装。作为一个基于 Web 的工具套件,Jupyter Notebook 提供了三个主要工具,可以通过常规浏览器使用:

  • Jupyter Notebook:这是目前非常流行的交互式开发环境,具有不同语言内核的选择,如 Python、R 和 Julia。
  • 终端:通过浏览器访问的系统 shell 实现,允许进行所有典型的系统管理任务,但也可以使用诸如 Vimgit 等有用工具。
  • 编辑器:第三个主要工具是一个基于浏览器的文件编辑器,具有许多不同的编程语言和文件类型的语法突出显示以及典型的编辑功能。

在一个 droplet 上安装 Jupyter Notebook 允许通过浏览器进行 Python 开发和部署,避免了通过安全外壳(SSH)访问登录云实例的需求。

为了完成本节的目标,需要一些文件。

  • 服务器设置脚本:这个脚本协调所有必要的步骤,比如将其他文件复制到 droplet 上并在 droplet 上运行它们。
  • Python 和 Jupyter 安装脚本:这个脚本安装 Python、额外的包、Jupyter Notebook 并启动 Jupyter Notebook 服务器。
  • Jupyter Notebook 配置文件:此文件用于配置 Jupyter Notebook 服务器,例如密码保护方面。
  • RSA 公钥和私钥文件:这两个文件用于对 Jupyter Notebook 服务器进行 SSL 加密。

接下来,我们将逆向处理这个文件列表。

RSA 公钥和私钥

为了通过任意浏览器安全连接到 Jupyter Notebook 服务器,需要一个由 RSA 公钥和私钥组成的 SSL 证书(参见RSA 维基百科页面)。一般来说,人们期望这样的证书来自所谓的证书颁发机构(CA)。然而,在本书的目的下,自动生成的证书已经“足够好“了。[⁶] 生成 RSA 密钥对的流行工具是OpenSSL。接下来的简要交互式会话生成了适用于 Jupyter Notebook 服务器的证书。

macbookpro:~/cloud$ openssl req -x509 -nodes -days 365 -newkey \
> rsa:1024 -out cert.pem -keyout cert.key
Generating a 1024 bit RSA private key
..++++++
.......++++++
writing new private key to 'cert.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:DE
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:Voelklingen
Organization Name (eg, company) [Internet Widgits Pty Ltd]:TPQ GmbH
Organizational Unit Name (eg, section) []:Algo Trading
Common Name (e.g. server FQDN or YOUR name) []:Jupyter
Email Address []:team@tpq.io
macbookpro:~/cloud$ ls
cert.key    cert.pem
macbookpro:~/cloud$

两个文件 cert.keycert.pem 需要复制到滴管上,并且需要被 Jupyter Notebook 配置文件引用。下面会介绍这个文件。

Jupyter Notebook 配置文件

可以按照运行 Notebook 服务器页面上的说明安全地部署一个公共 Jupyter Notebook 服务器。其中,Jupyter Notebook 应该受到密码保护。为此,有一个叫做 passwd 的密码哈希生成函数,可在 notebook.auth 子包中使用。下面的代码生成了一个以 jupyter 为密码的密码哈希代码。

macbookpro:~/cloud$ ipython
Python 3.6.1 |Continuum Analytics, Inc.| (default, May 11 2017, 13:04:09)
Type 'copyright', 'credits' or 'license' for more information
IPython 6.1.0 -- An enhanced Interactive Python. Type '?' for help.
In [1]: from notebook.auth import passwd
In [2]: passwd('jupyter')
Out[2]: 'sha1:4c72b4542011:0a8735a18ef2cba12fde3744886e61f76706299b'
In [3]: exit

此哈希代码需要放置在 Jupyter Notebook 配置文件中,如示例 2-3 所示。该代码假定 RSA 密钥文件已复制到了滴管的 /root/.jupyter/ 文件夹中。

示例 2-3. Jupyter Notebook 配置文件
#
# Jupyter Notebook Configuration File
#
# Python for Finance
# (c) Dr. Yves J. Hilpisch
#
# SSL ENCRYPTION
# replace the following file names (and files used) by your choice/files
c.NotebookApp.certfile = u'/root/.jupyter/cert.pem'
c.NotebookApp.keyfile = u'/root/.jupyter/cert.key'
# IP ADDRESS AND PORT
# set ip to '*' to bind on all IP addresses of the cloud instance
c.NotebookApp.ip = '*'
# it is a good idea to set a known, fixed default port for server access
c.NotebookApp.port = 8888
# PASSWORD PROTECTION
# here: 'jupyter' as password
# replace the hash code with the one for your password
c.NotebookApp.password = 'sha1:bb5e01be158a:99465f872e0613a3041ec25b7860175f59847702'
# NO BROWSER OPTION
# prevent Jupyter from trying to open a browser
c.NotebookApp.open_browser = False
注意

将 Jupyter Notebook 部署在云中主要会引发一系列安全问题,因为它是一个通过 Web  浏览器可访问的完整的开发环境。因此,使用 Jupyter Notebook 服务器默认提供的安全措施(如密码保护和 SSL  加密)至关重要。但这只是开始,根据在云实例上具体做了什么,可能建议采取进一步的安全措施。

下一步是确保 Python 和 Jupyter Notebook 在滴管上安装。

Python 和 Jupyter Notebook 的安装脚本

用于安装 Python 和 Jupyter Notebook 的 bash 脚本类似于在“使用 Docker 容器化”一节中介绍的用于在  Docker 容器中通过 Miniconda 安装 Python 的脚本。然而,这里的脚本还需要启动 Jupyter Notebook  服务器。所有主要部分和代码行都在内联注释中。

示例 2-4. 安装 Python 并运行 Jupyter Notebook 服务器的 bash 脚本
#!/bin/bash
#
# Script to Install
# Linux System Tools and Basic Python Components
# as well as to
# Start Jupyter Notebook Server
#
# Python for Finance
# (c) Dr. Yves J. Hilpisch
#
# GENERAL LINUX
apt-get update  # updates the package index cache
apt-get upgrade -y  # updates packages
# install system tools
apt-get install -y bzip2 gcc git htop screen htop vim wget
apt-get upgrade -y bash  # upgrades bash if necessary
apt-get clean  # cleans up the package index cache
# INSTALLING MINICONDA
wget https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh -O Miniconda.sh
bash Miniconda.sh -b  # installs Miniconda
rm -rf Miniconda.sh  # removes the installer
# prepends the new path for current session
export PATH="/root/miniconda3/bin:$PATH"
# prepends the new path in the shell configuration
cat >> ~/.profile <<EOF
export PATH="/root/miniconda3/bin:$PATH"
EOF
# INSTALLING PYTHON LIBRARIES
conda install -y jupyter  # interactive data analytics in the browser
conda install -y pytables  # wrapper for HDF5 binary storage
conda install -y pandas  #  data analysis package
conda install -y pandas-datareader  # retrieval of open data
conda install -y matplotlib  # standard plotting library
conda install -y seaborn  # statistical plotting library
conda install -y quandl  # wrapper for Quandl data API
conda install -y scikit-learn  # machine learning library
conda install -y tensorflow  # deep learning library
conda install -y flask  # light weight web framework
conda install -y openpyxl  # library for Excel interaction
conda install -y pyyaml  # library to manage yaml files
pip install --upgrade pip  # upgrading the package manager
pip install q  # logging and debugging
pip install plotly  # interactive D3.js plots
pip install cufflinks  # combining plotly with pandas
# COPYING FILES AND CREATING DIRECTORIES
mkdir /root/.jupyter
mv /root/jupyter_notebook_config.py /root/.jupyter/
mv /root/cert.* /root/.jupyter
mkdir /root/notebook
cd /root/notebook
# STARTING JUPYTER NOTEBOOK
jupyter notebook --allow-root

此脚本需要复制到滴管上,并且需要由下一小节中描述的编排脚本启动。

管理滴管设置的脚本

设置滴水筹的第二个 bash 脚本是最短的。它主要将所有其他文件复制到滴水筹中,其中预期的是相应的 IP 地址作为参数。在最后一行,它启动install.sh bash 脚本,后者又会进行安装并启动 Jupyter Notebook 服务器。

示例 2-5. 用于设置滴水筹的bash脚本
#!/bin/bash
#
# Setting up a DigitalOcean Droplet
# with Basic Python Stack
# and Jupyter Notebook
#
# Python for Finance
# (c) Dr Yves J Hilpisch
#
# IP ADDRESS FROM PARAMETER
MASTER_IP=$1
# COPYING THE FILES
scp install.sh root@${MASTER_IP}:
scp cert.* jupyter_notebook_config.py root@${MASTER_IP}:
# EXECUTING THE INSTALLATION SCRIPT
ssh root@${MASTER_IP} bash /root/install.sh

现在一切都准备好尝试设置代码。在 DigitalOcean 上,创建一个新的滴水筹,并选择类似于以下选项:

  • 操作系统:Ubuntu 16.04.3 x64(截至 2017 年 11 月 4 日的默认选择)
  • 规模:1 核心,512 MB,20GB SSD(最小的滴水筹)
  • 数据中心区域:法兰克福(因为作者居住在德国)
  • SSH 密钥:添加(新的)SSH 密钥以实现无密码登录 ^(7)
  • 滴水筹名称:您可以选择预先指定的名称,也可以选择像py4fi这样的名称

最后,点击创建按钮启动滴水筹建过程,通常需要约一分钟。进行设置过程的主要结果是 IP 地址,例如,当您选择法兰克福作为数据中心位置时,可能为 46.101.156.199。现在设置滴水筹非常简单:

(py3) macbookpro:~/cloud$ bash setup.sh 46.101.156.199

结果过程可能需要几分钟。当 Jupyter Notebook 服务器出现类似于以下消息时,过程结束:

The Jupyter Notebook is running at: https://[all ip addresses on your system]:8888/

在任何当前浏览器中,访问以下地址即可访问正在运行的 Jupyter Notebook(注意https协议):

https://46.101.156.199:8888

可能需要添加安全例外,然后 Jupyter Notebook 登录屏幕会提示输入密码(在我们的情况下为jupyter)。现在一切准备就绪,可以通过 Jupyter Notebook 在浏览器中开始 Python 开发,通过终端窗口进行IPython或文本文件编辑器。还提供了其他文件管理功能,如文件上传,删除文件或创建文件夹。

小贴士

像 DigitalOcean 和 Jupyter Notebook  这样的云实例是算法交易员的强大组合,可以利用专业的计算和存储基础设施。专业的云和数据中心提供商确保您的(虚拟)机器在物理上安全且高度可用。使用云实例也可以使探索和开发阶段的成本相对较低,因为通常按小时收费,而无需签订长期协议。

结论

Python 是本书选择的编程语言和技术平台。然而,Python 部署可能最多时甚至令人厌烦和心神不宁。幸运的是,今天有一些技术可用 — 都不到五年的时间 — 有助于解决部署问题。开源软件conda有助于 Python 包和虚拟环境的管理。Docker 容器甚至可以进一步扩展,可以在一个技术上受到保护的"沙箱"中轻松创建完整的文件系统和运行时环境。更进一步,像  DigitalOcean 这样的云提供商在几分钟内提供由专业管理和安全的数据中心提供的计算和存储容量,并按小时计费。这与 Python 3.6  安装和安全的 Jupyter Notebook 服务器安装结合在一起,为算法交易项目的 Python 开发和部署提供了专业的环境。

进一步资源

对于Python 包管理,请参考以下资源:

对于虚拟环境管理,请参阅以下资源:

关于Docker 容器的信息请见此处:

  • Docker 首页
  • Matthias、Karl 和 Sean Kane (2015): Docker: Up and Running. O’Reilly, 北京等。

Robbins (2016)提供了对bash 脚本语言的简明介绍和概述。

  • Robbins, Arnold (2016): Bash Pocket Reference. 第 2 版,O’Reilly, 北京等。

如何安全运行公共 Jupyter Notebook 服务器请参阅运行笔记本服务器

要在 DigitalOcean 上注册一个新帐户并获得 10 美元的起始信用,请访问此注册页面。这可以支付最小水滴两个月的使用费。

¹在撰写本文时,Python 3.7beta 刚刚发布。

²在 Windows 上,激活新环境的命令仅为activate py27 — 省略了source

³在官方文档中,您会找到以下解释:“Python '虚拟环境'允许将 Python 包安装在特定应用程序的隔离位置,而不是全局安装。"参见创建虚拟环境页面

⁴ 有关 Docker 技术的全面介绍,请参阅 Matthias 和 Kane (2015) 的书籍。

⁵ 要了解 bash 脚本的简明介绍和快速概述,请参考 Robbins (2016) 的书籍。

⁶ 使用这样一个自行生成的证书时,可能需要在浏览器提示时添加安全异常。

⁷ 如果需要帮助,请访问如何在 DigitalOcean Droplets 上使用 SSH 密钥如何在 DigitalOcean Droplets 上使用 PuTTY(Windows 用户)

第二部分:掌握基础知识

本书的这部分内容涉及 Python 编程的基础知识。本部分涵盖的主题对于随后部分中的所有其他章节都是基础的。

这些章节按照特定主题组织,使读者可以作为参考,查找与感兴趣的主题相关的示例和详细信息:

  • 第三章 关于 Python 的数据类型和数据结构
  • 第四章 关于 NumPy 及其 ndarray
  • 第五章 关于 pandas 及其 DataFrame
  • 第六章 关于使用 Python 的面向对象编程(OOP)

第三章:数据类型和结构

糟糕的程序员担心代码。优秀的程序员担心数据结构及其关系。

Linus Torvalds

介绍

本章介绍了Python的基本数据类型和数据结构。尽管Python解释器本身已经带来了丰富多样的数据结构,但NumPy和其他库在其中增添了宝贵的内容。

本章组织如下:

“基本数据类型”

第一节介绍了基本数据类型,如intfloatstring

“基本数据结构”

下一节介绍了Python的基本数据结构(例如list对象)并说明了控制结构、函数式编程范式和匿名函数。

本章的精神是在涉及数据类型和结构时提供对Python特定内容的一般介绍。如果您具备来自其他编程语言(例如CMatlab)的背景,那么您应该能够轻松掌握Python用法可能带来的差异。此处介绍的主题对于接下来的章节都是重要且基础的。

本章涵盖以下数据类型和结构:

对象类型 含义 用法/模型
int 整数值 自然数
float 浮点数 实数
bool 布尔值 某种真或假
str 字符串对象 字符、单词、文本
tuple 不可变容器 固定的对象集合、记录
list 可变容器 变化的对象集合
dict 可变容器 键-值存储
set 可变容器 唯一对象的集合

基本数据类型

Python 是一种动态类型语言,这意味着Python解释器在运行时推断对象的类型。相比之下,像C这样的编译语言通常是静态类型的。在这些情况下,对象的类型必须在编译时与对象关联。¹

整数

最基本的数据类型之一是整数,或者int

In [1]: a = 10
        type(a)
Out[1]: int

内置函数type提供了标准和内置类型的所有对象的类型信息,以及新创建的类和对象。在后一种情况下,提供的信息取决于程序员与类存储的描述。有一句话说“Python中的一切都是对象。”这意味着,例如,即使是我们刚刚定义的int对象这样的简单对象也有内置方法。例如,您可以通过调用方法bit_length来获取表示内存中的int对象所需的位数:

In [2]: a.bit_length()
Out[2]: 4

您会发现,所需的位数随我们分配给对象的整数值的增加而增加:

In [3]: a = 100000
        a.bit_length()
Out[3]: 17

一般来说,有很多不同的方法,很难记住所有类和对象的所有方法。高级Python环境,如IPython,提供了可以显示附加到对象的所有方法的制表符完成功能。您只需键入对象名称,然后跟一个点(例如,a.),然后按 Tab 键,例如,a.*tab*。然后,这将提供您可以调用的对象的方法集合。或者,Python内置函数dir提供了任何对象的完整属性和方法列表。

Python的一个特殊之处在于整数可以是任意大的。例如,考虑谷歌数 10¹⁰⁰。Python对于这样的大数没有问题,这些大数在技术上是long对象:

In [4]: googol = 10 ** 100
        googol
Out[4]: 10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
In [5]: googol.bit_length()
Out[5]: 333

大整数

Python 整数可以是任意大的。解释器会根据需要使用尽可能多的位/字节来表示数字。

整数的算术运算易于实现:

In [6]: 1 + 4
Out[6]: 5
In [7]: 1 / 4
Out[7]: 0.25
In [8]: type(1 / 4)
Out[8]: float

浮点数

最后一个表达式返回通常期望的结果 0.25(在基本的 Python 2.7 中不同)。这使我们进入了下一个基本数据类型,即float对象。在整数值后添加一个点,如1.1.0,会导致Python将对象解释为float。涉及float的表达式通常也返回一个float对象:^(2)

In [9]: 1.6 / 4
Out[9]: 0.4
In [10]: type (1.6 / 4)
Out[10]: float

float稍微复杂一些,因为有理数或实数的计算机化表示通常不是精确的,而是取决于所采取的具体技术方法。为了说明这意味着什么,让我们定义另一个float对象b。像这样的float对象总是内部表示为仅具有一定精度的。当向b添加 0.1 时,这变得明显:

In [11]: b = 0.35
         type(b)
Out[11]: float
In [12]: b + 0.1
Out[12]: 0.44999999999999996

这是因为+float+s 在内部以二进制格式表示;也就是说,十进制数0 < n < 1通过形式为n =  x 2 + y 4 + z 8 + . .  .的系列表示。对于某些浮点数,二进制表示可能涉及大量元素,甚至可能是一个无限级数。然而,给定用于表示此类数字的固定位数-即表示系列中的固定项数-不准确是其结果。其他数字可以完美表示,因此即使只有有限数量的位可用,它们也会被精确地存储。考虑以下示例:

In [13]: c = 0.5
         c.as_integer_ratio()
Out[13]: (1, 2)

一半,即 0.5,被准确地存储,因为它有一个精确(有限)的二进制表示:                                        

<                            /                            m                            i                            >                            <                            m                            n                            >                            0                            <                            /                            m                            n                            >                            <                            m                            o                            >                            .                            <                            /                            m                            o                            >                            <                            m                            n                            >                            5                            <                            /                            m                            n                            >                            <                            m                            o                            >                            =                            <                            /                            m                            o                            >                            <                            m                            f                            r                            a                            c                            >                            <                            m                            n                            >                            1                            <                            /                            m                            n                            >                            <                            m                            n                            >                            2                            <                            /                            m                            n                            >                            <                            /                            m                            f                            r                            a                            c                            >                            <                            m                            i                            >                                  </mi> <mn>0</mn> <mo>.</mo>  <mn>5</mn> <mo>=</mo>  <mfrac><mn>1</mn> <mn>2</mn></mfrac>  <mi>                     </mi><mn>0</mn><mo>.</mo><mn>5</mn><mo>=</mo><mfrac><mn>1</mn><mn>2</mn></mfrac><mi> 。然而,对于b = 0.35,我们得到的结果与期望的有理数                                        <                            /                            m                            i                            >                            <                            m                            n                            >                            0                            <                            /                            m                            n                            >                            <                            m                            o                            >                            .                            <                            /                            m                            o                            >                            <                            m                            n                            >                            35                            <                            /                            m                            n                            >                            <                            m                            o                            >                            =                            <                            /                            m                            o                            >                            <                            m                            f                            r                            a                            c                            >                            <                            m                            n                            >                            7                            <                            /                            m                            n                            >                            <                            m                            n                            >                            20                            <                            /                            m                            n                            >                            <                            /                            m                            f                            r                            a                            c                            >                            <                            m                            i                            >                                  </mi> <mn>0</mn> <mo>.</mo>  <mn>35</mn> <mo>=</mo>  <mfrac><mn>7</mn>  <mn>20</mn></mfrac> <mi>                     </mi><mn>0</mn><mo>.</mo><mn>35</mn><mo>=</mo><mfrac><mn>7</mn><mn>20</mn></mfrac><mi> 不同:
In [14]: b.as_integer_ratio()
Out[14]: (3152519739159347, 9007199254740992)

精度取决于用于表示数字的位数。一般来说,所有Python运行的平台都使用 IEEE 754 双精度标准(即 64 位)来进行内部表示。³ 这意味着相对精度为 15 位数字。

由于这个主题在金融等几个应用领域非常重要,有时需要确保数字的确切或至少是最佳可能的表示。例如,在对一大堆数字求和时,这个问题可能很重要。在这种情况下,某种类型和/或数量级别的表示误差可能导致与基准值的显著偏差。

模块decimal提供了一个用于浮点数的任意精度对象,以及几个选项来解决使用这些数字时的精度问题:

In [15]: import decimal
         from decimal import Decimal
In [16]: decimal.getcontext()
Out[16]: Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999, capitals=1, clamp=0, flags=[], traps=[InvalidOperation, DivisionByZero, Overflow])
In [17]: d = Decimal(1) / Decimal (11)
         d
Out[17]: Decimal('0.09090909090909090909090909091')

您可以通过改变Context对象的相应属性值来改变表示的精度:

In [18]: decimal.getcontext().prec = 4  ![1](https://gitee.com/OpenDocCN/ibooker-quant-zh/raw/master/docs/py-fin-2e/img/1.png)
In [19]: e = Decimal(1) / Decimal (11)
         e
Out[19]: Decimal('0.09091')
In [20]: decimal.getcontext().prec = 50  ![2](https://gitee.com/OpenDocCN/ibooker-quant-zh/raw/master/docs/py-fin-2e/img/2.png)
In [21]: f = Decimal(1) / Decimal (11)
         f
Out[21]: Decimal('0.090909090909090909090909090909090909090909090909091')


低于默认精度。


高于默认精度。

如有需要,可以通过这种方式调整精度以适应手头的确切问题,并且可以处理具有不同精度的浮点对象:

In [22]: g = d + e + f
         g
Out[22]: Decimal('0.27272818181818181818181818181909090909090909090909')

任意精度浮点数

模块decimal提供了一个任意精度浮点数对象。在金融中,有时需要确保高精度并超越 64 位双精度标准。

布尔值

在编程中,评估比较或逻辑表达式,例如4 > 34.5 <= 3.25(4 > 3) and (3 > 2),会产生TrueFalse之一作为输出,这是两个重要的 Python 关键字。其他例如defforif。Python 关键字的完整列表可在keyword模块中找到。

In [23]: import keyword
In [24]: keyword.kwlist
Out[24]: ['False',
          'None',
          'True',
          'and',
          'as',
          'assert',
          'break',
          'class',
          'continue',
          'def',
          'del',
          'elif',
          'else',
          'except',
          'finally',
          'for',
          'from',
          'global',
          'if',
          'import',
          'in',
          'is',
          'lambda',
          'nonlocal',
          'not',
          'or',
          'pass',
          'raise',
          'return',
          'try',
          'while',
          'with',
          'yield']

TrueFalsebool数据类型,代表布尔值。以下代码展示了 Python 对相同操作数应用比较操作符后生成的bool对象。

In [25]: 4 > 3  ![1](https://gitee.com/OpenDocCN/ibooker-quant-zh/raw/master/docs/py-fin-2e/img/1.png)
Out[25]: True
In [26]: type(4 > 3)
Out[26]: bool
In [27]: type(False)
Out[27]: bool
In [28]: 4 >= 3  ![2](https://gitee.com/OpenDocCN/ibooker-quant-zh/raw/master/docs/py-fin-2e/img/2.png)
Out[28]: True
In [29]: 4 < 3  ![3](https://gitee.com/OpenDocCN/ibooker-quant-zh/raw/master/docs/py-fin-2e/img/3.png)
Out[29]: False
In [30]: 4 <= 3  ![4](https://gitee.com/OpenDocCN/ibooker-quant-zh/raw/master/docs/py-fin-2e/img/4.png)
Out[30]: False
In [31]: 4 == 3  ![5](https://gitee.com/OpenDocCN/ibooker-quant-zh/raw/master/docs/py-fin-2e/img/5.png)
Out[31]: False
In [32]: 4 != 3  ![6](https://gitee.com/OpenDocCN/ibooker-quant-zh/raw/master/docs/py-fin-2e/img/6.png)
Out[32]: True


更大。


大于或等于。


更小。


小于或等于。


相等。


不相等。

经常,逻辑运算符被应用于bool对象,从而产生另一个bool对象。

In [33]: True and True
Out[33]: True
In [34]: True and False
Out[34]: False
In [35]: False and False
Out[35]: False
In [36]: True or True
Out[36]: True
In [37]: True or False
Out[37]: True
In [38]: False or False
Out[38]: False
In [39]: not True
Out[39]: False
In [40]: not False
Out[40]: True

当然,这两种类型的运算符经常结合使用。

In [41]: (4 > 3) and (2 > 3)
Out[41]: False
In [42]: (4 == 3) or (2 != 3)
Out[42]: True
In [43]: not (4 != 4)
Out[43]: True
In [44]: (not (4 != 4)) and (2 == 3)
Out[44]: False

其一主要应用是通过其他 Python 关键字(例如ifwhile)来控制代码流程(本章后面将有更多示例)。

In [45]: if 4 > 3:  ![1](https://gitee.com/OpenDocCN/ibooker-quant-zh/raw/master/docs/py-fin-2e/img/1.png)
             print('condition true')  ![2](https://gitee.com/OpenDocCN/ibooker-quant-zh/raw/master/docs/py-fin-2e/img/2.png)
         condition true
In [46]: i = 0  ![3](https://gitee.com/OpenDocCN/ibooker-quant-zh/raw/master/docs/py-fin-2e/img/3.png)
         while i < 4:  ![4](https://gitee.com/OpenDocCN/ibooker-quant-zh/raw/master/docs/py-fin-2e/img/4.png)
             print('condition true, i = ', i)  ![5](https://gitee.com/OpenDocCN/ibooker-quant-zh/raw/master/docs/py-fin-2e/img/5.png)
             i += 1  ![6](https://gitee.com/OpenDocCN/ibooker-quant-zh/raw/master/docs/py-fin-2e/img/6.png)
         condition true, i =  0
         condition true, i =  1
         condition true, i =  2
         condition true, i =  3


如果条件成立,则执行要跟随的代码。


如果条件成立,则执行要跟随的代码。


使用 0 初始化参数i


只要条件成立,就执行并重复执行后续代码。


打印文本和参数i的值。


将参数值增加 1;i += 1等同于i = i + 1

在数值上,Python 将False赋值为 0,将True赋值为 1。通过bool()函数将数字转换为bool对象时,0 给出False,而所有其他数字给出True

In [47]: int(True)
Out[47]: 1
In [48]: int(False)
Out[48]: 0
In [49]: float(True)
Out[49]: 1.0
In [50]: float(False)
Out[50]: 0.0
In [51]: bool(0)
Out[51]: False
In [52]: bool(0.0)
Out[52]: False
In [53]: bool(1)
Out[53]: True
In [54]: bool(10.5)
Out[54]: True
In [55]: bool(-2)
Out[55]: True


Python 金融编程第二版(GPT 重译)(一)(4)https://developer.aliyun.com/article/1559389

相关文章
|
1天前
|
设计模式 开发者 Python
Python编程中的设计模式:工厂方法模式###
本文深入浅出地探讨了Python编程中的一种重要设计模式——工厂方法模式。通过具体案例和代码示例,我们将了解工厂方法模式的定义、应用场景、实现步骤以及其优势与潜在缺点。无论你是Python新手还是有经验的开发者,都能从本文中获得关于如何在实际项目中有效应用工厂方法模式的启发。 ###
|
2天前
|
数据采集 机器学习/深度学习 人工智能
Python编程入门:从基础到实战
【10月更文挑战第24天】本文将带你进入Python的世界,从最基础的语法开始,逐步深入到实际的项目应用。我们将一起探索Python的强大功能和灵活性,无论你是编程新手还是有经验的开发者,都能在这篇文章中找到有价值的内容。让我们一起开启Python的奇妙之旅吧!
|
4天前
|
设计模式 监控 数据库连接
Python编程中的设计模式之美:提升代码质量与可维护性####
【10月更文挑战第21天】 一段简短而富有启发性的开头,引出文章的核心价值所在。 在编程的世界里,设计模式如同建筑师手中的蓝图,为软件的设计和实现提供了一套经过验证的解决方案。本文将深入浅出地探讨Python编程中几种常见的设计模式,通过实例展示它们如何帮助我们构建更加灵活、可扩展且易于维护的代码。 ####
|
1天前
|
数据库 开发者 Python
“Python异步编程革命:如何从编程新手蜕变为并发大师,掌握未来技术的制胜法宝”
【10月更文挑战第25天】介绍了Python异步编程的基础和高级技巧。文章从同步与异步编程的区别入手,逐步讲解了如何使用`asyncio`库和`async`/`await`关键字进行异步编程。通过对比传统多线程,展示了异步编程在I/O密集型任务中的优势,并提供了最佳实践建议。
7 1
|
4天前
|
存储 人工智能 数据挖掘
Python编程入门:构建你的第一个程序
【10月更文挑战第22天】编程,这个听起来高深莫测的词汇,实际上就像搭积木一样简单有趣。本文将带你走进Python的世界,用最浅显的语言和实例,让你轻松掌握编写第一个Python程序的方法。无论你是编程新手还是希望了解Python的爱好者,这篇文章都将是你的理想起点。让我们一起开始这段奇妙的编程之旅吧!
13 3
|
4天前
|
Python
Python编程中正则表达式的使用
【10月更文挑战第22天】正则表达式,一种强大的文本处理工具,在Python编程中有着广泛的应用。本文将介绍如何使用Python中的re库来使用正则表达式,包括如何创建、匹配、查找和替换字符串等。通过学习本文,你将能够掌握Python中正则表达式的基本使用方法。
|
5天前
|
存储 程序员 开发者
Python编程入门:从零开始掌握基础语法
【10月更文挑战第21天】本文将带你走进Python的世界,通过浅显易懂的语言和实例,让你快速了解并掌握Python的基础语法。无论你是编程新手还是想学习一门新的编程语言,这篇文章都将是你的不二之选。我们将一起探索变量、数据类型、运算符、控制结构、函数等基本概念,并通过实际代码示例加深理解。准备好了吗?让我们开始吧!
|
18天前
|
存储 程序员 开发者
Python编程基础:从入门到实践
【10月更文挑战第8天】在本文中,我们将一起探索Python编程的奇妙世界。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供有价值的信息。我们将从Python的基本概念开始,然后逐步深入到更复杂的主题,如数据结构、函数和类。最后,我们将通过一些实际的代码示例来巩固我们的知识。让我们一起开始这段Python编程之旅吧!
|
7天前
|
安全 数据处理 开发者
Python中的多线程编程:从入门到精通
本文将深入探讨Python中的多线程编程,包括其基本原理、应用场景、实现方法以及常见问题和解决方案。通过本文的学习,读者将对Python多线程编程有一个全面的认识,能够在实际项目中灵活运用。
|
6天前
|
弹性计算 安全 小程序
编程之美:Python让你领略浪漫星空下的流星雨奇观
这段代码使用 Python 的 `turtle` 库实现了一个流星雨动画。程序通过创建 `Meteor` 类来生成具有随机属性的流星,包括大小、颜色、位置和速度。在无限循环中,流星不断移动并重新绘制,营造出流星雨的效果。环境需求为 Python 3.11.4 和 PyCharm 2023.2.5。
26 9