A股股票量化交易入门:双均线策略的实现与思路

250 阅读4分钟

量化交易在 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 股量化交易基本流程的好起点。