3、Python基础速通(下):条件判断与循环,函数定义与使用,文件读写操作,第三方库的安装(pip)
好,咱们接着聊。上一节我们把Python的数据类型和运算符过了一遍,算是把「食材」备齐了。这一节,咱们要开始学「怎么做菜」——也就是控制流程、封装逻辑、读写数据,还有怎么用别人的轮子。
我个人习惯把这一节叫做「实战前的最后一块拼图」。你想想看,一个量化选股系统,无非就是:拿到数据 → 做判断 → 循环处理 → 输出结果。这些操作,全靠今天的内容撑起来。
条件判断:让代码学会「看情况办事」
写量化策略的时候,最常用的就是条件判断。比如:如果市盈率低于15倍,就买入;如果高于30倍,就卖出。这就是典型的 if-elif-else 场景。
pe_ratio = 12.5
if pe_ratio < 15:
print("估值偏低,考虑买入")
elif pe_ratio < 30:
print("估值合理,继续持有")
else:
print("估值偏高,注意风险")
这里有个细节我想强调一下:Python 用缩进来表示代码块,而不是花括号。我刚开始学的时候,经常因为缩进不对报错,气得想砸键盘。后来养成了一个习惯——统一用4个空格,不用Tab键。嗯,这个习惯一直用到现在。
0、None、""(空字符串)、[](空列表)视为 False。写代码时可以利用这个特性,让逻辑更简洁。
循环:批量处理数据的利器
做量化分析,你不可能一只股票一只股票地手动分析。你得让程序帮你批量处理。这时候循环就派上用场了。
Python 有两种循环:for 和 while。我个人90%的场景都用 for,因为它更直观。
# 遍历股票列表
stocks = ["贵州茅台", "宁德时代", "招商银行", "比亚迪"]
for stock in stocks:
print(f"正在分析:{stock}")
# 这里可以写具体的分析逻辑
说到 for 循环,有个函数我必须提一下——range()。它用来生成一个整数序列,配合循环特别方便。
# 生成1到10的数字
for i in range(1, 11):
print(f"第{i}次迭代")
我曾经在写回测框架时,因为 range() 的结束值没搞清楚,导致回测结果少了一天数据。排查了半天才发现——range(1, 11) 生成的是1到10,不包括11。这个坑,你记住就好。
range(start, stop, step) 的 stop 是不包含的。这是新手最容易犯的错误之一。
函数:把你的逻辑「封装」起来
写代码最忌讳的就是「一坨屎山」——所有逻辑堆在一起,看着就头疼。函数就是用来解决这个问题的。它把一段逻辑打包成一个「黑盒子」,你只管调用,不用关心内部实现。
def calculate_pe_ratio(price, earnings_per_share):
"""
计算市盈率
:param price: 当前股价
:param earnings_per_share: 每股收益
:return: 市盈率
"""
if earnings_per_share == 0:
return None # 避免除零错误
return price / earnings_per_share
# 调用函数
pe = calculate_pe_ratio(150.0, 8.5)
print(f"市盈率为:{pe:.2f}")
这里有个概念叫「作用域」。函数内部定义的变量,外面是访问不到的。说白了,就是函数有自己的「小世界」。我刚开始写的时候,经常在函数外面想用函数里面的变量,结果报 NameError。后来我记住了:函数内部的东西,想带出来就用 return。
文件读写:把数据存下来
量化系统离不开数据。你从网上爬下来的股票数据,总得存到文件里吧?分析完的结果,总得输出吧?这就涉及到文件读写。
Python 的文件操作很简单,核心就是 open() 函数。但我强烈建议你用 with 语句,它会自动帮你关闭文件,省心省力。
# 写入文件
with open("stock_data.txt", "w", encoding="utf-8") as f:
f.write("股票代码, 名称, 收盘价\n")
f.write("600519, 贵州茅台, 1500.00\n")
f.write("300750, 宁德时代, 220.50\n")
# 读取文件
with open("stock_data.txt", "r", encoding="utf-8") as f:
content = f.read()
print(content)
文件模式有几种:r(读取)、w(写入,会覆盖)、a(追加)。我曾经犯过一个错误——用 w 模式打开一个已有数据的文件,结果里面的内容全没了。嗯,从那以后,我每次写文件前都会确认一下模式。
csv 模块,比自己手动解析要靠谱得多。
第三方库安装:站在巨人的肩膀上
Python 之所以强大,很大程度上是因为它有海量的第三方库。你想做数据分析?有 pandas。你想做科学计算?有 numpy。你想做量化回测?有 backtrader。这些库,都是通过 pip 来安装的。
# 安装第三方库
pip install pandas numpy matplotlib
# 安装指定版本
pip install pandas==1.5.3
# 查看已安装的库
pip list
这里我要特别强调一下虚拟环境。你想想看,项目A需要 pandas 1.5,项目B需要 pandas 2.0,如果装在一起就会冲突。虚拟环境就是给每个项目一个独立的「小房间」,互不干扰。
# 创建虚拟环境
python -m venv myenv
# 激活虚拟环境(Windows)
myenv\Scripts\activate
# 激活虚拟环境(Mac/Linux)
source myenv/bin/activate
# 退出虚拟环境
deactivate
pip install 装了一堆库,结果把系统自带的Python环境搞坏了。后来我学乖了——每个项目都建一个虚拟环境,再也没出过问题。
综合示例:一个简单的股票筛选器
好了,知识点都讲完了。咱们来写一个综合的小例子,把今天的内容串起来。
# 模拟股票数据
stocks = [
{"name": "贵州茅台", "pe": 35.2, "pb": 8.1},
{"name": "宁德时代", "pe": 28.5, "pb": 5.3},
{"name": "招商银行", "pe": 6.8, "pb": 0.9},
{"name": "比亚迪", "pe": 45.0, "pb": 6.7},
]
def filter_stocks(stock_list, max_pe=20, max_pb=3):
"""筛选低估值股票"""
result = []
for stock in stock_list:
if stock["pe"] < max_pe and stock["pb"] < max_pb:
result.append(stock)
return result
# 执行筛选
selected = filter_stocks(stocks)
print("筛选结果:")
for s in selected:
print(f"{s['name']} - PE:{s['pe']} PB:{s['pb']}")
# 保存结果到文件
with open("selected_stocks.txt", "w", encoding="utf-8") as f:
for s in selected:
f.write(f"{s['name']},{s['pe']},{s['pb']}\n")
print("结果已保存到 selected_stocks.txt")
这个例子虽然简单,但已经包含了条件判断、循环、函数定义、文件读写这些核心知识点。你想想看,如果把这个逻辑扩展一下,加上从网络获取真实数据的功能,是不是就是一个迷你版的选股系统了?
好了,这一节的内容就到这儿。代码多敲几遍,手感自然就来了。下一节我们开始接触真正的量化数据——用 pandas 处理表格数据,那才是真正好戏的开始。