共计 2406 个字符,预计需要花费 7 分钟才能阅读完成。
1. 量化交易初探:概念与 A 股特性
量化交易简单来说就是用数学模型替代主观判断。在 A 股市场,量化策略需要特别注意以下特点:

- T+ 1 交易制度(当日买入次日才能卖出)
- 涨跌停限制(普通股票±10%,ST 股±5%)
- 交易成本包括佣金(约 0.025%)和印花税(卖出时 0.1%)
2. 新手常踩的坑
从我自己的踩坑经验看,这些问题是初学者最容易栽跟头的:
- 数据质量问题:停牌股票、复权价格处理不当
- 过拟合陷阱:在历史数据上表现完美,实盘就失效
- 交易成本忽视:忘记扣除手续费导致回测结果虚高
- 未来函数:不小心使用了当时不可见的数据
3. 实战工具箱搭建
3.1 数据获取 – Tushare
首先注册 Tushare Pro 账号获取 API 密钥(免费版足够入门使用):
import tushare as ts
ts.set_token('你的 token') # 在个人中心获取
pro = ts.pro_api()
# 获取沪深 300 成分股
hs300 = pro.index_weight(index_code='399300.SZ', start_date='20230101', end_date='20231231')
# 获取个股日线数据
df = pro.daily(ts_code='600519.SH', start_date='20200101', end_date='20201231')
3.2 数据处理 – Pandas
拿到数据后需要做这些预处理:
import pandas as pd
# 处理日期格式
df['trade_date'] = pd.to_datetime(df['trade_date'], format='%Y%m%d')
df.set_index('trade_date', inplace=True)
# 计算 5 日均线
df['ma5'] = df['close'].rolling(5).mean()
# 处理停牌数据(用前复权)df['close'] = df['close'].fillna(method='ffill')
3.3 回测框架 – Backtrader
下面实现一个简单的双均线策略:
import backtrader as bt
class DualMAStrategy(bt.Strategy):
params = (('fast', 5), ('slow', 20)) # 参数可调
def __init__(self):
self.ma_fast = bt.indicators.SMA(period=self.p.fast)
self.ma_slow = bt.indicators.SMA(period=self.p.slow)
def next(self):
if not self.position: # 没有持仓
if self.ma_fast[0] > self.ma_slow[0]: # 金叉
self.buy(size=100) # 买入 100 股
elif self.ma_fast[0] < self.ma_slow[0]: # 死叉
self.close() # 平仓
# 创建回测引擎
cerebro = bt.Cerebro()
data = bt.feeds.PandasData(dataname=df)
cerebro.adddata(data)
cerebro.addstrategy(DualMAStrategy)
# 设置初始资金 10 万
cerebro.broker.set_cash(100000)
# 添加分析器
cerebro.addanalyzer(bt.analyzers.SharpeRatio, _name='sharpe')
# 运行回测
results = cerebro.run()
print('夏普比率:', results[0].analyzers.sharpe.get_analysis()['sharperatio'])
# 可视化
cerebro.plot(style='candlestick')
4. 避坑指南
4.1 涨跌停处理
在策略中需要添加判断,避免在涨停时买入或跌停时卖出:
def next(self):
# 获取当日涨跌停价格
limit_up = self.data.close[0] * 1.1 # 涨停价
limit_down = self.data.close[0] * 0.9 # 跌停价
if not self.position and self.data.close[0] < limit_up: # 非涨停才买入
# 买入逻辑
4.2 避免未来函数
这些操作会导致未来函数问题:
- 使用
close[1](明天的收盘价) - 在
next()中使用datetime.now() - 基于完整数据集计算的指标(应该用
self.datas[0].close.get(size=n))
4.3 交易成本计算
Backtrader 中需要设置精确的交易成本:
# 设置佣金万 2.5,印花税千 1
cerebro.broker.setcommission(
commission=0.00025, # 佣金
stamp_duty=0.001, # 印花税(仅卖出)stocklike=True # A 股模式
)
5. 性能优化技巧
当数据量变大时,这些方法能显著提升速度:
- 使用 Pandas 的矢量化操作:避免在循环中进行元素级运算
- 预计算指标 :在
__init__中提前计算好所有技术指标 - 采样回测:先用日线测试策略逻辑,再用分钟级数据细化
- 关闭绘图:
cerebro.run(stdstats=False)可以节省大量时间
6. 从入门到进阶
完成基础策略后,建议从这些方向继续优化:
- 参数优化 :用
cerebro.optstrategy()测试不同均线周期组合 - 多因子模型:加入成交量、MACD 等其他指标
- 风险控制:设置止损止盈机制
7. 三个思考题
- 如何修改策略使其在牛熊市表现更稳定?
- 如果加入交易量过滤条件(例如突破时放量),应该如何实现?
- 回测发现夏普比率很高但最大回撤很大,该如何平衡?
最后提醒:任何策略都需要经过充分验证再投入实盘,建议先用模拟账户测试 3 个月以上。量化交易不是圣杯,持续迭代才是王道。
正文完
