第一章:Python量化生态全景

做量化投资这些年,我越来越觉得——选对工具,比选对策略更重要。Python的量化生态,说白了就是一套「从数据到交易」的完整流水线。今天咱们就把这条流水线的每个环节拆开看看。

本章核心脉络:数据获取 → 数据处理 → 可视化分析 → 策略回测

数据获取 Tushare / akshare 数据处理 NumPy / Pandas 可视化 Matplotlib / Seaborn 回测 Backtrader 图因子挖掘与量化策略设计 · 数据流水线 API接口 数组/DataFrame 图表分析 策略验证

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