AI应用 量化交易AIPython策略回测入门
云
云铭
进化之路 · 扫码阅读
微信 · 浏览器扫码
在手机上获得更好的阅读体验
AI量化交易入门:从零搭建你的第一个交易策略
量化交易不再是华尔街的专属武器。AI 时代,个人开发者也能用代码武装自己的投资决策。
什么是AI量化交易
传统量化 vs AI量化
| 维度 | 传统量化 | AI量化 |
|---|---|---|
| 策略来源 | 人工设计规则 | 数据驱动学习 |
| 因子发现 | 人工挖掘 | 自动特征工程 |
| 适应性 | 静态 | 动态自适应 |
| 数据处理 | 结构化数据 | 多模态(文本、图像、语音) |
| 复杂度 | 线性模型为主 | 深度神经网络 |
AI量化的核心流程
数据采集 → 数据清洗 → 特征工程 → 模型训练 → 策略回测 → 模拟交易 → 实盘部署
第一步:环境搭建
Python环境配置
# 创建虚拟环境
python -m venv quant-env
source quant-env/bin/activate # Windows: quant-env\Scripts\activate
# 安装核心库
pip install pandas numpy matplotlib
pip install yfinance # 数据获取
pip install scikit-learn # 机器学习
pip install backtrader # 回测框架
pip install ta # 技术指标
数据获取:你的第一个量化脚本
import yfinance as yf
import pandas as pd
import numpy as np
from datetime import datetime, timedelta
# 获取股票数据
ticker = "AAPL"
end_date = datetime.now()
start_date = end_date - timedelta(days=365*2)
df = yf.download(ticker, start=start_date, end=end_date)
print(f"数据形状: {df.shape}")
print(df.head())
print(f"\n起始日期: {df.index[0].date()}")
print(f"日收益率均值: {df['Close'].pct_change().mean():.4%}")
print(f"年化波动率: {df['Close'].pct_change().std() * np.sqrt(252):.2%}")
第二步:特征工程
技术指标特征
import ta
def create_features(df):
"""构建技术指标特征"""
# 趋势指标
df['sma_20'] = ta.trend.sma_indicator(df['Close'], window=20)
df['sma_50'] = ta.trend.sma_indicator(df['Close'], window=50)
df['ema_12'] = ta.trend.ema_indicator(df['Close'], window=12)
df['ema_26'] = ta.trend.ema_indicator(df['Close'], window=26)
# MACD
df['macd'] = ta.trend.macd_diff(df['Close'])
# 动量指标
df['rsi'] = ta.momentum.rsi(df['Close'], window=14)
df['stoch'] = ta.momentum.stoch(df['High'], df['Low'], df['Close'])
# 波动率
df['bb_high'] = ta.volatility.bollinger_hband(df['Close'])
df['bb_low'] = ta.volatility.bollinger_lband(df['Close'])
df['atr'] = ta.volatility.average_true_range(df['High'], df['Low'], df['Close'])
# 成交量
df['obv'] = ta.volume.on_balance_volume(df['Close'], df['Volume'])
return df.dropna()
df = create_features(df)
print(f"特征数量: {len(df.columns)}")
构建预测目标
# 预测未来N天的收益率方向
FORWARD_DAYS = 5
df['future_return'] = df['Close'].shift(-FORWARD_DAYS) / df['Close'] - 1
df['target'] = (df['future_return'] > 0).astype(int) # 1=涨, 0=跌
# 避免使用未来数据
feature_cols = [c for c in df.columns if c not in
['future_return', 'target', 'Open', 'High', 'Low', 'Close', 'Volume', 'Adj Close']]
print(f"特征列 ({len(feature_cols)}): {feature_cols}")
print(f"正样本比例: {df['target'].mean():.2%}")
第三步:模型训练
机器学习模型
from sklearn.model_selection import TimeSeriesSplit
from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier
from sklearn.metrics import accuracy_score, classification_report
from sklearn.preprocessing import StandardScaler
# 准备数据
X = df[feature_cols].dropna()
y = df.loc[X.index, 'target']
# 时间序列交叉验证(不能随机打乱!)
tscv = TimeSeriesSplit(n_splits=5)
models = {
'RandomForest': RandomForestClassifier(n_estimators=200, max_depth=10),
'GradientBoosting': GradientBoostingClassifier(n_estimators=200, max_depth=5)
}
for name, model in models.items():
scores = []
for train_idx, test_idx in tscv.split(X):
X_train, X_test = X.iloc[train_idx], X.iloc[test_idx]
y_train, y_test = y.iloc[train_idx], y.iloc[test_idx]
# 标准化
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
model.fit(X_train_scaled, y_train)
y_pred = model.predict(X_test_scaled)
scores.append(accuracy_score(y_test, y_pred))
print(f"{name}: 平均准确率 = {np.mean(scores):.2%} (±{np.std(scores):.2%})")
第四步:策略回测
用 Backtrader 回测
import backtrader as bt
class MLStrategy(bt.Strategy):
params = (
('model', None),
('scaler', None),
)
def __init__(self):
self.dataclose = self.datas[0].close
self.order = None
def next(self):
if self.order:
return
# 获取当前特征
features = self.get_features()
if features is None:
return
# 模型预测
pred = self.params.model.predict(
self.params.scaler.transform([features])
)[0]
# 交易逻辑
if pred == 1 and not self.position: # 预测上涨,买入
self.order = self.buy(size=100)
elif pred == 0 and self.position: # 预测下跌,卖出
self.order = self.sell(size=100)
def get_features(self):
# 实际实现中从数据中提取特征
pass
# 运行回测
cerebro = bt.Cerebro()
cerebro.addstrategy(MLStrategy, model=model, scaler=scaler)
cerebro.adddata(bt.feeds.PandasData(dataname=df))
cerebro.broker.setcash(100000.0)
cerebro.run()
cerebro.plot()
关键注意事项
常见陷阱
- 前视偏差 — 特征计算时不小心用到了未来数据
- 过拟合 — 在历史数据上完美但在实盘中表现糟糕
- 幸存者偏差 — 只用仍然存在的股票训练
- 交易成本 — 回测时忽略了手续费和滑点
- 市场状态变化 — 过去有效的策略,未来未必有效
从回测到实盘的阶梯
回测验证 → 纸交易(Paper Trade) → 小资金测试 → 逐步扩大
↑ ↓
└──── 持续监控和迭代 ← 收集实盘反馈 ←────────┘
进阶方向
当你掌握了基础后,可以探索:
- 强化学习 — 让 AI 在模拟环境中自主学习交易策略
- NLP 情感分析 — 从新闻和社交媒体提取市场情绪
- 图神经网络 — 分析股票之间的关联关系
- 另类数据 — 卫星图像、信用卡数据、供应链信息
- 高频交易 — 微秒级的市场微观结构分析
量化交易的本质是用数据替代情绪,用概率替代直觉。AI 让这种能力不再只是机构的专属。但记住:模型不是水晶球,风险控制永远第一。