4、Python基础速通(三):条件判断与循环——策略逻辑的核心

好,我们继续往前走。

前两章我们把 Python 的基本数据类型和运算符过了一遍。说实话,那些都是「食材」。今天要讲的 条件判断循环,才是真正的「厨艺」。没有它们,你的量化策略就是一盘散沙。

你想想看,选股策略的本质是什么?

无非就是:如果某只股票满足条件A、条件B、条件C,我就把它选出来;然后对每一只股票都重复做这件事。

条件判断 + 循环,正好干这个。

核心观点: 量化策略 = 条件规则 × 循环遍历。没有循环,你只能手动处理一只股票;没有条件判断,你无法筛选出真正想要的标的。

本章知识体系:条件判断与循环 条件判断 • if / elif / else 结构 • 布尔表达式与逻辑运算符 • 嵌套条件与短路求值 循环结构 • for 循环遍历列表/字典 • while 循环与条件控制 • break / continue 跳转 量化策略中的应用 • 遍历股票池,筛选满足条件的标的 • 根据多条件组合生成买卖信号

4.1 条件判断:给策略装上「大脑」

条件判断,说白了就是让程序做选择题。

Python 里最常用的就是 ifelifelse 这套组合拳。结构很简单:

if 条件1:
    执行代码块A
elif 条件2:
    执行代码块B
else:
    执行代码块C

嗯,这里要注意:冒号不能丢,缩进必须一致。我见过太多新手因为缩进问题 debug 到崩溃。

举个量化场景的例子。假设我们要筛选市盈率低于 15 且 ROE 大于 20% 的股票:

pe = 12.5
roe = 22.3

if pe < 15 and roe > 20:
    print("符合条件,加入备选池")
else:
    print("不符合条件,跳过")

个人经验: 我在写第一个量化策略时,把 and 写成了 or,结果选出来一堆垃圾股。后来复盘才发现,逻辑运算符用错,整个策略就废了。建议你每次写完条件判断,都手动跑几个边界值测试一下。

条件判断还可以嵌套。比如你想再加一层:如果市盈率特别低(小于 10),即使 ROE 稍微低一点也可以接受:

if pe < 10:
    if roe > 15:
        print("低估值+中等质量,可考虑")
elif pe < 15 and roe > 20:
    print("合理估值+高质量,优选")
else:
    print("不满足条件")

嵌套条件虽然灵活,但别写太深。超过三层,代码可读性就直线下降。我个人习惯是,超过三层就拆成函数。

避坑指南: 我曾经在回测脚本里写了一个五层嵌套的 if,结果两个月后自己都看不懂了。后来全部改成了「提前返回」的模式——条件不满足就直接 return,代码清爽多了。

4.2 布尔表达式与短路求值

条件判断的核心是布尔表达式。说白了就是 TrueFalse 的问题。

Python 里,以下值会被当作 False

  • None
  • 00.0
  • 空字符串 ""
  • 空列表 []、空字典 {}、空元组 ()

其他都是 True

这里有个实用技巧叫「短路求值」。比如:

# 如果 stock_data 是 None,就不会执行后面的 .get()
if stock_data and stock_data.get("pe") < 15:
    print("数据有效且符合条件")

为什么会这样?因为 and 左边是 False 时,右边根本不会执行。这能帮你避免很多 NoneType 错误。

实战建议: 在量化策略中,经常要处理缺失数据。用短路求值可以一行代码搞定「数据存在且满足条件」的判断,比写两行 if 优雅得多。

4.3 for 循环:遍历你的股票池

量化交易里,最常用的就是 for 循环。你要遍历股票列表、遍历历史数据、遍历因子值……几乎无处不在。

基本语法:

stocks = ["贵州茅台", "宁德时代", "招商银行", "比亚迪"]

for stock in stocks:
    print(f"正在分析: {stock}")

输出:

正在分析: 贵州茅台
正在分析: 宁德时代
正在分析: 招商银行
正在分析: 比亚迪

配合 range() 可以生成数字序列:

for i in range(5):
    print(f"第{i+1}次迭代")

你想想看,如果股票池有 3000 只股票,手动分析得累死。但用 for 循环,几秒钟就跑完了。

