量化交易入门:经典策略大盘点与Python实战
量化交易入门:经典策略大盘点与Python实战
很多人一听到“量化交易”,脑子里浮现的可能是这样一幅画面:成排的服务器高速运转、K线图在屏幕上飞速跳动、交易员头也不抬地敲着键盘。但实际上,量化的核心并没有那么高深。简单来说,就是把你的交易思路写成代码,让计算机按照这个规则自动执行,从而克服人性的贪婪与恐惧,也让我们可以在历史数据上验证自己的策略到底靠不靠谱。使用量化交易完全遵循机械交易,避免主观交易。
本文作为量化交易系列的开篇,将为你系统梳理市面上最经典的量化交易策略类型,带你熟悉Tushare这个国内最实用的免费行情数据平台,最后通过一个完整的Python Demo,为你展示从数据获取到策略回测的全流程。
一、经典量化交易策略大盘点
量化策略五花八门,但归根结底,大多数策略都能归入以下几种经典类型。
1. 趋势跟踪策略
核心逻辑:顺势而为,捕捉价格的持续方向。 当市场形成明显趋势时,涨会继续涨,跌会继续跌,策略的任务就是识别趋势并跟随到底,不试图预测顶部或底部。
代表策略:
- 双均线策略:短期均线上穿长期均线(金叉)时买入,下穿(死叉)时卖出。逻辑简单直观,是量化的“Hello World”级策略。
- 海龟交易法则:价格突破20日高点时入场,跌破10日低点时止损退出,堪称趋势跟踪的经典范式。
适用场景: 单边牛市或熊市,爆发力强,收益可观。缺点: 在震荡行情中容易被“假突破”反复收割,造成频繁止损。
2. 均值回归策略
核心逻辑:涨多了会跌,跌多了会涨,价格终究围绕“均值”上下波动。 在震荡市场中,这是天然的赚钱利器——在高位卖出、在低位买入,赚的就是“反复震荡”的钱。
代表策略:
- 布林带策略:当价格触及或突破上轨时视为超买,考虑卖出;触及下轨时视为超卖,考虑买入。
- RSI超买超卖策略:RSI超过70视为超买,考虑卖出;低于30视为超卖,考虑买入。
适用场景: 区间震荡市场,胜率稳定。缺点: 一旦出现强趋势行情,逆势操作容易“接飞刀”,造成较大亏损。
3. 动量策略
核心逻辑:强者恒强,弱者恒弱。 近期表现强势的资产,这种强势惯性有望延续到未来;反之亦然。
代表策略:
- 时间序列动量:如果过去N天的累计涨幅为正,就买入;若为负,则做空或卖出。
- 横截面动量:在同一时间点,买入表现最好的几只股票,卖出表现最差的几只,构建多空组合。
适用场景: 趋势明显的市场,捕捉“牛股”时爆发力强。缺点: 动量反转发生时,回撤较大。
4. 套利策略
核心逻辑:利用资产间的价格差异获取“无风险”或低风险收益。 市场并非永远有效,不同资产之间的定价偏差会时不时出现,套利者的任务就是捕捉这些偏差并等待其收敛。
代表策略:
- 配对交易:选取两只高度相关的股票(如可口可乐与百事),当它们的价差偏离历史均值一定程度时,做多便宜的那只、做空贵的那只,等待价差回归后平仓获利。
- 期现套利:当股指期货价格与现货指数价格出现价差(基差)时,同时做多低的一方、做空高的一方。
适用场景: 市场中性,收益与大盘方向无关,回撤较小。缺点: 对数据和模型要求较高,协整关系可能因基本面变化而断裂。
5. 多因子选股策略
核心逻辑:从多个维度(因子)对股票进行综合评分,选出最优组合。 这是机构量化投资的主流范式,通过组合多个具有风险溢价来源的因子,实现稳健的长期收益。
常用因子:
- 价值因子:低PE、低PB的股票长期表现优于高估值股票。
- 动量因子:过去表现强势的股票有延续倾向。
- 质量因子:高ROE、低负债的公司质地更优。
- 低波动因子:低波动股票长期收益反而优于高波动股票。
适用场景: 中低频调仓(月频或季频),长期夏普比率稳定,资金容量大。缺点: 需防范因子拥挤与过拟合,对数据质量和投研能力要求较高。
6. 网格交易策略
核心逻辑:在预设的价格区间内设置多层买卖单,价格下跌一层就买一份,上涨一层就卖一份,通过反复的低买高卖累积收益。 这是一种特殊的均值回归实践,本质上赚的是价格波动带来的差价。
适用场景: 区间震荡市场。缺点: 单边行情中可能导致浮亏持续扩大,必须设置好网格间距和止损边界。
7. 事件驱动策略
核心逻辑:基于财报发布、政策变动、重大公告等事件对价格的影响进行交易。 如果财报超预期,买入并持有;若低于预期,则卖出或做空。
技术依赖: 常结合自然语言处理(NLP)技术对新闻和公告进行情感分析。适用场景: 财报季、政策窗口期。缺点: 对信息获取速度和事件解读能力要求较高。
以上就是主流的几类经典策略。单一策略均有其适应环境和失效周期,成熟的量化团队往往采用多策略融合的方式,在趋势市中靠趋势策略盈利,在震荡市中靠均值回归策略平滑收益,从而实现稳健增长。
对于个人量化初学者,建议从趋势跟踪(如双均线)或均值回归策略入手,用Python进行回测验证,避免一开始就涉足高频或套利等门槛较高的领域。
二、Tushare:打开A股数据之门的免费钥匙
有了策略思路,数据从哪里来?这是每个量化初学者面临的第一个实际问题。Tushare是目前国内最成熟、最实用的免费开源Python财经数据接口包。
Tushare的核心优势:
- 完全免费:基础版个人开发者完全免费,Pro版通过日常签到即可获得积分兑换数据权限。
- 数据覆盖面广:从日线/分钟级K线到财务报表,从宏观经济指标到行业分类数据,甚至包括北向资金流向和龙虎榜数据,Tushare都能一键获取。
- 安装即用:只需
pip install tushare,注册获取API token后几行代码即可获取真实行情数据。
环境配置与数据获取示例
import tushare as ts
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 初始化Pro接口(请在tushare.pro官网注册获取token)
# 安全起见,建议使用环境变量,不要直接将token写在代码中
# ts.set_token('你的token')
pro = ts.pro_api()
# 获取贵州茅台(600519.SH)2023年全年日线数据
df = pro.daily(
ts_code='600519.SH',
start_date='20230101',
end_date='20231231'
)
# 数据预处理:按交易日期排序,并转为时间索引
df = df.sort_values('trade_date')
df['trade_date'] = pd.to_datetime(df['trade_date'], format='%Y%m%d')
df.set_index('trade_date', inplace=True)
# 预览数据
print(df.head())
print(df.info())
代码说明:ts_code的格式必须是“代码.交易所”——6开头的股票加.SH(沪市),0和3开头的加.SZ(深市)。
其他免费数据源参考
除了Tushare,国内还有几个不错的免费备选:
- AkShare:免费开源,覆盖实时/历史行情,数据源来自新浪、东方财经等,无需注册即可使用。
- Baostock:专为A股设计,支持复权因子计算,无需注册。
- 智兔数服:每日200次免费调用,含实时行情与技术指标(MACD、RSI等)。
建议初学者以Tushare或AkShare作为起点,这两个库的文档最完善,社区最活跃。
三、实战Demo:双均线策略回测(以贵州茅台为例)
理论说完了,数据也能拿到了,接下来就用一个最经典的双均线策略来跑通整个量化回测流程。我们将以贵州茅台(600519.SH)2023年的日线数据为例,实现金叉买入、死叉卖出的完整回测,并评估收益表现。
第1步:获取数据并计算均线
# 获取贵州茅台2023年日线数据(沿用上面的df)
# 计算5日均线和20日均线
df['ma5'] = df['close'].rolling(window=5).mean()
df['ma20'] = df['close'].rolling(window=20).mean()
# 查看均线计算结果
print(df[['close', 'ma5', 'ma20']].tail(10))
第2步:生成交易信号
双均线策略的核心逻辑很简单:当ma5从下方上穿ma20时,产生买入信号(金叉);当ma5从上方下穿ma20时,产生卖出信号(死叉)。
# 生成信号列:1表示金叉(买入),-1表示死叉(卖出),0表示无操作
df['signal'] = 0
# 金叉:前一天的ma5 <= ma20,今天的ma5 > ma20
df.loc[(df['ma5'].shift(1) <= df['ma20'].shift(1)) & (df['ma5'] > df['ma20']), 'signal'] = 1
# 死叉:前一天的ma5 >= ma20,今天的ma5 < ma20
df.loc[(df['ma5'].shift(1) >= df['ma20'].shift(1)) & (df['ma5'] < df['ma20']), 'signal'] = -1
# 统计信号数量
print(f"买入信号次数: {(df['signal'] == 1).sum()}")
print(f"卖出信号次数: {(df['signal'] == -1).sum()}")
# 可视化均线与信号点
plt.figure(figsize=(14, 7))
plt.plot(df.index, df['close'], label='收盘价', alpha=0.7)
plt.plot(df.index, df['ma5'], label='5日均线')
plt.plot(df.index, df['ma20'], label='20日均线')
# 标注金叉(买入)和死叉(卖出)
buy_signals = df[df['signal'] == 1]
sell_signals = df[df['signal'] == -1]
plt.scatter(buy_signals.index, buy_signals['close'], color='red', marker='^', s=100, label='金叉买入')
plt.scatter(sell_signals.index, sell_signals['close'], color='green', marker='v', s=100, label='死叉卖出')
plt.title('贵州茅台2023年股价走势与双均线交易信号')
plt.legend()
plt.grid(True, alpha=0.3)
plt.show()
第3步:模拟交易并计算收益
有了信号之后,就可以模拟真实的买卖交易了。我们采用逐笔交易的模拟方式:每次金叉买入,每次死叉全部卖出,并计算每一笔交易的盈亏。为了更贴近真实场景,我们加入了千分之一的手续费/滑点成本(单边0.1%) 假设。
# 交易模拟
position = 0 # 当前持仓数量(股)
cash = 100000 # 初始资金(元)
cost_rate = 0.001 # 手续费+滑点费率(双边合计)
trade_log = [] # 记录每笔交易
for i in range(len(df)):
price = df['close'].iloc[i]
signal = df['signal'].iloc[i]
# 金叉买入:满仓买入(全仓买入)
if signal == 1 and position == 0:
# 计算可买股数(确保是100的整数倍,A股交易单位)
shares = int(cash / price / 100) * 100
if shares > 0:
cost = shares * price * (1 + cost_rate)
cash -= cost
position += shares
trade_log.append({
'日期': df.index[i],
'操作': '买入',
'价格': price,
'股数': shares,
'金额': cost,
'剩余现金': cash
})
# 死叉卖出:清仓卖出
elif signal == -1 and position > 0:
revenue = position * price * (1 - cost_rate)
cash += revenue
trade_log.append({
'日期': df.index[i],
'操作': '卖出',
'价格': price,
'股数': position,
'金额': revenue,
'剩余现金': cash
})
position = 0
# 计算最终总资产(现金 + 持仓市值)
final_value = cash + position * df['close'].iloc[-1] * (1 - cost_rate)
total_return = (final_value - 100000) / 100000 * 100
# 计算买入持有策略的收益率,用于对比
buy_hold_return = (df['close'].iloc[-1] - df['close'].iloc[0]) / df['close'].iloc[0] * 100
print("========== 回测结果 ==========")
print(f"初始资金: 100,000 元")
print(f"期末总资产: {final_value:.2f} 元")
print(f"策略总收益率: {total_return:.2f}%")
print(f"买入持有收益率: {buy_hold_return:.2f}%")
print(f"\n交易记录(共{len(trade_log)}笔):")
for trade in trade_log:
print(f" {trade['日期'].strftime('%Y-%m-%d')}: {trade['操作']} {trade['股数']}股 @ {trade['价格']:.2f}元")
第4步:扩展思路——加入止损机制
上面的Demo是一个最简版本的双均线回测框架。在实际量化实践中,策略往往会加入止损止盈等风控模块来增强鲁棒性。例如:
# 简化版止损逻辑示例
stop_loss_pct = 0.08 # 8%止损线
entry_price = 0 # 记录每笔买入成本
# 在原有的交易循环中增加止损判断
# 如果持仓浮亏超过8%且持仓天数超过3天,则强制平仓
感兴趣的朋友可以自行扩展,也可以在评论区交流讨论。
第5步:K线可视化(最终整体效果)
为了让策略效果更加直观,我们来绘制一张包含K线、均线和交易信号的完整图表:
import matplotlib.pyplot as plt
import mplfinance as mpf
# 准备K线数据
df_ohlc = df[['open', 'high', 'low', 'close', 'volume']].copy()
# 添加买入卖出信号附加图
apds = [
mpf.make_addplot(df['ma5'], color='blue', width=0.8),
mpf.make_addplot(df['ma20'], color='orange', width=0.8),
mpf.make_addplot(buy_signals['close'], type='scatter', markersize=100, marker='^', color='red'),
mpf.make_addplot(sell_signals['close'], type='scatter', markersize=100, marker='v', color='green')
]
# 绘制K线图
mpf.plot(
df_ohlc,
type='candle',
style='charles',
title='贵州茅台双均线策略回测',
ylabel='价格(元)',
addplot=apds,
volume=True,
figsize=(14, 8)
)
四、总结与系列预告
本文作为量化交易系列的开篇,系统梳理了七大类经典量化策略的核心逻辑与适用场景,介绍了Tushare这个国内最实用的免费行情数据平台,并通过一个完整的Python Demo,实现了从数据获取→均线计算→信号生成→交易模拟→回测评估的全流程回测框架。
通过这个案例,你应该已经看到:量化交易并不神秘,把交易思路写成代码,让计算机帮你回测、帮你执行,这就是量化的本质。
当然,双均线策略只是一个起点。一个完整的量化交易系统,还需要考虑更多因素:多品种分散、仓位管理、滑点模拟、策略组合等。在后续的系列文章中,我将针对每一种经典策略进行深度剖析和完整实战演示。
后续系列文章预告:
- 📈 趋势跟踪篇:双均线策略的优化与进阶(海龟交易法则、布林带突破)
- 🔄 均值回归篇:从RSI到布林带的震荡市交易实战
- 🎯 动量策略篇:A股市场的横截面动量与时间序列动量回测
- 🧩 多因子选股篇:从因子挖掘到组合构建的完整流程
- 🛠️ 回测框架篇:用Backtrader搭建专业级的回测系统
如果这篇文章对你有帮助,欢迎点赞 + 收藏 + 关注,后续系列内容将持续更新,一起学习讨论和进步!
友情提示:量化回测结果不代表未来实盘表现。市场环境会变化,任何策略都有失效周期,实盘交易前务必经过充分的模拟验证和风险评估。投资有风险,入市需谨慎。
更多推荐
所有评论(0)