Python 量化,简单说就是用 Python 编程语言 + 配套工具库,自动完成金融数据获取、分析、交易策略开发、历史回测、甚至自动交易的过程。它不是某种神奇的 "赚钱公式",而是一套用程序替代人工盯盘、人工计算、人工决策的工具方法 ------ 核心优势是高效、客观、可验证,能避免人性的贪婪恐惧带来的决策失误。
本文从概念、工具、流程到完整实战案例,全程用通俗语言 + 可运行代码 + 逐行解释,零基础也能理解量化的完整逻辑,跑通第一个入门策略。
⚠️ 重要风险提示:本文所有内容仅为技术学习演示,不构成任何投资建议。股市有风险,投资需谨慎,新手务必先从历史回测练手,不要盲目实盘交易。
一、先搞懂:Python 量化能做什么?核心优势
1. 通俗类比
就像你开奶茶店:
- 人工交易 = 老板自己每天手工算账、手工进货、手工做奶茶,效率低、容易累、情绪不好的时候还容易做错
- Python 量化 = 买了一套自动化设备 + 管理系统:自动统计销量、自动算进货量、自动做奶茶,严格按规则来,不会累、不会情绪化
2. 核心用途
- 批量数据分析:一次性分析几千只股票的历史数据,筛选符合条件的标的,人工筛选要几天,程序几秒搞定
- 策略回测验证:用过去几年的历史数据,模拟你的买卖规则跑一遍,看看过去赚不赚钱、最大亏多少,不用真金白银试错
- 自动盯盘交易:程序 24 小时监控行情,满足条件自动下单,不用天天盯盘
- 风险控制:严格执行止损、止盈规则,避免亏损时舍不得卖、盈利时贪多等人性问题
3. 新手最容易有的误区
❌ 错误:量化 = 稳赚不赔 ✅ 事实:量化只是工具,策略本身好不好才决定盈亏,差的策略用程序跑只会亏得更快 ❌ 错误:量化必须懂复杂的数学、算法 ✅ 事实:入门级的均线策略、网格策略,只需要基础 Python + 简单逻辑就能实现,新手也能上手
二、新手必备:量化核心工具库
Python 量化的生态非常成熟,不同工具负责不同环节,新手先掌握最核心的几个即可,不用一次性全学。
| 分类 | 工具库 | 作用 | 新手推荐度 |
|---|---|---|---|
| 数据获取 | AkShare | 免费开源的财经数据库,股票、基金、期货、宏观数据都能拿,不用注册、不用积分,新手首选 | ⭐⭐⭐⭐⭐ |
| 数据获取 | Tushare | 数据更全更专业,但高级数据需要积分,适合进阶 | ⭐⭐⭐ |
| 数据处理 | pandas | 表格数据处理神器,算指标、清洗数据、筛选标的全靠它,是量化的基础 | ⭐⭐⭐⭐⭐ |
| 数值计算 | numpy | pandas 的底层,专门做数值运算,处理大规模数据更快 | ⭐⭐⭐⭐ |
| 可视化 | matplotlib / mplfinance | 画收益曲线、K 线图、指标图,直观查看策略效果 | ⭐⭐⭐⭐ |
| 回测框架 | Backtrader | 经典本地回测框架,功能完整,适合本地开发策略 | ⭐⭐⭐ |
| 在线平台 | 聚宽、米筐、优矿 | 网页端量化平台,自带数据、回测环境,不用自己搭环境,新手入门也可以从这里开始 | ⭐⭐⭐⭐ |
💡 新手入门建议:先学
pandas+AkShare,手动实现简单策略的回测,搞懂底层逻辑,再去学专业回测框架。
三、量化交易的标准流程
不管是简单还是复杂的策略,完整的量化流程都分 5 步,新手按这个顺序学就不会乱:
- 获取数据:拿到股票 / 基金的历史行情、基本面数据
- 清洗处理:补全缺失值、调整复权、计算技术指标(均线、MACD 等)
- 制定策略:写清楚买卖规则(比如什么条件买、什么条件卖)
- 历史回测:用历史数据模拟运行策略,算收益、最大回撤、胜率等指标
- 优化与风控:调整参数、加止损止盈、仓位管理,降低风险
四、实战入门:第一个量化策略(双均线策略)
双均线策略是量化入门最经典的策略,逻辑简单、容易理解,非常适合新手练手。
策略原理
- 短期均线(比如 5 日均线):反映短期价格走势
- 长期均线(比如 20 日均线):反映长期价格走势
- 金叉买入:短期均线从下往上穿过长期均线 → 行情转强,买入
- 死叉卖出:短期均线从上往下穿过长期均线 → 行情转弱,卖出
准备工作
先安装需要的库,打开终端执行:
python
pip install akshare pandas matplotlib
完整代码 + 逐段解释
我们以贵州茅台(股票代码:600519)为例,用 2020-2023 年的日线数据,实现 5 日均线 + 20 日均线的双均线策略,并计算策略收益。
第 1 步:导入库 + 获取历史行情数据
python
import akshare as ak
import pandas as pd
import matplotlib.pyplot as plt
# 设置中文显示,避免画图乱码
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 获取A股单只股票的日线数据
# 参数说明:
# symbol:股票代码,600519是贵州茅台
# period:周期,daily=日线
# start_date/end_date:数据起止日期,格式YYYYMMDD
# adjust:复权方式,qfq=前复权(处理过分红拆股后的真实价格,回测必须用复权数据)
df = ak.stock_zh_a_hist(
symbol="600519",
period="daily",
start_date="20200101",
end_date="20231231",
adjust="qfq"
)
# 查看数据前5行
print("数据前5行:")
print(df.head())
print("\n数据列名:", df.columns.tolist())
代码解释
ak.stock_zh_a_hist是 AkShare 专门获取 A 股日线数据的函数,免费不用登录- 前复权:股票分红、拆股会导致价格跳空,前复权会把历史价格调整成连续可比的价格,回测必须用复权数据,否则收益计算会错
- 返回的
df是 pandas 的 DataFrame 表格,包含日期、开盘、收盘、最高、最低、成交量等字段
第 2 步:数据预处理 + 计算均线指标
python
# 1. 把日期列转成日期格式,设为索引,方便后续画图和计算
df['日期'] = pd.to_datetime(df['日期'])
df = df.set_index('日期')
# 2. 只保留我们需要的收盘价列(简化计算,策略只用收盘价)
df = df[['收盘']]
df.rename(columns={'收盘': 'close'}, inplace=True)
# 3. 计算5日均线和20日均线
# rolling(5).mean():滚动5天求平均值,也就是过去5天收盘价的均值
df['ma5'] = df['close'].rolling(5).mean()
df['ma20'] = df['close'].rolling(20).mean()
# 查看前30行,前19天20日均线是空值(因为没有足够的历史数据)
print("\n带均线的数据:")
print(df.head(30))
代码解释
- 均线(MA):Moving Average,过去 N 天收盘价的平均值,用来平滑价格波动,判断趋势方向
rolling(5).mean()是 pandas 的滚动计算函数,非常适合算各类均线指标,是量化最常用的函数之一- 前 N-1 天的 N 日均线是空值,因为没有足够的历史数据,属于正常现象
第 3 步:生成买卖信号
核心逻辑:
- 金叉:昨天 MA5 ≤ 昨天 MA20,并且今天 MA5 > 今天 MA20 → 上穿,买入信号
- 死叉:昨天 MA5 ≥ 昨天 MA20,并且今天 MA5 < 今天 MA20 → 下穿,卖出信号
python
# 1. 新增两列:昨天的5日均线、昨天的20日均线
# shift(1) 表示把数据往下挪一行,也就是取前一天的值
df['ma5_yesterday'] = df['ma5'].shift(1)
df['ma20_yesterday'] = df['ma20'].shift(1)
# 2. 生成信号:1=买入信号,-1=卖出信号,0=无信号
df['signal'] = 0
# 金叉:买入信号
df.loc[(df['ma5_yesterday'] <= df['ma20_yesterday']) & (df['ma5'] > df['ma20']), 'signal'] = 1
# 死叉:卖出信号
df.loc[(df['ma5_yesterday'] >= df['ma20_yesterday']) & (df['ma5'] < df['ma20']), 'signal'] = -1
# 查看有信号的日期
print("\n买卖信号日期:")
print(df[df['signal'] != 0][['close', 'signal']])
代码解释
shift(1)是量化里非常重要的函数,用来取前一天的数据,避免用到 "未来数据"(比如不能用今天收盘的均线判断今天的买卖,实际交易中收盘后才能算出当天均线,第二天才能交易)loc[条件, 列名]是 pandas 按条件赋值的标准写法- 这里的信号是 "收盘后发出",实际交易要第二天才能成交,后面计算收益的时候会处理这个细节
第 4 步:模拟持仓 + 计算策略收益
python
# 1. 计算持仓状态:1=持有股票,0=空仓
# 遇到买入信号就变成持有,遇到卖出信号就变成空仓
df['position'] = 0
position = 0 # 初始持仓:空仓
for date, row in df.iterrows():
if row['signal'] == 1:
position = 1
elif row['signal'] == -1:
position = 0
df.loc[date, 'position'] = position
# 2. 计算股票本身的每日涨跌幅(买入持有策略的收益)
df['daily_return'] = df['close'].pct_change()
# 3. 计算策略的每日收益
# 注意:信号是收盘后产生的,第二天才持仓,所以持仓要往后挪一天(shift(1)),避免未来函数
df['strategy_return'] = df['daily_return'] * df['position'].shift(1)
# 4. 计算累计收益(从1开始,1代表初始本金)
df['buy_hold_cum'] = (1 + df['daily_return']).cumprod()
df['strategy_cum'] = (1 + df['strategy_return']).cumprod()
# 打印最终收益
print(f"\n买入持有最终收益:{(df['buy_hold_cum'].iloc[-1] - 1)*100:.2f}%")
print(f"双均线策略最终收益:{(df['strategy_cum'].iloc[-1] - 1)*100:.2f}%")
关键解释:什么是未来函数?
这是新手最容易踩的致命坑:
- 未来函数:回测时用到了 "交易当天还不可能知道的数据",比如用当天收盘价算的均线,当天就买入
- 现实中:当天的收盘价要收盘才知道,均线也要收盘后才能算出来,只能第二天开盘交易
- 所以我们用
shift(1)把持仓往后挪一天,信号第二天才生效,这样回测结果才真实可信,不然回测收益虚高,实盘完全用不了
第 5 步:可视化结果
python
plt.figure(figsize=(12, 6))
# 画收盘价和均线
plt.plot(df['close'], label='收盘价', color='gray', alpha=0.5)
plt.plot(df['ma5'], label='5日均线', color='red')
plt.plot(df['ma20'], label='20日均线', color='blue')
# 标记买入点(绿色向上箭头)
buy_points = df[df['signal'] == 1]
plt.scatter(buy_points.index, buy_points['close'], marker='^', color='green', s=100, label='买入信号')
# 标记卖出点(红色向下箭头)
sell_points = df[df['signal'] == -1]
plt.scatter(sell_points.index, sell_points['close'], marker='v', color='red', s=100, label='卖出信号')
plt.title('贵州茅台 双均线策略回测 (5日+20日)')
plt.xlabel('日期')
plt.ylabel('价格(元)')
plt.legend()
plt.grid(alpha=0.3)
plt.show()
# 画收益对比曲线
plt.figure(figsize=(12, 5))
plt.plot(df['buy_hold_cum'], label='买入持有', color='gray')
plt.plot(df['strategy_cum'], label='双均线策略', color='red')
plt.title('策略收益对比')
plt.xlabel('日期')
plt.ylabel('累计净值(1=初始本金)')
plt.legend()
plt.grid(alpha=0.3)
plt.show()
运行后会弹出两张图:
- 第一张:价格走势 + 均线 + 买卖点,可以直观看到什么时候买、什么时候卖
- 第二张:策略和买入持有的收益对比,能直观看出策略有没有跑赢大盘
五、进阶:专业回测框架 Backtrader 简介
上面的手动回测适合理解原理,但真实量化开发会用专门的回测框架,它们已经封装好了手续费、滑点、仓位管理、绩效统计等功能,不用自己从零写。
Backtrader 是最经典的本地回测框架,核心特点:
- 内置几十种技术指标,不用自己算
- 自动处理交易成本、滑点、成交逻辑
- 支持股票、期货、外汇等多品种
- 可以输出完整的绩效报告:胜率、盈亏比、最大回撤、夏普比率等
极简示例(了解即可)
python
import backtrader as bt
# 定义策略类
class DoubleMAStrategy(bt.Strategy):
def __init__(self):
# 定义5日和20日均线
self.ma5 = bt.indicators.SimpleMovingAverage(self.data.close, period=5)
self.ma20 = bt.indicators.SimpleMovingAverage(self.data.close, period=20)
def next(self):
# 每个交易日执行一次
if not self.position: # 没持仓
if self.ma5[0] > self.ma20[0] and self.ma5[-1] <= self.ma20[-1]:
self.buy() # 金叉买入
else: # 有持仓
if self.ma5[0] < self.ma20[0] and self.ma5[-1] >= self.ma20[-1]:
self.sell() # 死叉卖出
框架会自动帮你处理成交、计算收益、统计绩效,比手动写严谨得多,新手理解原理后可以深入学习。