3、Python基础速通(上):变量与数据类型、列表与字典、条件判断与循环、函数定义与调用
说实话,很多做量化交易的朋友,一开始都被Python吓住了。觉得编程很难,门槛高。其实真不是这样。
Python说白了就是一门「用起来很舒服」的语言。我当年从C++转过来的时候,第一反应是——这也太省事了吧?你不用管内存,不用管类型声明,写起来就像在写伪代码。
这一章,咱们就把Python最核心的几个基础啃下来。别贪多,这几个东西搞明白了,后面写策略、跑回测,基本够用。
本章核心目标:掌握变量、列表、字典、条件判断、循环、函数。这些是量化交易代码的「砖块」和「水泥」。
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