Python 量化入门:从零到第一个回测脚本
为什么要学 Python
做量化交易,Python 是事实上的标准语言。原因很简单:
- 生态完善——pandas/numpy 做数据分析,matplotlib 画图,backtrader/zipline 做回测
- 上手快——语法接近自然语言,有编程基础的人一周就能上手
- 社区庞大——遇到问题几乎都能搜到答案
- AI 友好——所有 LLM(包括这个 Agent)都精通 Python,不会写?让 AI 帮你写
需要学到什么程度? 够用就行。你不需要成为 Python 专家,只需要能:
- 用 pandas 读取和处理数据
- 写简单的策略逻辑
- 画 K 线图和收益曲线
环境搭建
安装 Python
推荐使用 uv(极速包管理器):
# WSL / Linux
curl -LsSf https://astral.sh/uv/install.sh | sh
# 创建项目环境
uv venv
source .venv/bin/activate
安装必备库
uv pip install pandas numpy matplotlib duckdb
各库的作用:
| 库 | 用途 |
|---|---|
| pandas | 数据处理,表格操作 |
| numpy | 数值计算 |
| matplotlib | 绘图可视化 |
| duckdb | 嵌入式数据库,查行情数据 |
Python 基础——只学有用的
变量和数据类型
# 数字
price = 3.25 # float(浮点数)
shares = 100 # int(整数)
# 字符串
code = '000001.SZ' # str
# 布尔值
is_bullish = True # bool
# 列表(一组数据)
prices = [3.25, 3.28, 3.22, 3.30, 3.27]
条件判断
close = 3.28
ma20 = 3.15
if close > ma20:
print("✅ 收盘价在均线上方,看多信号")
elif close < ma20 * 0.95:
print("❌ 收盘价远低于均线,看空信号")
else:
print("➡️ 横盘震荡,观望")
循环
# 遍历股票列表
stock_codes = ['000001.SZ', '000002.SZ', '000300.SH']
for code in stock_codes:
print(f"正在处理: {code}")
# 批量计算收益率
returns = []
for i in range(1, len(prices)):
daily_return = (prices[i] - prices[i-1]) / prices[i-1]
returns.append(daily_return)
函数
def calc_ma(prices, window=20):
"""计算移动平均线"""
if len(prices) < window:
return None
return sum(prices[-window:]) / window
ma = calc_ma(prices, window=5)
print(f"5日均线: {ma:.2f}")
pandas——量化核心工具
pandas 是量化交易中最常用的库。它的核心是 DataFrame(数据表)。
读取数据
import pandas as pd
# 从 CSV 读取
df = pd.read_csv('daily_data.csv')
# 从 DuckDB 读取
import duckdb
conn = duckdb.connect('data/quant.duckdb')
df = conn.execute("""
SELECT date, open, high, low, close, volume
FROM stock_daily
WHERE code = '000001.SZ'
ORDER BY date
""").fetchdf()
查看数据
df.head() # 前5行
df.tail() # 后5行
df.info() # 数据概况
df.describe() # 统计摘要
输出示例:
date open high low close volume
0 2025-01-02 3.15 3.18 3.12 3.16 1250000
1 2025-01-03 3.16 3.20 3.14 3.19 1380000
2 2025-01-06 3.19 3.22 3.17 3.20 1420000
基础操作
# 选择列
closes = df['close']
# 筛选行
up_days = df[df['close'] > df['open']] # 上涨日
# 新增列
df['return'] = df['close'].pct_change() # 每日收益率
df['ma20'] = df['close'].rolling(20).mean() # 20日均线
# 缺失值处理
df = df.dropna() # 删除空值
时间序列操作
# 设置日期索引
df['date'] = pd.to_datetime(df['date'])
df = df.set_index('date')
# 按时间筛选
df_2025 = df['2025':] # 2025年至今
df_quarter = df['2025-Q1'] # 2025年一季度
# 重采样(日线→月线)
monthly = df['close'].resample('M').last()
monthly_return = monthly.pct_change()
matplotlib——画图看趋势
import matplotlib.pyplot as plt
# 画收盘价和均线
plt.figure(figsize=(12, 6))
plt.plot(df.index, df['close'], label='收盘价', linewidth=1)
plt.plot(df.index, df['ma20'], label='20日均线', linewidth=1.5, linestyle='--')
plt.title('000001.SZ 收盘价走势')
plt.legend()
plt.grid(True, alpha=0.3)
plt.show()
第一个策略回测脚本
把学到的知识用起来——写一个简单的双均线策略:
import pandas as pd
import duckdb
# 1. 读取数据
conn = duckdb.connect('data/quant.duckdb')
df = conn.execute("""
SELECT date, close FROM stock_daily
WHERE code = '000001.SZ' AND date >= '2020-01-01'
ORDER BY date
""").fetchdf()
df['date'] = pd.to_datetime(df['date'])
# 2. 计算均线
df['ma5'] = df['close'].rolling(5).mean()
df['ma20'] = df['close'].rolling(20).mean()
# 3. 生成信号
df['signal'] = 0
df.loc[df['ma5'] > df['ma20'], 'signal'] = 1 # 金叉:买入
df.loc[df['ma5'] <= df['ma20'], 'signal'] = 0 # 死叉:卖出
# 4. 计算持仓和收益
df['position'] = df['signal'].shift(1) # 次日开盘执行
df['return'] = df['close'].pct_change()
df['strategy'] = df['position'] * df['return']
# 5. 统计结果
total_return = (df['strategy'] + 1).prod() - 1
days = len(df)
annual_return = (1 + total_return) ** (252 / days) - 1
print(f"📊 === 双均线策略回测 ===")
print(f"回测周期: {df['date'].iloc[0].date()} ~ {df['date'].iloc[-1].date()}")
print(f"总收益率: {total_return:.2%}")
print(f"年化收益率: {annual_return:.2%}")
print(f"交易天数: {days}")
下一步
Python 基础已经够用了。你已经能:
- ✅ 搭建 Python 环境
- ✅ 用 pandas 处理数据
- ✅ 写简单的策略逻辑
- ✅ 算收益率
接下来进入真正的量化实战:
- DuckDB 搭建 A 股量化数据库 →——管理全市场数据
- 布林带均值回归策略 →——第一个完整策略
- Barra 10 因子选股 →——专业级因子框架
本文是量化学习路径的第 1 步。