第1章:工欲善其事,必先利其器
做量化交易,说白了就是跟数据打交道。有色金属这个领域,数据量说大不大,说小也不小——日线数据、分钟数据、库存数据、升贴水、LME持仓……要是没有一套顺手的工具,光整理数据就能把你累趴下。
我刚开始做有色金属量化的时候,用的是Excel+VBA。后来数据量上来了,Excel直接卡死。那叫一个崩溃。后来转到了Python,才算是打开了新世界的大门。
这一章,咱们就把环境搭好。别嫌麻烦,这一步做好了,后面30章你会感谢我的。
1.1 Anaconda:一站式数据科学工具箱
Python本身是个好语言,但它的包管理有点让人头疼。你装个numpy,发现要依赖这个那个,版本还对不上。我当年就踩过这个坑,装个库装了一下午。
Anaconda就是来解决这个问题的。它把Python解释器、常用的数据科学库、包管理器conda,一股脑全给你打包好了。你下载一个,就等于拥有了一个完整的数据科学环境。
- 自带150+常用数据科学库,省去手动安装的麻烦
- conda包管理器能自动处理依赖关系,避免版本冲突
- 支持创建虚拟环境,不同项目用不同Python版本,互不干扰
安装步骤很简单,去官网下载对应系统的版本就行。我个人建议选Python 3.9或3.10版本,太新的版本有些库还没适配好。
1.2 Jupyter Notebook:交互式编程利器
装好Anaconda,你就自动拥有了Jupyter Notebook。这东西有多好用?这么说吧,我现在80%的量化分析工作都在上面完成。
Jupyter Notebook把代码、运行结果、图表、文字说明整合在一个文档里。你写一段代码,立刻就能看到结果。发现不对?改一下重新运行。这种即时反馈的感觉,比写脚本然后运行看输出爽太多了。
- Cell(单元格):代码写在这里,按Shift+Enter运行
- Markdown模式:可以写文字说明、公式、标题
- 魔法命令:比如%matplotlib inline让图表直接显示在Notebook里
启动方法:打开终端(或Anaconda Prompt),输入jupyter notebook,浏览器就会自动打开一个页面。新建一个Notebook,就可以开始你的量化之旅了。
1.3 NumPy:高性能数值计算基础
做量化交易,离不开数组和矩阵运算。Python自带的列表虽然能用,但速度太慢。举个例子,计算100万个数的平方,用列表要几百毫秒,用NumPy只要几毫秒。
NumPy的核心是ndarray(N维数组)。它比Python列表快的原因有两个:一是底层用C语言实现,二是支持向量化运算——说白了就是一次性对整个数组操作,不用写循环。
import numpy as np
# 创建数组
prices = np.array([68000, 68200, 67900, 68500, 68300])
# 向量化运算:计算收益率
returns = (prices[1:] - prices[:-1]) / prices[:-1]
print(returns)
# 输出: [ 0.0029 -0.0044 0.0088 -0.0029]
# 统计指标
print(f"均值: {np.mean(returns):.4f}")
print(f"标准差: {np.std(returns):.4f}")
我在项目中经常用NumPy处理LME铜的日线数据。几万行数据,计算移动平均、波动率,都是一瞬间的事。
np.diff()或手动切片,心里更有底。
1.4 Pandas:表格数据处理神器
如果说NumPy是数组,那Pandas就是带标签的表格。它有两个核心数据结构:Series(一维)和DataFrame(二维)。
DataFrame就像Excel表格,但功能强大得多。你可以按条件筛选、分组聚合、合并连接、处理缺失值……而且语法非常直观。
import pandas as pd
# 创建DataFrame
data = {
'日期': ['2024-01-02', '2024-01-03', '2024-01-04'],
'沪铜主力': [68000, 68200, 67900],
'沪铝主力': [19200, 19150, 19300]
}
df = pd.DataFrame(data)
df['日期'] = pd.to_datetime(df['日期'])
df.set_index('日期', inplace=True)
# 计算涨跌幅
df['铜涨跌幅'] = df['沪铜主力'].pct_change()
print(df)
Pandas最让我喜欢的是它的时间序列功能。有色金属数据天然带有时间属性,Pandas的resample、rolling、shift这些方法,简直就是为量化交易量身定做的。
| 操作 | 代码 | 说明 |
|---|---|---|
| 读取CSV | pd.read_csv('data.csv') | 最常用的数据导入方式 |
| 查看前5行 | df.head() | 快速预览数据 |
| 描述统计 | df.describe() | 均值、标准差、分位数等 |
| 条件筛选 | df[df['价格'] > 70000] | 选出价格大于70000的行 |
| 分组聚合 | df.groupby('品种').mean() | 按品种分组计算均值 |
1.5 Matplotlib与Seaborn:数据可视化入门
数据算出来了,怎么看?光看数字不够直观。一张好的图表,能让你一眼看出趋势、异常点、相关性。
Matplotlib是Python可视化的老祖宗,功能强大但API有点啰嗦。Seaborn是在Matplotlib基础上封装的,图表更漂亮,代码更简洁。
import matplotlib.pyplot as plt
import seaborn as sns
# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 生成示例数据
dates = pd.date_range('2024-01-01', periods=100, freq='D')
prices = 68000 + np.cumsum(np.random.randn(100) * 200)
# Matplotlib画折线图
plt.figure(figsize=(10, 5))
plt.plot(dates, prices, label='沪铜价格', color='#E74C3C')
plt.title('沪铜期货价格走势')
plt.xlabel('日期')
plt.ylabel('价格(元/吨)')
plt.legend()
plt.grid(True, alpha=0.3)
plt.show()
# Seaborn画分布图
plt.figure(figsize=(8, 4))
sns.histplot(prices, bins=20, kde=True, color='#3498DB')
plt.title('价格分布')
plt.show()
我个人习惯用Matplotlib做精细调整,用Seaborn做快速探索。比如看两个品种的相关性,sns.pairplot()一行代码就能画出所有组合的散点图矩阵,非常方便。
本章知识体系
下面这张图,帮你理清本章的知识脉络:
环境搭好了,后面的事情就顺了。记住,工具只是手段,关键还是你对市场的理解。但话说回来,连工具都用不顺,再好的策略也跑不出来。
嗯,这一章就到这儿。把Anaconda装好,打开Jupyter Notebook,跑一遍上面的代码。有问题随时查文档,或者回来翻翻这一章。