4、Python基础速通(三):条件判断与循环——策略逻辑的核心
好,我们继续往前走。
前两章我们把 Python 的基本数据类型和运算符过了一遍。说实话,那些都是「食材」。今天要讲的 条件判断 和 循环,才是真正的「厨艺」。没有它们,你的量化策略就是一盘散沙。
你想想看,选股策略的本质是什么?
无非就是:如果某只股票满足条件A、条件B、条件C,我就把它选出来;然后对每一只股票都重复做这件事。
条件判断 + 循环,正好干这个。
核心观点: 量化策略 = 条件规则 × 循环遍历。没有循环,你只能手动处理一只股票;没有条件判断,你无法筛选出真正想要的标的。
4.1 条件判断:给策略装上「大脑」
条件判断,说白了就是让程序做选择题。
Python 里最常用的就是 if、elif、else 这套组合拳。结构很简单:
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 布尔表达式与短路求值
条件判断的核心是布尔表达式。说白了就是 True 或 False 的问题。
Python 里,以下值会被当作 False:
None0、0.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 练熟,然后慢慢加条件、加逻辑。我见过太多人一上来就想写「多因子+机器学习」,结果连循环都写不对。基础打牢,后面才快。
好了,条件判断和循环就讲到这里。这两个东西,你每天写策略都会用到。多练几次,形成肌肉记忆就好。