![商品期货量化交易实战:以Python为工具](https://wfqqreader-1252317822.image.myqcloud.com/cover/372/43738372/b_43738372.jpg)
2.7 Python中的条件语句和循环语句
编程与生活息息相关,如红灯停、绿灯行就是条件语句。条件语句和循环语句在量化交易中很常用,如图2.1所示。策略是否可以根据行情实时变化发现潜在的交易机会,取决于它在循环语句中重复的判断交易信号是否成立。之所以会自动下单交易,是因为它可以根据条件语句执行下单动作。
![](https://epubservercos.yuewen.com/F058EB/23020652409767806/epubprivate/OEBPS/Images/42673_63_3.jpg?sign=1738851212-NMA15rQZcAovf6a0TfhpqRfSVEFeC8PJ-0-62c09ece48dc37b9997ddf03156889b9)
图2.1 条件语句和循环语句
2.7.1 条件语句
计算机在执行代码时,会按照从上到下的顺序逐行执行。但很多时候按顺序执行代码有很大的局限性。假如有一个策略逻辑是只有在均线金叉时才能买入,这时就需要用到if条件语句了。if条件语句的逻辑示意图如图2.2所示。
![](https://epubservercos.yuewen.com/F058EB/23020652409767806/epubprivate/OEBPS/Images/42673_64_1.jpg?sign=1738851212-OkmcqkZEvjq1ypkR5kX3LWNQOKloOjkl-0-bc3d8c341cafc71153e36ff664e79656)
图2.2 if条件语句的逻辑示意图
if条件语句属于选择结构,它就像一个开关,首先对条件进行判断,然后根据判断结果执行不同的代码。这个条件可以是单一的值,也可以是由运算符组成的表达式,只要这个条件能得到一个值,if条件语句都能判断它是否成立。如果条件成立,则会执行if语句中的代码块,否则会跳过if语句。示例代码如下:
![](https://epubservercos.yuewen.com/F058EB/23020652409767806/epubprivate/OEBPS/Images/42673_64_2.jpg?sign=1738851212-ZWjrTj17pGfKa1w8Gca7Znbax46K21iv-0-89b3fecb31f01b9dad74bda8fc642644)
输出结果如下:
![](https://epubservercos.yuewen.com/F058EB/23020652409767806/epubprivate/OEBPS/Images/42673_64_3.jpg?sign=1738851212-ijsDIQvSnBOwjwmGPiFXeq36UvdHSm9v-0-526ce56ce3d266efbded55f96e7503b9)
在通常情况下,if语句和else语句可以组合成if...else条件语句。如果条件成立,那么执行if语句中的代码块,跳过else语句中的代码块;如果条件不成立,那么跳过if语句中的代码块,执行else语句中的代码块。if…else条件语句的逻辑示意图如图2.3所示。
![](https://epubservercos.yuewen.com/F058EB/23020652409767806/epubprivate/OEBPS/Images/42673_64_4.jpg?sign=1738851212-3JKBZ35XNhwmdZQL4N7beIQEokSH5XcN-0-c3bda749849f6f97fdb1d0fc875c05f1)
图2.3 if…else条件语句的逻辑示意图
示例代码如下:
![](https://epubservercos.yuewen.com/F058EB/23020652409767806/epubprivate/OEBPS/Images/42673_64_5.jpg?sign=1738851212-LBlesImxoEpsVxaUNSElmRza6mXzpW3O-0-b0d62dcc965ec089f9340f106e66bc52)
![](https://epubservercos.yuewen.com/F058EB/23020652409767806/epubprivate/OEBPS/Images/42673_65_1.jpg?sign=1738851212-zmBRryeoEN4F0WDaQDM0FDrqnzCnvlxe-0-a7f95632dc2a036795baf0ba641bbdfb)
输出结果如下:
![](https://epubservercos.yuewen.com/F058EB/23020652409767806/epubprivate/OEBPS/Images/42673_65_2.jpg?sign=1738851212-CzrnQIROgkDnv5xxrJsWrOtJ29MDRIhX-0-64750b9d9c05c91d90ec3ca58bfd8827)
还有一种if…elif…else形式的条件语句,这种条件语句会依次判断表达式的值,如果某个表达式的值为真,则执行对应的代码块;如果所有的表达式均为假,则执行else语句中的代码块。if…elif…else条件语句的逻辑示意图如图2.4所示。
![](https://epubservercos.yuewen.com/F058EB/23020652409767806/epubprivate/OEBPS/Images/42673_65_3.jpg?sign=1738851212-bIuAJ4MwWT1NSN4p5PRCASgEmycYeVxH-0-d81de1afc7ffab3b8c120eb750a757c1)
图2.4 if…elif…else条件语句的逻辑示意图
示例代码如下:
![](https://epubservercos.yuewen.com/F058EB/23020652409767806/epubprivate/OEBPS/Images/42673_65_4.jpg?sign=1738851212-8WPW5tapCpdcWy736y3GyIXEHD9IDkRJ-0-dd833b4de12d48efc115803227d4e5d1)
输出结果如下:
![](https://epubservercos.yuewen.com/F058EB/23020652409767806/epubprivate/OEBPS/Images/42673_65_5.jpg?sign=1738851212-Tfn8h0UA3s7qrpDpDfr596bgRwFwCCma-0-1935ae386478312e3d4b48af76511196)
条件语句可以嵌套使用。在嵌套条件语句中,可以将if...elif...else条件语句嵌套在另一个if...elif...else条件语句中。示例代码如下:
![](https://epubservercos.yuewen.com/F058EB/23020652409767806/epubprivate/OEBPS/Images/42673_65_6.jpg?sign=1738851212-9yTxCi2WHNzOycodYykO5XJA9IXwd2YF-0-c802015d8958a4ff39185a0a27da4689)
![](https://epubservercos.yuewen.com/F058EB/23020652409767806/epubprivate/OEBPS/Images/42673_66_1.jpg?sign=1738851212-8aA5rZdUzej6CQLBxV2z0bYuTQlPPDzw-0-4cbf7a567ea8cde592698f57b1d88055)
输出结果如下:
![](https://epubservercos.yuewen.com/F058EB/23020652409767806/epubprivate/OEBPS/Images/42673_66_2.jpg?sign=1738851212-qIyQ85WWfyyb1E3JMgmGmoFOeKzrbtdG-0-df82b326548783d8b674d9151bf0c87c)
在上述代码中,首先定义了一个字典变量,然后使用if语句判断字典变量中age元素的值,由于字典变量中age元素的值是18,因此if语句和elif语句中的代码块都不会被执行,转而执行else语句中的代码块。
2.7.2 循环语句
循环是让计算机重复做某件事情。Python提供了两种循环语句,分别是for循环语句和while循环语句。for循环语句通常用于表示有限次数的循环。while循环语句通常用于表示不定次数的循环,在某些条件触发后退出循环。循环语句的逻辑示意图如图2.5所示。
![](https://epubservercos.yuewen.com/F058EB/23020652409767806/epubprivate/OEBPS/Images/42673_66_3.jpg?sign=1738851212-9bVLymO56Ro1L7Stlg5Ga0GVlRWaNP5t-0-02777c5152ba6ecd55b2f4af724b309e)
图2.5 循环语句的逻辑示意图
for通常用于遍历数量有限的数据(如字符串、列表、字典等)或处理有限的任务。例如,使用for循环语句将一个字符串中的所有字符逐个打印出来,示例代码如下:
![](https://epubservercos.yuewen.com/F058EB/23020652409767806/epubprivate/OEBPS/Images/42673_67_1.jpg?sign=1738851212-mevDApuZUFH61ulOLYKllMDnJgjKao89-0-d2e04ae3c7b5bd145728d476d6bd43b9)
输出结果如下:
![](https://epubservercos.yuewen.com/F058EB/23020652409767806/epubprivate/OEBPS/Images/42673_67_2.jpg?sign=1738851212-NNoKvalnPrdO4Zov6TvSmLYbJdPeV1vQ-0-0d51b1a636360e2d72bd2587e955795d)
如果数据是无限的,或者需要处理无限重复的任务,则可以使用while循环语句。while循环语句在每次开始循环前,都会先判断条件语句是否为真,如果条件语句为真,那么执行循环体内的代码块。示例代码如下:
![](https://epubservercos.yuewen.com/F058EB/23020652409767806/epubprivate/OEBPS/Images/42673_67_3.jpg?sign=1738851212-KZ2Ue9LC5Jy4ue36qtOtH3VEfa6R0I6F-0-f57def4afb0b7126a9bd3dc1878197c6)
输出结果如下:
![](https://epubservercos.yuewen.com/F058EB/23020652409767806/epubprivate/OEBPS/Images/42673_67_4.jpg?sign=1738851212-qtXxmopfQFdyFsaUsOEb0Lc2TgfAfyP8-0-85042db8093e4c665cb565e6006540a6)
在上述代码中,首先定义了一个变量a并将其赋值为0,然后使用while循环语句,其条件是a>100,也就是说,如果a>100,就重复执行循环体内的代码块,每一次循环都将a的值加1,直到a=100,循环结束。
2.7.3 break语句
break语句是循环语句的搭档,当循环语句中出现break语句时,循环会立刻终止。如果是双层循环语句,那么break语句只会终止当前循环。示例代码如下:
![](https://epubservercos.yuewen.com/F058EB/23020652409767806/epubprivate/OEBPS/Images/42673_68_1.jpg?sign=1738851212-CAUHCZikRP7bLT5hRfobv7Z3ad4JHAXL-0-f3ae93d8c7e0ac6b595e5c284da73549)
输出结果如下:
![](https://epubservercos.yuewen.com/F058EB/23020652409767806/epubprivate/OEBPS/Images/42673_68_2.jpg?sign=1738851212-eo29C07YQEKN2OFpaDDzmDwlsf9vDJTx-0-055a092fb3fd72483cb366ab9adec132)
在上述代码中,使用了两个for循环语句,分别用于遍历列表变量arr1和arr2,在遍历列表变量arr2时遇到了break语句,就跳出了当前的for循环,所以列表变量arr2中的第2~4个元素("b"、"c"和"d")都不会被打印出来,但是列表变量arr1中的元素都被打印了出来,说明break语句只是跳出了循环for j in arr2。
2.7.4 continue语句
continue语句与break语句类似,和break语句不同的是,continue语句不是终止整个循环,而是跳过本次循环,并且强制执行下一次循环。示例代码如下:
![](https://epubservercos.yuewen.com/F058EB/23020652409767806/epubprivate/OEBPS/Images/42673_68_3.jpg?sign=1738851212-tOhrn9id65tgoihG1Li9QTLbL9DNzEVt-0-8de6062bbb2830ca7144bd245480e79b)
输出结果如下:
![](https://epubservercos.yuewen.com/F058EB/23020652409767806/epubprivate/OEBPS/Images/42673_68_4.jpg?sign=1738851212-qid6IFG7HBXO8BUo438Ayj07pjy8lW24-0-c2c9415543130ca649cc9808c2ef1994)
在上面的输出结果中,字符串"c"没有被打印出来。因为在循环体内使用if语句判断i=="c"时执行了continue语句,所以跳过了当前循环,并未执行后面的Log(i)代码,直接执行了下一次循环。continue语句和break语句类似,只能作用于当前循环,不影响外层循环(如果有的话)。