第三讲: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,字典

我个人习惯,在量化代码里,变量名一定要见名知意。别用 abtmp 这种名字。你三天后回来看,绝对想不起来它代表什么。

小技巧: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),这样即使键不存在也不会报错。我在解析不完整的行情数据时经常用。

知识体系总览

下面这张图,把这一讲的核心知识点串起来了。你可以把它当作一个快速索引,复习时一眼就能看到重点。

Python基础数据结构 变量与数据类型 int, float, str, bool 动态类型,无需声明 字符串操作 f-string格式化 split/join/strip 列表与元组 列表可变,元组不可变 列表推导式 字典与集合 键值对映射 集合O(1)查找 量化交易应用场景 K线数据存储 列表嵌套 订单簿管理 字典+列表 账户信息 嵌套字典 核心原则:选对数据结构,代码效率翻倍 可变 vs 不可变 | 有序 vs 无序 | O(1) vs O(n)

总结与实战要点

这一讲的内容,说白了就是量化交易的“内功心法”。你不需要背下来,但要用的时候能立刻想到用哪个数据结构。

  • 变量命名:用有意义的英文,别用拼音或缩写
  • 字符串:优先用f-string,拼接用join()
  • 列表:适合存储时序数据,如K线序列
  • 元组:适合存储固定配置,不可变更安全
  • 字典:适合存储键值映射,如账户信息
  • 集合:适合去重和快速成员检查

我的建议: 学完这一讲,立刻打开你的编辑器,把上面这些代码敲一遍。然后想想,你手头的量化项目里,哪些地方可以用字典代替列表?哪些地方可以用集合优化查找?动手改一改,感受一下差别。

专注资料整理