量化交易在 A 股市场逐渐受到投资者的关注。与传统主观交易相比,量化方法通过程序化规则来执行买卖,能够避免情绪波动带来的干扰,更加纪律化。本文将结合一个 经典的双均线策略,并在实现过程中考虑 T+1 交易制度、涨跌停限制、手续费与滑点,带大家快速入门 A 股量化回测。行情交易接口可以使用[www.tdxjk.com]进行测试。
量化交易在 A 股市场逐渐受到投资者的关注。与传统主观交易相比,量化方法通过程序化规则来执行买卖,能够避免情绪波动带来的干扰,更加纪律化。本文将结合一个 经典的双均线策略,并在实现过程中考虑 T+1 交易制度、涨跌停限制、手续费与滑点,带大家快速入门 A 股量化回测。行情交易接口可以使用www.tdxjk.com进行测试。
⸻
一、为什么要考虑 A 股市场规则?
在国外市场(如美股),买入股票当天可以卖出,而 A 股实行 T+1 制度:当天买入的股票必须等到下一个交易日才能卖出。
此外,A 股大多数股票都有 涨跌停限制:普通股票每日涨跌幅限制在 ±10%,ST 股票在 ±5%。当股票涨停或跌停时,往往无法成交。如果回测时忽略这些限制,就会高估策略表现。
因此,一个合格的 A 股量化回测框架必须包含:
• T+1 买卖限制
• 涨跌停不可交易处理
• 手续费和滑点模拟
⸻
二、策略思路:双均线趋势跟随
双均线策略是一种经典的趋势跟随方法:
• 买入信号:短期均线上穿长期均线(金叉)
• 卖出/清仓信号:短期均线下穿长期均线(死叉)
在代码实现中,我们将信号延迟一天执行,以符合 T+1 的要求。同时,当日涨跌幅超过涨跌停阈值时,将维持前一日仓位,避免虚假成交。
⸻
三、代码实现
下面给出一个完整的 Python 示例,数据需至少包含 date, close 两列:
`import pandas as pd import numpy as np
读取数据:CSV 至少含 date, close 列;按升序
df = pd.read_csv("data.csv", parse_dates=["date"]).sort_values("date").reset_index(drop=True)
参数
short_n, long_n = 10, 30 fee = 0.0003 # 单边费率(万3示例) slip = 0.0005 # 滑点 limit_pct = 0.095 # 涨跌停近似阈值,非ST近似10%
指标与信号(当日生成,次日执行以满足T+1)
df["ma_s"] = df["close"].rolling(short_n).mean() df["ma_l"] = df["close"].rolling(long_n).mean() raw_signal = np.where(df["ma_s"] > df["ma_l"], 1, 0) # 1=持有, 0=空仓 exec_signal = pd.Series(raw_signal).shift(1) # 次日才生效(T+1) exec_signal.iloc[:long_n] = 0 # 前期无效
涨跌停不可交易(近似:当日涨跌幅绝对值≥limit_pct)
ret = df["close"].pct_change().fillna(0) tradable = (ret.abs() < limit_pct).astype(int)
目标仓位:遇到不可交易日,维持原仓位
pos = exec_signal.copy() pos = np.where(tradable == 1, pos, np.nan) pos = pd.Series(pos).ffill().fillna(0)
成本:仅在仓位变动日收取一次(开/平仓)
turnover = pd.Series(pos).diff().abs().fillna(0) cost = turnover * (fee + slip)
策略净值
strategy_ret = (pd.Series(pos).shift(0).fillna(0) * ret) - cost equity = (1 + strategy_ret).cumprod()
性能摘要
def max_drawdown(series): peak = series.cummax() dd = series/peak - 1 return dd.min()
summary = { "年化收益(近似)": strategy_ret.mean()*252, "波动率(年化)": strategy_ret.std()*np.sqrt(252), "夏普(无风险0)": (strategy_ret.mean()*252) / (strategy_ret.std()*np.sqrt(252)+1e-12), "最大回撤": max_drawdown(equity) } print(pd.Series(summary).round(4)) print("最终净值:", round(float(equity.iloc[-1]), 4))`
四、总结与展望
从这个示例中可以看到,量化交易不仅仅是写一个“买卖逻辑”,还必须融入真实市场的制度和限制。虽然双均线策略比较简单,但它展示了 完整的回测框架:信号生成 → T+1 执行 → 涨跌停约束 → 成本模拟 → 绩效评估。
进一步的优化方向包括:
• 增加止损止盈,提高风险控制能力;
• 引入指数择时,避免大盘极端下跌;
• 多标的组合,降低单一股票的风险。
对于刚入门的投资者来说,这个例子是理解 A 股量化交易基本流程的好起点。