量化交易
量化交易的核心在于用数学模型替代主观判断,将投资逻辑转化为可回测、可执行的代码。
常见算法
统计套利与均值回归类,这类算法基于“价格偏离均值后会回归”的假设,适合震荡市。
- 配对交易:寻找两只高度相关(如茅台与五粮液)的股票,当价差偏离历史均值2个标准差时,做空高价股、做多低价股,等待价差回归。
- 均值回归策略:计算股票价格相对其移动平均线(如20日线)的乖离率,当乖离率过大时反向操作。
- 协整模型:比相关性更严格,通过ADF检验确认长期均衡关系,常用于多股票组合的价差交易。
趋势跟踪与动量类,这类算法“追涨杀跌”,在趋势明确的市场中表现优异。 - 双均线策略:短期均线上穿长期均线(金叉)买入,死叉卖出。这是最基础的CTA策略。
- 动量因子:买入过去3-12个月涨幅最高的股票(赢家组合),卖出跌幅最大的(输家组合),月度调仓。
- 海龟交易法则:基于唐奇安通道突破(20日高点突破买入,10日低点止损),配合ATR(平均真实波幅)动态调整仓位。
机器学习与深度学习类,这类算法通过数据驱动挖掘非线性关系,适合处理高维特征。 - 梯度提升树(XGBoost/LightGBM):用历史量价数据(如换手率、市盈率、北向资金流)作为特征,预测未来5日涨跌概率,输出为0-1的分数排序选股。
- LSTM(长短期记忆网络):处理时间序列,捕捉股价的长期依赖关系,常用于预测次日开盘价或波动率。
- 强化学习:将交易建模为马尔可夫决策过程,智能体通过不断试错学习最优买卖点(如DQN算法)。
高频与微观结构类,这类算法依赖极低延迟和订单簿数据,普通散户较难参与。 - 做市策略:同时挂买单和卖单,赚取买卖价差(如盘口薄时挂单,厚时撤单)。
- 冰山订单算法:将大单拆分为小单,按时间或成交量加权(TWAP/VWAP)逐步执行,减少市场冲击。
风险平价与组合优化类,这类算法不直接选股,而是优化资产配置权重。 - 风险平价:使每个资产对组合总风险的贡献度相等,常用在股债混合策略中。
- Black-Litterman模型:结合市场均衡收益与投资者主观观点,输出更稳定的权重分配。
事件驱动与另类数据类 - 财报事件策略:在财报发布前,根据分析师预期调整(EPS修正)提前建仓,财报后利用“盈余漂移”现象继续持有。
- 舆情分析:用NLP(自然语言处理)解析新闻、股吧评论的情感得分,当情绪极端悲观时反向买入。
关键提醒- 回测陷阱:任何算法都必须经过样本外测试和蒙特卡洛模拟,防止过拟合。
- 交易成本:高频策略的换手率极高,佣金和滑点可能吞噬全部利润。
- 市场状态切换:均值回归策略在牛市中会持续亏损,需加入市场状态识别(如用波动率指数VIX判断)。
代码实现
Python实现双均线,回测代码框架。
双均线策略 · 极简演示
不联网随机生成假股价,跑一遍金叉买入/死叉卖出。只装 pandas 即可运行:pip install pandas
import numpy as np
import pandas as pd
# - 1. 生成假股价(随机游走, 150天) -
np.random.seed(42)
N = 150
price = 100 * np.exp(np.cumsum(np.random.normal(0.0005, 0.02, N))) # 几何随机游走
df = pd.DataFrame({"date": pd.date_range("2024-01-01", periods=N), "close": price})
# - 2. 算双均线 + 金叉/死叉 -
SHORT, LONG = 5, 20
df["ma_s"] = df["close"].rolling(SHORT).mean()
df["ma_l"] = df["close"].rolling(LONG).mean()
diff = df["ma_s"] - df["ma_l"]
cross_up = (diff > 0) & (diff.shift(1) <= 0) # 金叉 -> 买
cross_down = (diff < 0) & (diff.shift(1) >= 0) # 死叉 -> 卖
# - 3. 持仓: 金叉后持有, 死叉后空仓 -
df["pos"] = pd.Series(np.where(cross_up, 1, np.where(cross_down, 0, np.nan))).ffill().fillna(0)
# - 4. 结算 -
df["ret"] = df["close"].pct_change().fillna(0)
df["strat"] = df["pos"].shift(1) * df["ret"] # 次日开盘执行
df["equity"] = (1 + df["strat"]).cumprod()
df["buyhold"] = df["close"] / df["close"].iloc[0]
# - 5. 输出 -
print(f"策略收益 {df['equity'].iloc[-1]-1:+.2%} | 买入持有 {df['buyhold'].iloc[-1]-1:+.2%}")
print(f"总交易 {int((df['pos'].diff().abs()>0).sum())} 次\n")
print(df.tail(8)[["date", "close", "ma_s", "ma_l", "pos", "equity"]].to_string(index=False))
- 双均线:短期均线(5日)上穿长期均线(20日)→ 金叉买入;下穿 → 死叉卖出。
- 信号判定用「均线差正负翻转」:
diff = ma_s - ma_l,由负转正=cross_up,由正转负=cross_down,比逐日比较更简洁且不重复触发。 - 次日执行:
pos.shift(1)让信号在次日生效,避免用当天收盘价交易(未来函数)。 - 完整框架:接真实数据(akshare)、算回撤/夏普、绘图,见
dual_ma_backtest.py。
工具
akshare 是开源免费、专门拉取中国金融市场数据的 Python 库(A股/港股/期货/基金等),在代码里用它接真实行情。