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