遍历字典也很常见。比如一个股票代码到市盈率的映射:

pe_dict = {"600519": 28.5, "300750": 35.2, "600036": 6.8}

for code, pe in pe_dict.items():
    if pe < 10:
        print(f"{code} 是低估值标的,PE={pe}")

个人习惯: 我一般用 .items() 同时拿到 key 和 value,比先取 key 再取 value 快一倍。代码也更简洁。

4.4 while 循环:条件驱动型遍历

while 循环和 for 的区别在于:for 是「我知道要遍历多少次」,while 是「我不知道要多少次,但我知道什么时候停」。

比如模拟一个「直到股价跌破某个阈值才卖出」的逻辑:

current_price = 100.0
stop_loss = 85.0

while current_price > stop_loss:
    print(f"当前价格: {current_price},继续持有")
    # 模拟价格下跌
    current_price -= 2.5

print(f"触发止损,当前价格: {current_price}")

避坑指南: 我曾经写 while 循环时忘了更新条件变量,结果程序死循环了,CPU 直接飙到 100%。如果你用 while,一定要确保循环体里有改变条件的语句,否则就是灾难。

4.5 break 与 continue:循环的「刹车」和「跳过」

这两个关键字,用好了能让代码效率翻倍。

  • break:立即跳出整个循环
  • continue:跳过本次循环,进入下一次

举个例子。假设你遍历股票池,找到第一只市盈率低于 10 的股票就停止:

stocks = [
    {"name": "A", "pe": 25},
    {"name": "B", "pe": 18},
    {"name": "C", "pe": 8},
    {"name": "D", "pe": 12}
]

for stock in stocks:
    if stock["pe"] < 10:
        print(f"找到低估值股票: {stock['name']}")
        break  # 找到了,后面的不用看了

continue 常用于过滤不符合条件的数据:

for stock in stocks:
    if stock["pe"] > 20:
        continue  # 市盈率太高,跳过
    print(f"分析: {stock['name']}")

实战经验: 在回测中,我经常用 continue 跳过停牌股、ST 股。这样循环体里只处理有效数据,逻辑更清晰,性能也更好。

4.6 综合实战:一个简单的选股筛选器

我们把今天学的串起来,写一个迷你选股系统:

# 模拟股票数据
stock_pool = [
    {"code": "600519", "name": "贵州茅台", "pe": 28.5, "roe": 25.3},
    {"code": "300750", "name": "宁德时代", "pe": 35.2, "roe": 18.7},
    {"code": "600036", "name": "招商银行", "pe": 6.8, "roe": 16.2},
    {"code": "000002", "name": "万科A",   "pe": 9.2, "roe": 12.5},
    {"code": "601318", "name": "中国平安", "pe": 8.5, "roe": 19.8}
]

selected = []

for stock in stock_pool:
    # 条件:市盈率低于15 且 ROE大于15%
    if stock["pe"] < 15 and stock["roe"] > 15:
        selected.append(stock)
        print(f"入选: {stock['name']} (PE={stock['pe']}, ROE={stock['roe']}%)")
    else:
        print(f"淘汰: {stock['name']}")

print(f"\n最终入选 {len(selected)} 只股票")

输出结果:

淘汰: 贵州茅台 (PE=28.5)
淘汰: 宁德时代 (PE=35.2)
入选: 招商银行 (PE=6.8, ROE=16.2%)
淘汰: 万科A (PE=9.2, ROE=12.5%)
入选: 中国平安 (PE=8.5, ROE=19.8%)

最终入选 2 只股票

你看,这就是一个最简单的量化选股逻辑。条件判断负责筛选,循环负责遍历。两者结合,就能从几千只股票里快速找到你想要的。

我的建议: 刚开始别想着写复杂的策略。先把 if 和 for 练熟,然后慢慢加条件、加逻辑。我见过太多人一上来就想写「多因子+机器学习」,结果连循环都写不对。基础打牢,后面才快。

好了,条件判断和循环就讲到这里。这两个东西,你每天写策略都会用到。多练几次,形成肌肉记忆就好。


专注资料整理