第一章:Python量化生态全景
做量化投资这些年,我越来越觉得——选对工具,比选对策略更重要。Python的量化生态,说白了就是一套「从数据到交易」的完整流水线。今天咱们就把这条流水线的每个环节拆开看看。
本章核心脉络:数据获取 → 数据处理 → 可视化分析 → 策略回测
1.1 NumPy:量化计算的基石
NumPy,说白了就是Python里的「超级计算器」。我刚开始做量化时,用纯Python列表算收益率,一个5000只股票的数据集跑了快两分钟。换成NumPy后,同样的计算不到0.1秒。你想想看,这差距有多大。
核心就两个东西:ndarray(多维数组)和ufunc(通用函数)。
我的习惯:拿到行情数据后,第一件事就是转成ndarray。Pandas的DataFrame虽然方便,但底层计算我全用NumPy搞定。
import numpy as np
# 模拟5只股票、20个交易日的收益率数据
returns = np.random.randn(5, 20) * 0.02 # 标准差2%
# 计算每只股票的累计收益率
cum_returns = np.cumprod(1 + returns, axis=1)
print(cum_returns.shape) # (5, 20)
我曾经踩过一个坑:用np.cumprod时忘了加axis参数,结果把整个矩阵压成了一维。嗯,这里要注意——axis=0是按行,axis=1是按列,千万别搞反。
1.2 Pandas:时间序列的瑞士军刀
做量化的人,天天跟时间序列打交道。Pandas的DataFrame和Series,就是为这个场景量身定做的。
我个人最常用的几个功能:
- rolling窗口计算:移动平均、滚动波动率
- resample重采样:日线转周线、分钟转小时
- merge/join合并:把不同数据源拼在一起
- groupby分组聚合:按行业、按日期统计
import pandas as pd
# 构建一个简单的行情DataFrame
dates = pd.date_range('2024-01-01', periods=100, freq='D')
data = pd.DataFrame({
'close': np.random.randn(100).cumsum() + 100,
'volume': np.random.randint(10000, 50000, 100)
}, index=dates)
# 计算20日移动平均
data['ma20'] = data['close'].rolling(20).mean()
# 计算日收益率
data['ret'] = data['close'].pct_change()
避坑指南:我曾经在merge两个DataFrame时,因为索引类型不一致(一个datetime,一个string),结果全成了NaN。后来我养成了习惯——合并前先检查dtypes。
1.3 Matplotlib与Seaborn:让数据说话
做策略研究,光看数字是不够的。一张好图,能让你一眼看出问题。我习惯用Matplotlib画基础图,用Seaborn做统计图。
为什么用两个?Matplotlib灵活但代码啰嗦,Seaborn简洁但定制性差。两者互补,刚刚好。
import matplotlib.pyplot as plt
import seaborn as sns
# 画个K线+均线图(简化版)
plt.figure(figsize=(12, 6))
plt.plot(data.index, data['close'], label='Close', linewidth=1)
plt.plot(data.index, data['ma20'], label='MA20', linestyle='--')
plt.title('Price & Moving Average')
plt.legend()
plt.grid(True, alpha=0.3)
plt.show()
# 收益率分布
sns.histplot(data['ret'].dropna(), bins=50, kde=True)
plt.title('Return Distribution')
plt.show()
我的小技巧:画图时先把plt.style.use('seaborn-v0_8')设好,配色和网格自动就漂亮了。省得每次调参数。
1.4 Backtrader:回测框架入门
Backtrader是我用得最多的回测框架。说实话,它上手有点门槛,但一旦用顺了,非常强大。
核心概念就三个:Data Feed(数据源)、Strategy(策略逻辑)、Cerebro(引擎大脑)。
import backtrader as bt
class SimpleMAStrategy(bt.Strategy):
params = (('ma_period', 20),)
def __init__(self):
self.ma = bt.indicators.SMA(self.data.close, period=self.params.ma_period)
def next(self):
if not self.position:
if self.data.close[0] > self.ma[0]:
self.buy()
else:
if self.data.close[0] < self.ma[0]:
self.sell()
cerebro = bt.Cerebro()
cerebro.addstrategy(SimpleMAStrategy)
# 添加数据、设置初始资金...(此处省略具体数据加载)
cerebro.run()
我曾经犯过的错:在next()方法里用了未来数据——用当天的收盘价判断买入,但实际交易时收盘价还没出来。记住:回测中最容易犯的错就是未来函数。
1.5 数据获取:Tushare与akshare
没有数据,一切都是空谈。国内量化数据接口,我主要用两个:
| 特性 | Tushare | akshare |
|---|---|---|
| 数据覆盖 | A股、基金、期货、宏观 | A股、期货、外汇、另类数据 |
| 使用方式 | 需注册获取token | 无需注册,直接调用 |
| 数据质量 | 高,有校验 | 中等,部分数据来自网络 |
| 频率限制 | 基础版200次/分钟 | 无明确限制 |
# Tushare 示例
import tushare as ts
ts.set_token('your_token_here')
pro = ts.pro_api()
df = pro.daily(ts_code='000001.SZ', start_date='20240101', end_date='20240301')
# akshare 示例
import akshare as ak
df = ak.stock_zh_a_hist(symbol="000001", period="daily",
start_date="20240101", end_date="20240301", adjust="qfq")
我的建议:做研究时先用akshare快速验证想法,等策略定型了再用Tushare做正式回测。akshare免费且方便,但数据偶尔会有缺失,需要自己补全。
好了,这一章我们把Python量化生态的四个核心环节过了一遍。从数据获取到回测验证,每个工具都有自己的定位。下一章我们会深入图神经网络,看看怎么把图结构用到因子挖掘里。
公众号:蓝海资料掘金营,微信deep3321