Python进阶教程:19_量化交易 零基础超详细入门教程

Python 量化,简单说就是用 Python 编程语言 + 配套工具库,自动完成金融数据获取、分析、交易策略开发、历史回测、甚至自动交易的过程。它不是某种神奇的 "赚钱公式",而是一套用程序替代人工盯盘、人工计算、人工决策的工具方法 ------ 核心优势是高效、客观、可验证,能避免人性的贪婪恐惧带来的决策失误。

本文从概念、工具、流程到完整实战案例,全程用通俗语言 + 可运行代码 + 逐行解释,零基础也能理解量化的完整逻辑,跑通第一个入门策略。

⚠️ 重要风险提示:本文所有内容仅为技术学习演示,不构成任何投资建议。股市有风险,投资需谨慎,新手务必先从历史回测练手,不要盲目实盘交易。


一、先搞懂:Python 量化能做什么?核心优势

1. 通俗类比

就像你开奶茶店:

  • 人工交易 = 老板自己每天手工算账、手工进货、手工做奶茶,效率低、容易累、情绪不好的时候还容易做错
  • Python 量化 = 买了一套自动化设备 + 管理系统:自动统计销量、自动算进货量、自动做奶茶,严格按规则来,不会累、不会情绪化

2. 核心用途

  1. 批量数据分析:一次性分析几千只股票的历史数据,筛选符合条件的标的,人工筛选要几天,程序几秒搞定
  2. 策略回测验证:用过去几年的历史数据,模拟你的买卖规则跑一遍,看看过去赚不赚钱、最大亏多少,不用真金白银试错
  3. 自动盯盘交易:程序 24 小时监控行情,满足条件自动下单,不用天天盯盘
  4. 风险控制:严格执行止损、止盈规则,避免亏损时舍不得卖、盈利时贪多等人性问题

3. 新手最容易有的误区

❌ 错误:量化 = 稳赚不赔 ✅ 事实:量化只是工具,策略本身好不好才决定盈亏,差的策略用程序跑只会亏得更快 ❌ 错误:量化必须懂复杂的数学、算法 ✅ 事实:入门级的均线策略、网格策略,只需要基础 Python + 简单逻辑就能实现,新手也能上手


二、新手必备:量化核心工具库

Python 量化的生态非常成熟,不同工具负责不同环节,新手先掌握最核心的几个即可,不用一次性全学。

分类 工具库 作用 新手推荐度
数据获取 AkShare 免费开源的财经数据库,股票、基金、期货、宏观数据都能拿,不用注册、不用积分,新手首选 ⭐⭐⭐⭐⭐
数据获取 Tushare 数据更全更专业,但高级数据需要积分,适合进阶 ⭐⭐⭐
数据处理 pandas 表格数据处理神器,算指标、清洗数据、筛选标的全靠它,是量化的基础 ⭐⭐⭐⭐⭐
数值计算 numpy pandas 的底层,专门做数值运算,处理大规模数据更快 ⭐⭐⭐⭐
可视化 matplotlib / mplfinance 画收益曲线、K 线图、指标图,直观查看策略效果 ⭐⭐⭐⭐
回测框架 Backtrader 经典本地回测框架,功能完整,适合本地开发策略 ⭐⭐⭐
在线平台 聚宽、米筐、优矿 网页端量化平台,自带数据、回测环境,不用自己搭环境,新手入门也可以从这里开始 ⭐⭐⭐⭐

💡 新手入门建议:先学 pandas + AkShare,手动实现简单策略的回测,搞懂底层逻辑,再去学专业回测框架。


三、量化交易的标准流程

不管是简单还是复杂的策略,完整的量化流程都分 5 步,新手按这个顺序学就不会乱:

  1. 获取数据:拿到股票 / 基金的历史行情、基本面数据
  2. 清洗处理:补全缺失值、调整复权、计算技术指标(均线、MACD 等)
  3. 制定策略:写清楚买卖规则(比如什么条件买、什么条件卖)
  4. 历史回测:用历史数据模拟运行策略,算收益、最大回撤、胜率等指标
  5. 优化与风控:调整参数、加止损止盈、仓位管理,降低风险

四、实战入门:第一个量化策略(双均线策略)

双均线策略是量化入门最经典的策略,逻辑简单、容易理解,非常适合新手练手。

策略原理

  • 短期均线(比如 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()

运行后会弹出两张图:

  1. 第一张:价格走势 + 均线 + 买卖点,可以直观看到什么时候买、什么时候卖
  2. 第二张:策略和买入持有的收益对比,能直观看出策略有没有跑赢大盘

五、进阶:专业回测框架 Backtrader 简介

上面的手动回测适合理解原理,但真实量化开发会用专门的回测框架,它们已经封装好了手续费、滑点、仓位管理、绩效统计等功能,不用自己从零写。

Backtrader 是最经典的本地回测框架,核心特点:

  1. 内置几十种技术指标,不用自己算
  2. 自动处理交易成本、滑点、成交逻辑
  3. 支持股票、期货、外汇等多品种
  4. 可以输出完整的绩效报告:胜率、盈亏比、最大回撤、夏普比率等

极简示例(了解即可)

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()  # 死叉卖出

框架会自动帮你处理成交、计算收益、统计绩效,比手动写严谨得多,新手理解原理后可以深入学习。

相关推荐
mykj15515 小时前
Web3开发系统不是炒币,是互联网的“对账本”逻辑
web3·区块链·rwa·钱包区块链系统开发
MartinYeung519 小时前
Uniswap v4 许可池:重塑 DeFi 流动性管理的范式革命
人工智能·区块链
磐链科技1 天前
智能合约开发中的Layer2适配:Rollup、侧链与状态通道实践
区块链·智能合约
Richown2 天前
Three.js 供应链三维可视化:全球物流轨迹、库存热力图与数字孪生的交互呈现
区块链·react
小K讲AI营销2 天前
固态电池战局拆解:机器人为何先于汽车吃到红利
大数据·人工智能·区块链
来了就不要走3 天前
源达财源滚滚APP怎么样?日常炒股能用得上吗?
区块链
网安蟹佬霸3 天前
WebAssembly安全攻防实战:从WASM逆向到漏洞利用
前端·安全·自动化·区块链·智能合约·wasm
stockmasterx4 天前
北交所有哪些注意事项?北交所佣金最低是多少?
区块链
网安蟹佬霸4 天前
区块链与智能合约安全实战:从Solidity审计到DeFi漏洞深度剖析
运维·前端·网络·安全·自动化·区块链·智能合约