条件判断、循环语句、函数定义、模块与包管理
说实话,Python 基础语法里,条件判断和循环是最常用的两块。我做了这么多年量化交易系统,每天写的代码里,至少一半都在做「如果…就…」或者「遍历每个数据」这类操作。今天咱们就把这块彻底捋清楚。
条件判断:if / elif / else
条件判断说白了就是让代码做选择题。Python 的写法很简洁,没有花括号,全靠缩进。
price = 105.5
if price > 100:
print("价格超过100,考虑卖出")
elif price > 80:
print("价格在80-100之间,持有观察")
else:
print("价格低于80,考虑买入")
我在项目中遇到过一个问题:新手容易把 elif 写成 else if。Python 里没有 else if,只有 elif。嗯,这个坑我踩过一次,调试了半天才发现。
循环语句:for 和 while
循环就是重复做某件事。量化交易里最常见的场景:遍历历史 K 线数据、遍历股票列表、遍历策略参数。
for 循环
# 遍历股票代码列表
stocks = ["000001", "600036", "300750"]
for code in stocks:
print(f"正在处理股票: {code}")
你想想看,如果不用循环,处理 3000 只股票得写多少行代码?
range() 函数
需要按索引遍历时,range() 就派上用场了。
for i in range(5):
print(f"第{i+1}次迭代")
range(5) 生成 0 到 4 的整数序列。注意,它不包含 5。我刚开始学的时候老记混,后来就记住「左闭右开」这个原则。
while 循环
while 适合你不知道要循环多少次的情况。比如等待某个条件满足。
balance = 10000
target = 20000
while balance < target:
balance *= 1.01 # 每天增长1%
print(f"当前余额: {balance:.2f}")
函数定义:def
函数就是把一段逻辑封装起来,方便重复使用。量化交易系统里,函数无处不在:计算均线、生成交易信号、计算收益率…
def calculate_sma(prices, window=5):
"""计算简单移动平均线"""
if len(prices) < window:
return None
sma = sum(prices[-window:]) / window
return sma
# 使用函数
close_prices = [10, 11, 12, 13, 14, 15]
result = calculate_sma(close_prices, 3)
print(f"3日均线: {result}")
我个人习惯给函数写文档字符串(docstring),就是函数体第一行的那个三引号注释。这样过几个月回头看代码,还能记得当初为什么这么写。
参数传递
Python 的参数传递有点特殊。不可变类型(int、str、tuple)传的是值,可变类型(list、dict)传的是引用。
def modify_list(lst):
lst.append(100) # 会修改原列表
my_list = [1, 2, 3]
modify_list(my_list)
print(my_list) # 输出 [1, 2, 3, 100]
为什么会这样?因为列表是可变对象,函数内部修改会影响外部。这个特性在写策略时特别容易踩坑,我曾经因为没注意这个,回测结果一直对不上。
模块与包管理
写量化系统,不可能把所有代码塞到一个文件里。模块和包就是用来组织代码的。
模块
一个 .py 文件就是一个模块。用 import 导入。
# 假设有一个文件叫 data_utils.py
# 里面定义了函数 fetch_stock_data()
# 在另一个文件中导入
import data_utils
data = data_utils.fetch_stock_data("000001")
# 也可以直接导入函数
from data_utils import fetch_stock_data
data = fetch_stock_data("000001")
包
包就是一个包含 __init__.py 文件的文件夹。多个模块放在一起就成了包。
my_quant_system/
├── __init__.py
├── data/
│ ├── __init__.py
│ ├── fetcher.py
│ └── cleaner.py
├── strategy/
│ ├── __init__.py
│ ├── ma_strategy.py
│ └── momentum.py
└── utils/
├── __init__.py
└── logger.py
导入包里的模块:
from my_quant_system.data import fetcher
from my_quant_system.strategy.ma_strategy import MaStrategy
知识体系总览
下面这张图把本章的核心逻辑串起来了。条件判断和循环是基础控制流,函数是代码复用的最小单元,模块和包则是更大粒度的组织方式。
避坑指南
最后分享几个我踩过的坑:
- 缩进问题:Python 用缩进表示代码块,混用空格和 Tab 会报错。我建议统一用 4 个空格。
- 循环中修改列表:遍历列表时不要删除元素,否则索引会乱。可以先生成副本再操作。
- 模块循环导入:A 模块导入 B,B 又导入 A,会报错。设计时要避免这种依赖关系。
- 默认参数陷阱:函数的默认参数如果是可变对象(如列表),多次调用会累积修改。用
None加判断可以解决。
好了,这一章的内容就这些。条件判断、循环、函数、模块,这四个东西是写量化系统的基本功。练熟了,后面写策略、做回测就顺手多了。