3、Python基础速通(上):变量与数据类型、列表与字典、条件判断与循环、函数定义与调用

说实话,很多做量化交易的朋友,一开始都被Python吓住了。觉得编程很难,门槛高。其实真不是这样。

Python说白了就是一门「用起来很舒服」的语言。我当年从C++转过来的时候,第一反应是——这也太省事了吧?你不用管内存,不用管类型声明,写起来就像在写伪代码。

这一章,咱们就把Python最核心的几个基础啃下来。别贪多,这几个东西搞明白了,后面写策略、跑回测,基本够用。

本章核心目标:掌握变量、列表、字典、条件判断、循环、函数。这些是量化交易代码的「砖块」和「水泥」。

Python基础速通(上)知识体系 Python 核心基础 变量与数据类型 列表与字典 条件判断与循环 函数 int / float / str bool / None 列表:有序可变 字典:键值对 if / elif / else for / while def / return 量化交易策略代码基础

3.1 变量与数据类型——先搞清楚你的「盒子」

变量是什么?我习惯把它想象成一个「贴了标签的盒子」。你把数据放进去,然后通过标签来拿。

# 这就是变量赋值
price = 100.5        # 浮点数,存价格
volume = 5000        # 整数,存成交量
symbol = "BTC/USDT"  # 字符串,存交易对
is_active = True     # 布尔值,存状态

Python是动态类型语言。什么意思?你不需要提前告诉它「我要存整数了」。直接赋值就行,它会自己判断。

我的小习惯:变量名尽量用有意义的英文。比如用 close_price 而不是 cp。你想想看,三个月后回来看代码,cp 到底是收盘价还是成交对?我自己就吃过这个亏。

常用的数据类型就这几种:

类型 例子 说明
int 100 整数,比如成交量、持仓量
float 3.14159 浮点数,比如价格、收益率
str "ETH" 字符串,比如交易对、日期
bool True 布尔值,用于条件判断
None None 空值,表示「没有数据」

注意:Python里 None 不等于 False,也不等于空字符串。我曾经在判断数据是否缺失时,直接用 if data == None,结果踩坑了。正确写法是 if data is None

3.2 列表与字典——量化数据的「容器」

做量化交易,你不可能只处理一个价格。你需要处理一串价格、一堆订单、一组参数。这时候就需要容器了。

列表:有序的序列

列表用方括号 [],里面的元素按顺序排好。你可以往里面加东西、删东西、改东西。

# 存储一组收盘价
close_prices = [100.5, 101.2, 99.8, 102.0, 100.3]

# 获取第3个价格(索引从0开始)
print(close_prices[2])  # 输出 99.8

# 添加新价格
close_prices.append(103.1)

# 切片:取最近3个价格
recent_3 = close_prices[-3:]
print(recent_3)  # 输出 [102.0, 100.3, 103.1]

我个人特别喜欢用列表推导式,一行代码搞定循环操作:

# 计算所有价格的2倍(列表推导式)
double_prices = [p * 2 for p in close_prices]
print(double_prices)

字典:键值对的映射

字典用花括号 {},存的是「键:值」对。比如你要存一个交易对的多个属性:

# 存储一个交易对的信息
symbol_info = {
    "name": "BTC/USDT",
    "price": 50000.0,
    "volume": 1200.5,
    "high_24h": 51000.0,
    "low_24h": 49000.0
}

# 获取价格
print(symbol_info["price"])  # 输出 50000.0

# 添加新字段
symbol_info["change_24h"] = 2.5

避坑指南:[] 访问字典时,如果键不存在会报错。我建议用 .get() 方法,安全很多:symbol_info.get("volume", 0),找不到就返回默认值0。

3.3 条件判断与循环——让代码「活」起来

光有数据还不够,你得让代码根据情况做决策,或者重复做某件事。

条件判断:if / elif / else

说白了就是「如果...就...否则...」。量化策略里到处都是这种逻辑。

current_price = 102.5
ma_20 = 100.0  # 20日均线

if current_price > ma_20:
    print("价格在均线上方,考虑做多")
elif current_price < ma_20:
    print("价格在均线下方,考虑做空")
else:
    print("价格等于均线,观望")

嗯,这里要注意:Python用缩进来表示代码块,不是花括号。缩进不对,代码就报错。我刚开始学的时候,经常因为空格和Tab混用而抓狂。

循环:for 和 while

处理历史数据时,循环是少不了的。

# for循环:遍历列表
prices = [100, 101, 102, 99, 98]
for price in prices:
    print(f"当前价格: {price}")

# 带索引的遍历
for i, price in enumerate(prices):
    print(f"第{i+1}个价格: {price}")

# while循环:条件满足就一直执行
count = 0
while count < 5:
    print(f"循环第{count+1}次")
    count += 1

实战经验:我在写回测引擎时,经常用 for 循环遍历历史K线数据。但要注意,如果数据量很大(比如几百万条),纯Python循环会很慢。这时候我会用 numpy 或者 pandas 的向量化操作来替代。不过那是后面章节的内容了。

3.4 函数定义与调用——把逻辑「封装」起来

函数是什么?就是把一段重复用的代码打包,起个名字。需要的时候直接调用。

# 定义一个计算移动平均线的函数
def calculate_ma(prices, period=5):
    """计算简单移动平均线"""
    if len(prices) < period:
        return None
    
    ma_values = []
    for i in range(len(prices) - period + 1):
        window = prices[i:i+period]
        ma = sum(window) / period
        ma_values.append(ma)
    return ma_values

# 调用函数
close_prices = [100, 101, 102, 103, 104, 105]
ma_5 = calculate_ma(close_prices, 5)
print(f"5日均线: {ma_5}")

函数的好处很明显:

  • 复用性:写一次,到处用
  • 可读性:函数名就说明了它干什么
  • 可测试性:可以单独测试每个函数

我的建议:每个函数只做一件事。如果一个函数又算均线、又算波动率、又画图,那它太「胖」了。拆成小函数,调试起来轻松很多。

函数还可以有默认参数。比如上面 period=5,你不传参数就用5,传了就覆盖。这个在量化策略里很实用,比如不同周期均线可以共用同一个函数。

注意:函数的默认参数如果是可变对象(比如列表、字典),会有坑。我曾经写过 def add_order(order, orders=[]),结果多次调用后,orders 会累积之前的所有订单。正确做法是用 None 作为默认值,内部再初始化。

好了,这一章的内容就这些。变量、列表、字典、条件判断、循环、函数——这六个东西,是Python量化交易的「基本功」。别觉得简单,我见过很多老手,代码写得花里胡哨,结果连列表切片和字典的 .get() 都用不利索。

把这些基础打牢,后面写策略、做回测,你会觉得越来越顺手。


公众号:蓝海资料掘金营,微信deep3321