3、Python基础速通(上):变量与数据类型、字符串操作、列表与字典、元组与集合

说实话,很多新手学Python,上来就被各种数据类型搞晕了。我当年也是。但做量化交易这些年,我越来越觉得——这些基础东西,恰恰是后面写策略、做回测的根基。今天咱们就把这块啃透。

3.1 变量与数据类型:先搞清楚你的数据长什么样

变量是什么?说白了就是给数据贴个标签。你想想看,在量化交易里,我们天天跟价格、成交量、时间戳打交道,总得有个名字来称呼它们吧?

# 这是我写策略时最常用的几种变量
price = 15.68          # 浮点数,存股价
volume = 23500         # 整数,存成交量
stock_name = "贵州茅台" # 字符串,存股票名称
is_buy_signal = True   # 布尔值,存买卖信号

Python是动态类型语言,这点跟C++、Java不一样。你不用提前声明变量类型,直接赋值就行。我个人习惯是:变量名要见名知意,别用a、b、c这种。

核心数据类型速查表

类型 示例 量化场景
int 100, -5, 0 成交量、持仓量
float 3.14, -0.05 股价、收益率
str "AAPL", "2024-01-15" 股票代码、日期
bool True, False 信号判断、条件过滤

我的小技巧:在写回测框架时,我习惯用type()函数随时检查变量类型。特别是从数据库或API取数据时,类型不对是常见的坑。

3.2 字符串操作:处理股票代码和交易日志

字符串在量化里太常用了。股票代码、交易日期、日志信息,全是字符串。我记得有一次写爬虫抓取财报数据,就因为字符串编码问题折腾了一下午。

# 字符串基础操作
code = "sh600519"
print(code.upper())      # 转大写:SH600519
print(code[2:])          # 切片:600519
print(code.startswith("sh"))  # 判断前缀:True

# 格式化输出(我写日志最爱用)
price = 168.50
log = f"当前价格:{price:.2f} 元"
print(log)  # 当前价格:168.50 元

这里要特别提一下f-string。Python 3.6之后引入的,比之前的%格式化、format()方法都方便。我在所有策略代码里都用它。

避坑指南:我曾经在读取CSV文件时,发现股票代码"000001"被读成了数字1。原因就是没指定dtype=str。记住:股票代码永远是字符串,别偷懒。

3.3 列表与字典:量化数据的左膀右臂

列表和字典,可以说是Python里最重要的两种数据结构。做量化交易,你每天都会跟它们打交道。

列表:有序的数据集合

列表就像是一个购物清单,按顺序存放数据。我常用它来存历史价格序列。

# 列表操作
prices = [15.2, 15.5, 15.3, 15.8, 16.0]
prices.append(16.2)      # 添加新价格
prices.insert(0, 15.0)   # 在开头插入
last_3 = prices[-3:]     # 取最近3个价格
print(f"最高价:{max(prices)}")  # 16.2

字典:键值对的威力

字典是Python的"瑞士军刀"。它用键(key)来查找值(value),速度极快。我用来存股票信息、配置参数、回测结果。

# 字典操作
stock_info = {
    "code": "600519",
    "name": "贵州茅台",
    "close": 1680.50,
    "volume": 23500
}

# 访问与修改
print(stock_info["name"])      # 贵州茅台
stock_info["close"] = 1690.00  # 更新价格
stock_info["high"] = 1700.00   # 新增字段

# 安全取值(避免KeyError)
pe = stock_info.get("pe_ratio", "暂无数据")
print(pe)  # 暂无数据

实战经验:我在做多因子选股时,会用字典嵌套列表的结构:{"股票A": [因子1, 因子2, ...], "股票B": [...]}。这样既保留了股票维度,又方便计算因子矩阵。

3.4 元组与集合:不可变与去重

元组和集合,用的人相对少一些。但它们在特定场景下特别好用。

元组:不可变的列表

元组一旦创建就不能修改。我用来存那些不应该被改动的数据,比如交易参数、坐标点。

# 元组应用
trade_params = (0.001, 5, 20)  # 手续费率、滑点、最大持仓天数
# trade_params[0] = 0.002  # 这行会报错!元组不可修改

# 函数返回多个值(实际返回的是元组)
def get_price_stats(prices):
    return min(prices), max(prices), sum(prices)/len(prices)

low, high, avg = get_price_stats([15, 16, 14, 17])
print(f"区间:{low}-{high},均价:{avg:.2f}")

集合:自动去重

集合的核心特性是:元素唯一、无序。我常用它来去重、做集合运算。

# 集合操作
stock_pool_1 = {"茅台", "五粮液", "泸州老窖"}
stock_pool_2 = {"茅台", "洋河", "汾酒"}

# 去重合并
all_stocks = stock_pool_1 | stock_pool_2
print(all_stocks)  # {'茅台', '五粮液', '泸州老窖', '洋河', '汾酒'}

# 找共同持仓
common = stock_pool_1 & stock_pool_2
print(common)  # {'茅台'}

我的习惯:在清洗数据时,我会先用集合检查股票代码是否有重复。如果有重复,说明数据源有问题,需要排查。

3.5 知识体系总览

下面这张图,是我梳理的本章知识结构。你可以把它当作一个"地图",学完后再回来看,会更有感觉。

Python基础数据类型 数字类型 int(整数) float(浮点数) complex(复数) 序列类型 str(字符串) list(列表) tuple(元组) 映射类型 dict(字典) 键值对存储 O(1)查找 集合类型 set(集合) frozenset 去重利器 量化交易应用场景 • 价格序列 → list • 股票信息 → dict • 交易参数 → tuple • 股票池去重 → set • 日志输出 → str • 收益率计算 → float

嗯,到这里,Python基础数据类型的核心内容就讲完了。这些概念看起来简单,但真正用好它们,需要在实际项目中反复练习。我个人建议:打开你的Python环境,把上面的代码都敲一遍,改一改参数,看看输出有什么变化。

记住一句话:代码是写出来的,不是看出来的。


专注资料整理