第三讲:Python基础回顾(一)——变量与数据类型、字符串操作、列表与元组、字典与集合
各位同学,欢迎来到第三讲。
说实话,很多做量化交易的新手,一上来就急着写策略、调参数。结果呢?连个简单的数据清洗都搞不定。我见过太多人因为基础不牢,在回测时被一个小小的类型错误卡住半天。
这一讲,咱们把Python最核心的几种数据结构彻底捋一遍。别嫌基础,这些东西在量化系统里天天用。你想想看,K线数据用什么存?订单簿用什么表示?账户信息怎么组织?答案都在这一讲里。
核心观点: 量化交易的本质是数据处理。变量是容器,数据结构是组织方式。选对数据结构,代码效率能差出几个数量级。
1. 变量与数据类型——代码的“地基”
变量,说白了就是给数据贴个标签。Python是动态类型语言,你不需要声明类型,直接赋值就行。但这不代表你可以乱来。
# 常见的几种数据类型
price = 12.58 # float,浮点数
volume = 10000 # int,整数
symbol = "BTCUSDT" # str,字符串
is_active = True # bool,布尔值
order_list = [] # list,列表
account_info = {} # dict,字典
我个人习惯,在量化代码里,变量名一定要见名知意。别用 a、b、tmp 这种名字。你三天后回来看,绝对想不起来它代表什么。
小技巧: 用 type() 函数随时检查变量类型。我在调试策略时,经常在关键位置打印类型,很多诡异bug都是类型不匹配引起的。
2. 字符串操作——文本处理的核心
量化交易里,字符串操作主要用在几个地方:解析交易所返回的JSON、拼接API请求参数、格式化日志输出。
# 字符串格式化(我推荐 f-string)
symbol = "ETHUSDT"
price = 2345.6789
print(f"当前价格:{symbol} = {price:.2f}") # 输出:当前价格:ETHUSDT = 2345.68
# 字符串分割与拼接
trade_data = "2024-01-15,09:30:00,45000.5,0.1"
date, time, price, volume = trade_data.split(",")
print(f"交易时间:{date} {time}")
我曾经在写一个高频数据解析模块时,因为没处理好字符串里的空格和换行符,导致整个订单流解析错位。嗯,这里要注意:strip() 和 replace() 是你的好朋友。
避坑指南: 我曾经在拼接长字符串时用 + 号,结果在循环里性能惨不忍睹。大量字符串拼接,请用 join() 方法,效率高一个数量级。
3. 列表与元组——有序数据的“双胞胎”
列表和元组,都是有序序列。区别就一个:列表可变,元组不可变。这个区别在量化系统里非常关键。
# 列表——存储K线数据
kline_data = [
[1705305600, 42000.5, 42500.0, 41800.0, 42250.0, 1234.5],
[1705305660, 42250.0, 42300.0, 42100.0, 42180.0, 987.3]
]
# 元组——存储固定配置
TRADING_CONFIG = ("BTCUSDT", 0.001, 10) # 交易对、最小下单量、最大持仓
我个人习惯,把不会变的数据用元组存。比如交易所的API端点、交易对的固定参数。这样代码更安全,也更容易理解——看到元组就知道这数据不该被修改。
实战经验: 列表推导式是Python的精华。我在写策略信号生成时,一行列表推导式能顶五行的for循环。比如:signals = [1 if price > ma else -1 for price, ma in zip(prices, mas)]
4. 字典与集合——键值对与去重利器
字典,说白了就是“键-值”映射表。在量化系统里,字典几乎无处不在:账户信息、订单状态、持仓数据……
# 字典——存储账户信息
account = {
"balance": 100000.0,
"positions": {
"BTCUSDT": 0.5,
"ETHUSDT": 10.0
},
"orders": []
}
# 集合——快速去重
symbols = ["BTCUSDT", "ETHUSDT", "BTCUSDT", "SOLUSDT"]
unique_symbols = set(symbols) # {'BTCUSDT', 'ETHUSDT', 'SOLUSDT'}
集合的查找速度是O(1),列表是O(n)。你想想看,如果你的策略里要频繁检查某个币种是否在自选列表里,用集合比用列表快得多。我在做全市场扫描时,就用集合来管理监控列表,速度提升非常明显。
小技巧: 字典的 get() 方法可以设置默认值。比如 price = data.get("close", 0.0),这样即使键不存在也不会报错。我在解析不完整的行情数据时经常用。
知识体系总览
下面这张图,把这一讲的核心知识点串起来了。你可以把它当作一个快速索引,复习时一眼就能看到重点。
总结与实战要点
这一讲的内容,说白了就是量化交易的“内功心法”。你不需要背下来,但要用的时候能立刻想到用哪个数据结构。
- 变量命名:用有意义的英文,别用拼音或缩写
- 字符串:优先用f-string,拼接用join()
- 列表:适合存储时序数据,如K线序列
- 元组:适合存储固定配置,不可变更安全
- 字典:适合存储键值映射,如账户信息
- 集合:适合去重和快速成员检查
我的建议: 学完这一讲,立刻打开你的编辑器,把上面这些代码敲一遍。然后想想,你手头的量化项目里,哪些地方可以用字典代替列表?哪些地方可以用集合优化查找?动手改一改,感受一下差别。