![商品期货量化交易实战:以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=1739025804-SoB0LaOnpUee2yjnLh2n4NbQlK3WzX9w-0-32ce60a847f2521b0abff030a17e6998)
图2.1 条件语句和循环语句
2.7.1 条件语句
计算机在执行代码时,会按照从上到下的顺序逐行执行。但很多时候按顺序执行代码有很大的局限性。假如有一个策略逻辑是只有在均线金叉时才能买入,这时就需要用到if条件语句了。if条件语句的逻辑示意图如图2.2所示。
![](https://epubservercos.yuewen.com/F058EB/23020652409767806/epubprivate/OEBPS/Images/42673_64_1.jpg?sign=1739025804-urGEW9y8PYUPqlA0ygT8dpqXz397VsUR-0-2f17024834f1c6caaac3354d45ddd862)
图2.2 if条件语句的逻辑示意图
if条件语句属于选择结构,它就像一个开关,首先对条件进行判断,然后根据判断结果执行不同的代码。这个条件可以是单一的值,也可以是由运算符组成的表达式,只要这个条件能得到一个值,if条件语句都能判断它是否成立。如果条件成立,则会执行if语句中的代码块,否则会跳过if语句。示例代码如下:
![](https://epubservercos.yuewen.com/F058EB/23020652409767806/epubprivate/OEBPS/Images/42673_64_2.jpg?sign=1739025804-pzeOk6O7n1WzmY2RnRuxHQwen4DX9MQk-0-42d4b0198457c8862088819881a15642)
输出结果如下:
![](https://epubservercos.yuewen.com/F058EB/23020652409767806/epubprivate/OEBPS/Images/42673_64_3.jpg?sign=1739025804-1MvpBJtVXdRpLh230R0p87R0cpCujFxI-0-4c23e18cecd0402256d6c97a6bc37edc)
在通常情况下,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=1739025804-2Z2qnNnh2VPxni7SkMm7WxPIRoWx2fIK-0-b740713588ef80ff4f5ae5e7a21213f1)
图2.3 if…else条件语句的逻辑示意图
示例代码如下:
![](https://epubservercos.yuewen.com/F058EB/23020652409767806/epubprivate/OEBPS/Images/42673_64_5.jpg?sign=1739025804-j9w3prgBvQ6lfYxETUgKtaXfBL0kWfj7-0-ccfd5e5d4e486546523aae11f14fc0f0)
![](https://epubservercos.yuewen.com/F058EB/23020652409767806/epubprivate/OEBPS/Images/42673_65_1.jpg?sign=1739025804-ybrBa5p7LGZSh8sKym1I0xiYq8JAOZUy-0-1326e15f935c192549ad33beb9d22bf1)
输出结果如下:
![](https://epubservercos.yuewen.com/F058EB/23020652409767806/epubprivate/OEBPS/Images/42673_65_2.jpg?sign=1739025804-7eVftnWi9TrNoDOgDqJBOQmKnF3gg1jG-0-e08af819269c64203245a62b20c3ad0a)
还有一种if…elif…else形式的条件语句,这种条件语句会依次判断表达式的值,如果某个表达式的值为真,则执行对应的代码块;如果所有的表达式均为假,则执行else语句中的代码块。if…elif…else条件语句的逻辑示意图如图2.4所示。
![](https://epubservercos.yuewen.com/F058EB/23020652409767806/epubprivate/OEBPS/Images/42673_65_3.jpg?sign=1739025804-02aDPd4WGuByb8O3fb2zL4ryeqz4kZul-0-37bd2bedb7b3edf2e85968fe30bddae2)
图2.4 if…elif…else条件语句的逻辑示意图
示例代码如下:
![](https://epubservercos.yuewen.com/F058EB/23020652409767806/epubprivate/OEBPS/Images/42673_65_4.jpg?sign=1739025804-T99w0sKv2J1pAVscszO1wtobyr2g4qxQ-0-dbbded66e22565b1e525f05428be5fbf)
输出结果如下:
![](https://epubservercos.yuewen.com/F058EB/23020652409767806/epubprivate/OEBPS/Images/42673_65_5.jpg?sign=1739025804-7PRL61w79LtyQycFW7ulUkfGiMuDGUPF-0-f6fcbdcf47b69f6fbcdf840822b31b2e)
条件语句可以嵌套使用。在嵌套条件语句中,可以将if...elif...else条件语句嵌套在另一个if...elif...else条件语句中。示例代码如下:
![](https://epubservercos.yuewen.com/F058EB/23020652409767806/epubprivate/OEBPS/Images/42673_65_6.jpg?sign=1739025804-XBtJHlozdKUhSl00JxOKBreYVeIzWVi0-0-662ba6e40a3adc8a8712d537cb301456)
![](https://epubservercos.yuewen.com/F058EB/23020652409767806/epubprivate/OEBPS/Images/42673_66_1.jpg?sign=1739025804-NOXiARUPNLgCdrrp6QfsmF5JCgqqUyYP-0-6a1e454529af932eb9f59e67fc27d12c)
输出结果如下:
![](https://epubservercos.yuewen.com/F058EB/23020652409767806/epubprivate/OEBPS/Images/42673_66_2.jpg?sign=1739025804-MkZiKQ2u4Oe5zHVELBGU6VPzZSY5qhVl-0-0090049690a37dc27a878b8625293c84)
在上述代码中,首先定义了一个字典变量,然后使用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=1739025804-scBxKn77tDYujbFesBAQ6X7ECEJsZhKR-0-4ae6c61b07f1020e8c73c5f8dbb9f7d9)
图2.5 循环语句的逻辑示意图
for通常用于遍历数量有限的数据(如字符串、列表、字典等)或处理有限的任务。例如,使用for循环语句将一个字符串中的所有字符逐个打印出来,示例代码如下:
![](https://epubservercos.yuewen.com/F058EB/23020652409767806/epubprivate/OEBPS/Images/42673_67_1.jpg?sign=1739025804-GkofFwpIwDJRGaIcWtZoO4PBP7qbMBiZ-0-6eb706614b543d6c84e0c54d0023d5a9)
输出结果如下:
![](https://epubservercos.yuewen.com/F058EB/23020652409767806/epubprivate/OEBPS/Images/42673_67_2.jpg?sign=1739025804-sJrQdpMonsT5Rk9qYQqAUC12u3yIJS3S-0-9e566888ea7fca2d835e37ea18520a4f)
如果数据是无限的,或者需要处理无限重复的任务,则可以使用while循环语句。while循环语句在每次开始循环前,都会先判断条件语句是否为真,如果条件语句为真,那么执行循环体内的代码块。示例代码如下:
![](https://epubservercos.yuewen.com/F058EB/23020652409767806/epubprivate/OEBPS/Images/42673_67_3.jpg?sign=1739025804-qLZCBc72RPeiRE758gMLQMpRzHSyiE5y-0-de87bcea9de46884b2b42037e5051a3f)
输出结果如下:
![](https://epubservercos.yuewen.com/F058EB/23020652409767806/epubprivate/OEBPS/Images/42673_67_4.jpg?sign=1739025804-fCVRzFOvO9KEJP975pTz5sX40bfHHZ8R-0-75d6e66f074dde3961aff4174022dd7d)
在上述代码中,首先定义了一个变量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=1739025804-y1YaPBJR5xRhG85S0FgBZ4H8BtrIMPOQ-0-eb7ca20be9101c975cc433dc38e51412)
输出结果如下:
![](https://epubservercos.yuewen.com/F058EB/23020652409767806/epubprivate/OEBPS/Images/42673_68_2.jpg?sign=1739025804-sATCfHjj8sW8gue1qsX7L6lkWaHEsiJU-0-abf21129026706e78161d2bc907a828d)
在上述代码中,使用了两个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=1739025804-4k1cwhmWKcmr41ATT4L07qGjb5yhAeEQ-0-439cc8975375129cbd92275a62ce8bbf)
输出结果如下:
![](https://epubservercos.yuewen.com/F058EB/23020652409767806/epubprivate/OEBPS/Images/42673_68_4.jpg?sign=1739025804-FoGdGFWLyyOIy1ymYcLosJ8D3ouuR8sS-0-1369dd94a26542c43cc77ad6f7cdc043)
在上面的输出结果中,字符串"c"没有被打印出来。因为在循环体内使用if语句判断i=="c"时执行了continue语句,所以跳过了当前循环,并未执行后面的Log(i)代码,直接执行了下一次循环。continue语句和break语句类似,只能作用于当前循环,不影响外层循环(如果有的话)。