量化交易完全指南:从入门到实战
用代码取代直觉,用数据驱动决策,用纪律战胜人性。
前言
作为一名技术人,你是否曾经想过:能不能用写代码的方式来做投资?
答案是肯定的——这就是量化交易(Quantitative Trading)。
量化交易不是什么神秘的"黑科技",本质上就是把交易规则写成程序,让计算机帮你执行。它不保证赚钱,但能帮你克服人性弱点、提高决策效率、实现策略的可验证和可复制。
本文将从零开始,系统性地介绍量化交易的方方面面。无论你是想了解概念,还是准备动手实践,这篇文章都能给你一个完整的知识框架。
一、什么是量化交易?
1.1 定义
量化交易是指利用数学模型、统计方法和计算机程序,对金融市场进行分析、决策和交易执行的投资方式。
┌─────────────────────────────────────────────────────────────────┐
│ 量化交易的本质 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 输入:市场数据(价格、成交量、财务指标、另类数据...) │
│ ↓ │
│ 处理:数学模型 + 统计分析 + 交易规则 │
│ ↓ │
│ 输出:买入/卖出/持有 信号 │
│ ↓ │
│ 执行:程序自动下单(或辅助人工决策) │
│ │
└─────────────────────────────────────────────────────────────────┘2
3
4
5
6
7
8
9
10
11
12
13
1.2 量化交易 vs 程序化交易 vs 算法交易
这三个概念经常混用,但有细微区别:
| 概念 | 侧重点 | 说明 |
|---|---|---|
| 量化交易 | 策略研发 | 用数学模型发现交易机会 |
| 程序化交易 | 执行方式 | 用程序代替人工下单 |
| 算法交易 | 执行优化 | 优化大单拆分、降低冲击成本 |
简单理解:量化交易 = 量化策略 + 程序化执行
1.3 量化交易简史
| 年代 | 里程碑事件 |
|---|---|
| 1950s | 马科维茨提出现代投资组合理论(MPT) |
| 1970s | 布莱克-斯科尔斯期权定价模型诞生 |
| 1980s | 文艺复兴科技公司成立,开启量化对冲基金时代 |
| 1990s | 统计套利、配对交易策略兴起 |
| 2000s | 高频交易崛起,算法交易成为主流 |
| 2010s | 机器学习、深度学习进入量化领域 |
| 2020s | 另类数据、AI大模型、加密货币量化 |
1.4 谁在做量化交易?
┌─────────────────────────────────────────────────────────────────┐
│ 量化交易参与者 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 机构端 │
│ ├── 量化对冲基金(文艺复兴、Two Sigma、Citadel...) │
│ ├── 投资银行自营交易部门 │
│ ├── 公募基金量化团队 │
│ ├── 私募量化基金 │
│ └── 做市商 │
│ │
│ 个人端 │
│ ├── 职业量化交易员 │
│ ├── 技术背景的业余投资者 │
│ └── 量化爱好者/学习者 │
│ │
└─────────────────────────────────────────────────────────────────┘2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
二、量化交易的核心流程
一个完整的量化交易系统包含以下环节:
┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐
│ 数据 │ → │ 策略 │ → │ 回测 │ → │ 实盘 │ → │ 监控 │
│ 获取 │ │ 研发 │ │ 验证 │ │ 交易 │ │ 优化 │
└────────┘ └────────┘ └────────┘ └────────┘ └────────┘
↑ │
└───────────────────────────────────────────────────────┘
持续迭代2
3
4
5
6
7
2.1 数据获取
数据是量化交易的燃料。没有好的数据,再好的策略也无从谈起。
数据类型
| 类型 | 内容 | 获取难度 | 成本 |
|---|---|---|---|
| 行情数据 | K线、Tick、Level2 | ⭐ | 低-中 |
| 财务数据 | 财报、估值指标 | ⭐ | 低 |
| 基本面数据 | 行业分类、股东信息 | ⭐⭐ | 低-中 |
| 另类数据 | 舆情、卫星图、消费数据 | ⭐⭐⭐ | 高 |
| 高频数据 | 毫秒级Tick、订单簿 | ⭐⭐⭐⭐ | 很高 |
国内常用数据源
| 数据源 | 类型 | 费用 | 特点 |
|---|---|---|---|
| Tushare | 综合 | 免费/付费 | 社区活跃,数据较全 |
| AKShare | 综合 | 免费 | 开源,更新快 |
| BaoStock | 行情 | 免费 | 稳定,适合入门 |
| Wind | 综合 | 付费(贵) | 机构标配,数据权威 |
| 聚宽/优矿 | 平台 | 免费/付费 | 一站式研究平台 |
| 通达信/同花顺 | 行情 | 免费 | 可导出本地数据 |
数据获取示例(Python + AKShare)
import akshare as ak
# 获取沪深300成分股
hs300 = ak.index_stock_cons_csindex(symbol="000300")
# 获取某股票日K线
df = ak.stock_zh_a_hist(symbol="000001", period="daily",
start_date="20200101", end_date="20241231")
# 获取财务数据
finance = ak.stock_financial_abstract_ths(symbol="000001")2
3
4
5
6
7
8
9
10
11
2.2 策略研发
策略是量化交易的核心,本质上是一套可量化、可执行的交易规则。
策略研发的思路来源
┌─────────────────────────────────────────────────────────────────┐
│ 策略思路来源 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 1. 学术论文 │
│ └── Fama-French三因子、动量效应、价值投资研究... │
│ │
│ 2. 经典技术分析 │
│ └── 均线、MACD、RSI、布林带、K线形态... │
│ │
│ 3. 市场观察 │
│ └── 打板策略、龙头战法、事件驱动... │
│ │
│ 4. 数据挖掘 │
│ └── 机器学习发现的规律、统计异象... │
│ │
│ 5. 逆向工程 │
│ └── 研究成功基金的持仓、交易行为... │
│ │
└─────────────────────────────────────────────────────────────────┘2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
策略开发的基本框架
class Strategy:
"""策略基本框架"""
def __init__(self, params):
"""初始化参数"""
self.params = params
def generate_signals(self, data):
"""生成交易信号"""
# 核心逻辑:根据数据计算买卖信号
# 返回:1=买入,-1=卖出,0=持有
pass
def position_sizing(self, signal, portfolio):
"""仓位管理"""
# 决定买卖多少
pass
def risk_management(self, position, market_data):
"""风险控制"""
# 止损、止盈、最大回撤控制
pass
def execute(self, orders):
"""执行交易"""
# 下单逻辑
pass2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
2.3 回测验证
回测是用历史数据模拟策略运行,验证策略是否有效。
为什么要回测?
- 验证策略逻辑是否正确
- 评估策略的收益和风险特征
- 优化策略参数
- 发现潜在问题
回测的关键指标
| 指标 | 含义 | 理想值 |
|---|---|---|
| 年化收益率 | 策略的年均回报 | 越高越好 |
| 最大回撤 | 历史最大亏损幅度 | 越小越好 |
| 夏普比率 | 风险调整后收益 | >1 较好,>2 优秀 |
| 胜率 | 盈利交易占比 | 因策略而异 |
| 盈亏比 | 平均盈利/平均亏损 | >1.5 较好 |
| 换手率 | 交易频率 | 适中 |
| Calmar比率 | 年化收益/最大回撤 | >1 较好 |
回测的常见陷阱
| 陷阱 | 说明 | 如何避免 |
|---|---|---|
| 过拟合 | 参数过度优化,适应历史但不适应未来 | 样本外测试、参数敏感性分析 |
| 未来函数 | 使用了未来才知道的信息 | 仔细检查数据时间戳 |
| 幸存者偏差 | 只用现存股票,忽略退市股 | 使用全市场历史数据 |
| 交易成本忽略 | 未考虑手续费、滑点、冲击成本 | 加入合理的成本假设 |
| 流动性假设 | 假设无限流动性 | 考虑成交量限制 |
2.4 实盘交易
回测通过后,进入实盘阶段。
实盘前的准备
□ 策略经过充分回测和样本外验证
□ 明确资金规模和风险承受能力
□ 确定交易接口和执行方式
□ 制定风控规则和熔断机制
□ 准备监控和报警系统
□ 先用模拟盘测试一段时间
□ 小资金实盘验证
□ 逐步放大规模2
3
4
5
6
7
8
国内实盘交易接口
| 接口 | 适用市场 | 特点 |
|---|---|---|
| QMT(迅投) | A股 | 多券商支持,功能全面 |
| PTrade | A股 | 恒生电子,机构常用 |
| 掘金量化 | A股/期货 | 云端执行,门槛低 |
| vn.py | 期货/数字货币 | 开源框架,可扩展 |
| easytrader | A股 | 开源,模拟券商客户端 |
| 交易所API | 数字货币 | 币安、OKX等提供 |
2.5 监控与优化
实盘后需要持续监控和迭代。
┌─────────────────────────────────────────────────────────────────┐
│ 监控与优化闭环 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────┐ │
│ │ 实时监控 │ ← 仓位、盈亏、风险指标、系统状态 │
│ └────┬────┘ │
│ ↓ │
│ ┌─────────┐ │
│ │ 异常报警 │ ← 回撤超限、交易失败、网络中断 │
│ └────┬────┘ │
│ ↓ │
│ ┌─────────┐ │
│ │ 归因分析 │ ← 收益来源、策略表现、市场环境 │
│ └────┬────┘ │
│ ↓ │
│ ┌─────────┐ │
│ │ 策略迭代 │ ← 参数调整、逻辑优化、新策略开发 │
│ └─────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
三、主流量化策略详解
3.1 技术分析类策略
基于价格、成交量等市场数据的策略。
3.1.1 均线策略
原理:利用不同周期均线的交叉产生信号。
def dual_ma_strategy(close, short_period=5, long_period=20):
"""双均线策略"""
short_ma = close.rolling(short_period).mean()
long_ma = close.rolling(long_period).mean()
# 金叉买入,死叉卖出
signal = pd.Series(0, index=close.index)
signal[short_ma > long_ma] = 1 # 持有
signal[short_ma < long_ma] = -1 # 空仓
# 只在交叉点产生交易信号
trade_signal = signal.diff()
return trade_signal2
3
4
5
6
7
8
9
10
11
12
13
优点:简单易懂,趋势行情表现好 缺点:震荡市容易被反复打脸
3.1.2 动量策略
原理:过去涨得好的股票,未来可能继续涨。
def momentum_strategy(returns, lookback=20, top_n=10):
"""动量选股策略"""
# 计算过去N日收益率
momentum = returns.rolling(lookback).sum()
# 选择动量最强的前N只
selected = momentum.rank(axis=1, ascending=False) <= top_n
return selected2
3
4
5
6
7
8
3.1.3 均值回归策略
原理:价格偏离均值后会回归。
def mean_reversion_strategy(close, window=20, threshold=2):
"""布林带均值回归策略"""
ma = close.rolling(window).mean()
std = close.rolling(window).std()
upper = ma + threshold * std
lower = ma - threshold * std
signal = pd.Series(0, index=close.index)
signal[close < lower] = 1 # 超卖买入
signal[close > upper] = -1 # 超买卖出
return signal2
3
4
5
6
7
8
9
10
11
12
13
3.2 因子投资策略
基于股票特征(因子)进行选股。
3.2.1 什么是因子?
因子是能够解释股票收益差异的特征变量。
┌─────────────────────────────────────────────────────────────────┐
│ 常见因子分类 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 价值因子 │
│ ├── 市盈率(PE):低PE可能被低估 │
│ ├── 市净率(PB):低PB可能被低估 │
│ └── 股息率:高股息可能更有价值 │
│ │
│ 成长因子 │
│ ├── 营收增速:高增长公司可能继续增长 │
│ ├── 利润增速:盈利能力提升 │
│ └── ROE变化:盈利质量改善 │
│ │
│ 质量因子 │
│ ├── ROE/ROA:盈利能力 │
│ ├── 毛利率:产品竞争力 │
│ └── 资产负债率:财务健康度 │
│ │
│ 动量因子 │
│ ├── 过去N月收益率 │
│ └── 相对强弱指标 │
│ │
│ 规模因子 │
│ └── 市值:小市值效应 │
│ │
│ 波动率因子 │
│ └── 低波动异象:低波动股票风险调整收益更好 │
│ │
└─────────────────────────────────────────────────────────────────┘2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
3.2.2 多因子模型
def multi_factor_score(data):
"""多因子打分模型"""
scores = pd.DataFrame(index=data.index)
# 价值因子(PE倒数,越低越好)
scores['value'] = (1 / data['pe']).rank(pct=True)
# 成长因子(利润增速)
scores['growth'] = data['profit_growth'].rank(pct=True)
# 质量因子(ROE)
scores['quality'] = data['roe'].rank(pct=True)
# 动量因子(过去20日收益)
scores['momentum'] = data['return_20d'].rank(pct=True)
# 综合打分(等权重)
scores['total'] = scores.mean(axis=1)
return scores2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
3.3 统计套利策略
利用统计关系进行套利。
3.3.1 配对交易
原理:找到高度相关的两只股票,当价差偏离时做多低估、做空高估。
def pairs_trading(stock_a, stock_b, window=60, threshold=2):
"""配对交易策略"""
# 计算价格比率
ratio = stock_a / stock_b
# 计算比率的均值和标准差
ratio_ma = ratio.rolling(window).mean()
ratio_std = ratio.rolling(window).std()
# Z-score
z_score = (ratio - ratio_ma) / ratio_std
signal = pd.Series(0, index=ratio.index)
signal[z_score > threshold] = -1 # 做空A,做多B
signal[z_score < -threshold] = 1 # 做多A,做空B
signal[abs(z_score) < 0.5] = 0 # 平仓
return signal2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
3.3.2 ETF套利
利用ETF与成分股、跨市场ETF之间的价差套利。
3.4 机器学习策略
用ML/DL模型预测市场。
3.4.1 常用模型
| 模型类型 | 代表算法 | 适用场景 |
|---|---|---|
| 线性模型 | 岭回归、Lasso | 因子收益预测 |
| 树模型 | XGBoost、LightGBM | 分类/回归预测 |
| 神经网络 | LSTM、Transformer | 时序预测 |
| 强化学习 | DQN、PPO | 动态交易决策 |
3.4.2 机器学习量化的挑战
┌─────────────────────────────────────────────────────────────────┐
│ 机器学习量化的挑战 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 1. 数据量不足 │
│ └── 股市历史数据有限,难以满足深度学习需求 │
│ │
│ 2. 信噪比极低 │
│ └── 市场充满噪音,有效信号稀缺 │
│ │
│ 3. 非平稳性 │
│ └── 市场规律不断变化,模型容易失效 │
│ │
│ 4. 过拟合风险 │
│ └── 复杂模型更容易记住历史而非学到规律 │
│ │
│ 5. 可解释性差 │
│ └── 黑盒模型难以理解和信任 │
│ │
└─────────────────────────────────────────────────────────────────┘2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
3.5 高频交易策略
在极短时间内(毫秒/微秒)进行大量交易。
高频交易的特点
| 特点 | 说明 |
|---|---|
| 速度 | 毫秒级甚至微秒级交易 |
| 频率 | 日内数千甚至数万笔 |
| 持仓 | 极短,通常不隔夜 |
| 利润 | 单笔利润小,靠数量取胜 |
| 成本 | 硬件、数据、机房托管费用高 |
| 门槛 | 技术和资金门槛极高 |
常见高频策略
- 做市策略:提供买卖报价,赚取价差
- 套利策略:跨市场、跨品种瞬时套利
- 订单流策略:分析订单簿预测短期走势
⚠️ 注意:高频交易需要专业团队、大量资金和硬件投入,不适合个人投资者。
四、量化交易技术栈
4.1 编程语言选择
| 语言 | 适用场景 | 优势 | 劣势 |
|---|---|---|---|
| Python | 研究、回测、中低频 | 生态丰富,开发快 | 性能较低 |
| C++ | 高频交易、执行系统 | 性能极高 | 开发慢,门槛高 |
| R | 统计分析、因子研究 | 统计包强大 | 工程化弱 |
| MATLAB | 学术研究 | 矩阵计算强 | 商业授权贵 |
| Java | 交易系统 | 稳定、多线程 | 开发效率一般 |
推荐:个人量化用 Python 即可,覆盖90%以上需求。
4.2 Python量化技术栈
┌─────────────────────────────────────────────────────────────────┐
│ Python 量化技术栈 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 数据处理层 │
│ ├── NumPy # 数值计算 │
│ ├── Pandas # 数据分析 │
│ └── Polars # 高性能数据处理(可选) │
│ │
│ 数据获取层 │
│ ├── Tushare # A股数据 │
│ ├── AKShare # 综合数据 │
│ ├── yfinance # 美股数据 │
│ └── ccxt # 数字货币数据 │
│ │
│ 回测框架层 │
│ ├── Backtrader # 经典回测框架 │
│ ├── vnpy # 开源量化平台 │
│ ├── Zipline # Quantopian开源 │
│ └── bt # 轻量级回测 │
│ │
│ 机器学习层 │
│ ├── Scikit-learn # 传统ML │
│ ├── XGBoost # 梯度提升树 │
│ ├── LightGBM # 微软梯度提升 │
│ ├── PyTorch # 深度学习 │
│ └── TensorFlow # 深度学习 │
│ │
│ 可视化层 │
│ ├── Matplotlib # 基础绑图 │
│ ├── Plotly # 交互图表 │
│ ├── Pyecharts # 中文友好 │
│ └── mplfinance # K线图 │
│ │
│ 执行层 │
│ ├── QMT # A股实盘 │
│ ├── easytrader # 模拟券商 │
│ └── ccxt # 数字货币交易 │
│ │
└─────────────────────────────────────────────────────────────────┘2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
4.3 开发环境配置
# 创建虚拟环境
conda create -n quant python=3.10
conda activate quant
# 安装核心库
pip install numpy pandas matplotlib
# 安装数据获取库
pip install tushare akshare baostock
# 安装回测框架
pip install backtrader
# 安装机器学习库
pip install scikit-learn xgboost lightgbm
# 安装可视化库
pip install plotly pyecharts mplfinance
# Jupyter环境
pip install jupyterlab2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
五、实战案例:构建一个完整的量化策略
下面我们从零开始,构建一个完整的双均线策略。
5.1 完整代码
"""
双均线策略完整实现
作者:技术人的投资笔记
"""
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import akshare as ak
from datetime import datetime
# ============ 1. 数据获取 ============
def get_stock_data(symbol, start_date, end_date):
"""获取股票日K线数据"""
df = ak.stock_zh_a_hist(
symbol=symbol,
period="daily",
start_date=start_date,
end_date=end_date,
adjust="qfq" # 前复权
)
df['日期'] = pd.to_datetime(df['日期'])
df.set_index('日期', inplace=True)
df = df.rename(columns={
'开盘': 'open', '收盘': 'close',
'最高': 'high', '最低': 'low',
'成交量': 'volume'
})
return df[['open', 'high', 'low', 'close', 'volume']]
# ============ 2. 策略逻辑 ============
class DualMAStrategy:
"""双均线策略"""
def __init__(self, short_period=5, long_period=20):
self.short_period = short_period
self.long_period = long_period
def generate_signals(self, data):
"""生成交易信号"""
df = data.copy()
# 计算均线
df['short_ma'] = df['close'].rolling(self.short_period).mean()
df['long_ma'] = df['close'].rolling(self.long_period).mean()
# 生成信号:1=持有,0=空仓
df['signal'] = 0
df.loc[df['short_ma'] > df['long_ma'], 'signal'] = 1
# 交易信号:1=买入,-1=卖出
df['trade'] = df['signal'].diff()
return df
# ============ 3. 回测引擎 ============
class Backtester:
"""简单回测引擎"""
def __init__(self, initial_capital=100000, commission=0.001):
self.initial_capital = initial_capital
self.commission = commission # 手续费率
def run(self, data, signal_col='signal'):
"""运行回测"""
df = data.copy()
# 计算每日收益率
df['returns'] = df['close'].pct_change()
# 策略收益(持仓时获得收益)
df['strategy_returns'] = df['returns'] * df[signal_col].shift(1)
# 扣除交易成本
df['trade_cost'] = abs(df[signal_col].diff()) * self.commission
df['strategy_returns'] = df['strategy_returns'] - df['trade_cost']
# 计算净值曲线
df['benchmark_equity'] = (1 + df['returns']).cumprod()
df['strategy_equity'] = (1 + df['strategy_returns']).cumprod()
return df
def calculate_metrics(self, df):
"""计算绩效指标"""
returns = df['strategy_returns'].dropna()
equity = df['strategy_equity'].dropna()
# 年化收益率
total_days = len(returns)
total_return = equity.iloc[-1] - 1
annual_return = (1 + total_return) ** (252 / total_days) - 1
# 年化波动率
annual_volatility = returns.std() * np.sqrt(252)
# 夏普比率(假设无风险利率3%)
sharpe_ratio = (annual_return - 0.03) / annual_volatility
# 最大回撤
rolling_max = equity.expanding().max()
drawdowns = equity / rolling_max - 1
max_drawdown = drawdowns.min()
# 胜率
winning_days = (returns > 0).sum()
total_trades = (returns != 0).sum()
win_rate = winning_days / total_trades if total_trades > 0 else 0
metrics = {
'总收益率': f'{total_return:.2%}',
'年化收益率': f'{annual_return:.2%}',
'年化波动率': f'{annual_volatility:.2%}',
'夏普比率': f'{sharpe_ratio:.2f}',
'最大回撤': f'{max_drawdown:.2%}',
'胜率': f'{win_rate:.2%}',
'交易天数': total_days
}
return metrics
# ============ 4. 可视化 ============
def plot_results(df, title='策略回测结果'):
"""绑制回测结果"""
fig, axes = plt.subplots(3, 1, figsize=(14, 10),
gridspec_kw={'height_ratios': [2, 1, 1]})
# 图1:价格和均线
ax1 = axes[0]
ax1.plot(df.index, df['close'], label='收盘价', alpha=0.7)
ax1.plot(df.index, df['short_ma'], label='短期均线', linestyle='--')
ax1.plot(df.index, df['long_ma'], label='长期均线', linestyle='--')
# 标记买卖点
buy_points = df[df['trade'] == 1]
sell_points = df[df['trade'] == -1]
ax1.scatter(buy_points.index, buy_points['close'],
marker='^', color='red', s=100, label='买入')
ax1.scatter(sell_points.index, sell_points['close'],
marker='v', color='green', s=100, label='卖出')
ax1.set_title(title)
ax1.legend(loc='upper left')
ax1.grid(True, alpha=0.3)
# 图2:净值曲线
ax2 = axes[1]
ax2.plot(df.index, df['strategy_equity'], label='策略净值', linewidth=2)
ax2.plot(df.index, df['benchmark_equity'], label='基准净值',
alpha=0.7, linestyle='--')
ax2.set_title('净值曲线')
ax2.legend(loc='upper left')
ax2.grid(True, alpha=0.3)
# 图3:回撤
ax3 = axes[2]
rolling_max = df['strategy_equity'].expanding().max()
drawdown = df['strategy_equity'] / rolling_max - 1
ax3.fill_between(df.index, drawdown, 0, alpha=0.3, color='red')
ax3.set_title('回撤')
ax3.grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig('backtest_result.png', dpi=150)
plt.show()
# ============ 5. 主程序 ============
def main():
# 参数设置
symbol = '000001' # 平安银行
start_date = '20200101'
end_date = '20241231'
print("=" * 50)
print("双均线策略回测")
print("=" * 50)
# 获取数据
print(f"\n1. 获取 {symbol} 数据...")
data = get_stock_data(symbol, start_date, end_date)
print(f" 数据范围: {data.index[0]} ~ {data.index[-1]}")
print(f" 数据条数: {len(data)}")
# 生成信号
print("\n2. 运行策略...")
strategy = DualMAStrategy(short_period=5, long_period=20)
signals = strategy.generate_signals(data)
# 回测
print("\n3. 执行回测...")
backtester = Backtester(initial_capital=100000, commission=0.001)
results = backtester.run(signals)
# 计算指标
print("\n4. 计算绩效指标...")
metrics = backtester.calculate_metrics(results)
print("\n" + "=" * 50)
print("回测结果")
print("=" * 50)
for key, value in metrics.items():
print(f" {key}: {value}")
# 可视化
print("\n5. 生成图表...")
plot_results(results, f'{symbol} 双均线策略回测')
print("\n完成!")
if __name__ == '__main__':
main()2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
5.2 运行结果示例
==================================================
双均线策略回测
==================================================
1. 获取 000001 数据...
数据范围: 2020-01-02 ~ 2024-12-31
数据条数: 1215
2. 运行策略...
3. 执行回测...
4. 计算绩效指标...
==================================================
回测结果
==================================================
总收益率: 25.67%
年化收益率: 4.73%
年化波动率: 18.45%
夏普比率: 0.09
最大回撤: -28.34%
胜率: 51.23%
交易天数: 1215
5. 生成图表...
完成!2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
六、风险管理
6.1 风险管理的重要性
"Rule No.1: Never lose money. Rule No.2: Never forget Rule No.1." — Warren Buffett
量化交易中,风控比收益更重要。没有风控,再好的策略也可能一朝归零。
6.2 常见风控手段
┌─────────────────────────────────────────────────────────────────┐
│ 风险管理框架 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 事前风控(预防) │
│ ├── 仓位管理:单票不超过10%,总仓位控制 │
│ ├── 标的筛选:排除ST、流动性差的股票 │
│ ├── 策略分散:多策略组合,降低单策略风险 │
│ └── 压力测试:模拟极端行情下的表现 │
│ │
│ 事中风控(控制) │
│ ├── 止损:单笔亏损达到阈值强制平仓 │
│ ├── 止盈:利润达到目标时部分或全部止盈 │
│ ├── 回撤控制:总回撤超限时减仓或暂停 │
│ └── 实时监控:异常波动报警 │
│ │
│ 事后风控(复盘) │
│ ├── 归因分析:了解收益和亏损的来源 │
│ ├── 策略评估:定期检查策略有效性 │
│ └── 参数优化:根据市场变化调整 │
│ │
└─────────────────────────────────────────────────────────────────┘2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
6.3 仓位管理方法
| 方法 | 描述 | 适用场景 |
|---|---|---|
| 固定比例 | 每次交易固定投入一定比例 | 简单稳健 |
| 凯利公式 | 根据胜率和赔率计算最优仓位 | 理论最优 |
| 波动率调整 | 波动大时减仓,波动小时加仓 | 风险平价 |
| 金字塔加仓 | 盈利时加仓,亏损时不加 | 趋势策略 |
| 等风险分配 | 让每个持仓的风险贡献相等 | 组合配置 |
6.4 凯利公式
def kelly_fraction(win_rate, win_loss_ratio):
"""
凯利公式计算最优仓位
win_rate: 胜率
win_loss_ratio: 盈亏比(平均盈利/平均亏损)
"""
kelly = win_rate - (1 - win_rate) / win_loss_ratio
# 实际使用时通常取半凯利,更保守
half_kelly = kelly / 2
return max(0, min(1, half_kelly)) # 限制在0-1之间
# 示例
win_rate = 0.55 # 55%胜率
win_loss_ratio = 1.5 # 盈亏比1.5
optimal_position = kelly_fraction(win_rate, win_loss_ratio)
print(f"最优仓位: {optimal_position:.1%}") # 约12.5%2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
七、量化交易的常见误区
7.1 十大误区
| 序号 | 误区 | 真相 |
|---|---|---|
| 1 | 回测赚钱 = 实盘赚钱 | 过拟合、交易成本、滑点都会让实盘大打折扣 |
| 2 | 策略越复杂越好 | 简单策略往往更稳健,复杂模型容易过拟合 |
| 3 | 机器学习能预测市场 | ML在金融领域的效果有限,信噪比太低 |
| 4 | 量化可以稳赚不赔 | 没有圣杯,任何策略都有失效的时候 |
| 5 | 高频交易是暴富捷径 | 门槛极高,个人几乎无法参与 |
| 6 | 夏普比率越高越好 | 要结合容量、稳定性等综合考虑 |
| 7 | 参数优化找最优值 | 应关注参数稳定性,而非最优点 |
| 8 | 策略有效就永远有效 | 市场在变,策略会失效,需持续迭代 |
| 9 | 别人的策略拿来就能用 | 环境、参数、执行都可能不同 |
| 10 | 量化不需要理解市场 | 理解市场逻辑才能设计出好策略 |
7.2 避免过拟合
过拟合的信号:
□ 回测曲线过于完美
□ 参数极度敏感
□ 样本外表现急剧下降
□ 策略逻辑过于复杂
□ 使用了太多参数
避免过拟合的方法:
□ 使用样本外测试
□ 交叉验证
□ 参数敏感性分析
□ 保持策略简单
□ 关注策略逻辑是否有意义2
3
4
5
6
7
8
9
10
11
12
13
八、量化交易入门路径
8.1 学习路线图
┌─────────────────────────────────────────────────────────────────┐
│ 量化交易学习路线 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 第一阶段:基础准备(1-2个月) │
│ ├── Python编程基础 │
│ ├── NumPy、Pandas数据处理 │
│ ├── 金融市场基础知识 │
│ └── 统计学基础 │
│ │
│ 第二阶段:策略入门(2-3个月) │
│ ├── 技术分析基础(均线、MACD、KDJ...) │
│ ├── 经典策略实现(双均线、动量、均值回归) │
│ ├── 学习使用回测框架(Backtrader) │
│ └── 理解回测指标 │
│ │
│ 第三阶段:进阶提升(3-6个月) │
│ ├── 因子投资理论 │
│ ├── 多因子模型构建 │
│ ├── 机器学习基础 │
│ ├── 风险管理 │
│ └── 组合优化 │
│ │
│ 第四阶段:实战阶段(持续) │
│ ├── 模拟盘实践 │
│ ├── 小资金实盘 │
│ ├── 策略迭代优化 │
│ └── 持续学习和研究 │
│ │
└─────────────────────────────────────────────────────────────────┘2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
8.2 推荐资源
书籍
| 类别 | 书名 | 推荐理由 |
|---|---|---|
| 入门 | 《打开量化投资的黑箱》 | 通俗易懂,适合小白 |
| Python | 《Python for Finance》 | 金融Python经典 |
| 策略 | 《量化投资策略与技术》 | 国内经典教材 |
| 因子 | 《Quantitative Equity Portfolio Management》 | 因子投资圣经 |
| 风控 | 《Active Portfolio Management》 | 组合管理必读 |
| 进阶 | 《Advances in Financial Machine Learning》 | ML量化前沿 |
在线平台
| 平台 | 特点 |
|---|---|
| 聚宽(JoinQuant) | 国内最大量化平台,数据齐全 |
| 优矿(Uqer) | 通联数据出品,因子库丰富 |
| BigQuant | AI量化平台 |
| Quantopian | 已关闭,但资料仍可学习 |
| QuantConnect | 国际化,支持多市场 |
学习社区
- 知乎量化相关话题
- 雪球量化讨论区
- GitHub量化项目
- 微信公众号:宽客在线、量化投资与机器学习
8.3 新手建议
1. 从简单策略开始
└── 先实现双均线、动量等经典策略,理解完整流程
2. 重视基础能力
└── Python、统计、金融知识都要扎实
3. 不要迷信复杂模型
└── 简单有效的策略比复杂失效的好
4. 先模拟后实盘
└── 至少模拟3-6个月再考虑实盘
5. 小资金起步
└── 用亏得起的钱验证策略
6. 保持学习
└── 市场在变,策略要迭代
7. 管理预期
└── 量化不是印钞机,年化20%已经很优秀
8. 关注风控
└── 活着比什么都重要2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
九、国内量化交易现状
9.1 市场概况
- 公募量化:规模快速增长,指数增强、量化选股为主
- 私募量化:头部机构规模超百亿,策略多元化
- 个人量化:门槛降低,工具和数据越来越丰富
9.2 A股量化的特点
| 特点 | 说明 |
|---|---|
| 散户占比高 | 相比美股,A股散户交易占比更高,市场效率较低 |
| 涨跌停限制 | 10%/20%涨跌停,影响策略设计 |
| T+1交易 | 当日买入次日才能卖出 |
| 做空限制 | 融券难、成本高,限制做空策略 |
| 政策影响大 | 政策变化对市场影响显著 |
9.3 机会与挑战
机会
- A股市场效率相对较低,alpha机会更多
- 数据和工具日益完善
- 个人量化门槛持续降低
挑战
- 竞争加剧,策略失效加速
- 监管政策变化
- 市场风格切换频繁
十、总结
核心要点回顾
- 量化交易的本质:用数据和算法替代主观判断,实现交易决策的系统化
- 核心流程:数据获取 → 策略研发 → 回测验证 → 实盘交易 → 监控优化
- 主流策略:技术分析类、因子投资类、统计套利类、机器学习类
- 技术栈:Python + 数据库 + 回测框架 + 执行系统
- 风险管理:仓位控制、止损止盈、回撤控制、策略分散
- 学习路径:基础准备 → 策略入门 → 进阶提升 → 实战迭代
最后的话
量化交易不是万能的,它只是投资的一种方法论。它不能保证你赚钱,但能帮你:
- ✅ 克服情绪干扰,坚守纪律
- ✅ 系统化思考,避免拍脑袋
- ✅ 回测验证,有据可依
- ✅ 提高效率,覆盖更多标的
如果你是技术背景的投资者,量化交易是一个值得探索的方向。但请记住:
量化是工具,不是圣杯。敬畏市场,控制风险,保持学习。
祝你在量化交易的道路上有所收获!
附录
A. 常用Python库速查
# 数据处理
import numpy as np
import pandas as pd
# 数据获取
import akshare as ak
import tushare as ts
# 可视化
import matplotlib.pyplot as plt
import plotly.graph_objects as go
# 回测
import backtrader as bt
# 机器学习
from sklearn.ensemble import RandomForestClassifier
import xgboost as xgb
import lightgbm as lgb
# 统计
from scipy import stats
import statsmodels.api as sm2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
B. 常用技术指标公式
| 指标 | 公式 |
|---|---|
| MA(N) | SUM(CLOSE, N) / N |
| EMA(N) | 2/(N+1) CLOSE + (N-1)/(N+1) EMA(N)_prev |
| MACD | EMA(12) - EMA(26) |
| RSI(N) | 100 * UP_AVG / (UP_AVG + DOWN_AVG) |
| 布林带 | 中轨=MA(20), 上轨=中轨+2STD, 下轨=中轨-2STD |
C. 回测检查清单
□ 是否使用了未来数据?
□ 是否考虑了交易成本?
□ 是否考虑了滑点?
□ 是否考虑了流动性限制?
□ 是否有幸存者偏差?
□ 样本外测试结果如何?
□ 参数敏感性如何?
□ 最大回撤是否可接受?
□ 策略逻辑是否有经济意义?2
3
4
5
6
7
8
9
免责声明:本文仅为量化交易知识分享,不构成任何投资建议。投资有风险,入市需谨慎。
💬 评论