A股量化交易策略入门:从数据获取到策略回测的全流程实战

1次阅读
没有评论

共计 2406 个字符,预计需要花费 7 分钟才能阅读完成。

image.webp

1. 量化交易初探:概念与 A 股特性

量化交易简单来说就是用数学模型替代主观判断。在 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. 性能优化技巧

当数据量变大时,这些方法能显著提升速度:

  1. 使用 Pandas 的矢量化操作:避免在循环中进行元素级运算
  2. 预计算指标 :在__init__ 中提前计算好所有技术指标
  3. 采样回测:先用日线测试策略逻辑,再用分钟级数据细化
  4. 关闭绘图cerebro.run(stdstats=False) 可以节省大量时间

6. 从入门到进阶

完成基础策略后,建议从这些方向继续优化:

  1. 参数优化 :用cerebro.optstrategy() 测试不同均线周期组合
  2. 多因子模型:加入成交量、MACD 等其他指标
  3. 风险控制:设置止损止盈机制

7. 三个思考题

  1. 如何修改策略使其在牛熊市表现更稳定?
  2. 如果加入交易量过滤条件(例如突破时放量),应该如何实现?
  3. 回测发现夏普比率很高但最大回撤很大,该如何平衡?

最后提醒:任何策略都需要经过充分验证再投入实盘,建议先用模拟账户测试 3 个月以上。量化交易不是圣杯,持续迭代才是王道。

正文完
 0
评论(没有评论)