条件判断、循环语句、函数定义、模块与包管理

说实话,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。嗯,这个坑我踩过一次,调试了半天才发现。

小技巧:条件判断时,尽量把最可能成立的条件放在前面。这样程序能更快地找到匹配项,虽然 Python 优化得不错,但养成好习惯总没错。

循环语句: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}")
注意:while 循环一定要有终止条件,否则就是死循环。我曾经在回测系统里写了个死循环,CPU 直接跑满,电脑风扇呼呼转了半天才发现。

函数定义: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
核心要点:模块和包的核心作用就是「分而治之」。把不同功能的代码分开,维护起来轻松得多。我见过有人把整个量化系统写在一个 5000 行的文件里…那滋味,谁改谁知道。

知识体系总览

下面这张图把本章的核心逻辑串起来了。条件判断和循环是基础控制流,函数是代码复用的最小单元,模块和包则是更大粒度的组织方式。

Python基础回顾(二):核心知识体系 Python 基础控制流 条件判断 循环语句 函数定义 模块与包管理 if / elif / else 嵌套条件 for 循环 while 循环 参数传递 返回值 import from...import 代码复用 + 逻辑控制 = 高效量化系统

避坑指南

最后分享几个我踩过的坑:

  • 缩进问题:Python 用缩进表示代码块,混用空格和 Tab 会报错。我建议统一用 4 个空格。
  • 循环中修改列表:遍历列表时不要删除元素,否则索引会乱。可以先生成副本再操作。
  • 模块循环导入:A 模块导入 B,B 又导入 A,会报错。设计时要避免这种依赖关系。
  • 默认参数陷阱:函数的默认参数如果是可变对象(如列表),多次调用会累积修改。用 None 加判断可以解决。

好了,这一章的内容就这些。条件判断、循环、函数、模块,这四个东西是写量化系统的基本功。练熟了,后面写策略、做回测就顺手多了。


专注资料整理