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()

关键注意事项

常见陷阱

  1. 前视偏差 — 特征计算时不小心用到了未来数据
  2. 过拟合 — 在历史数据上完美但在实盘中表现糟糕
  3. 幸存者偏差 — 只用仍然存在的股票训练
  4. 交易成本 — 回测时忽略了手续费和滑点
  5. 市场状态变化 — 过去有效的策略,未来未必有效

从回测到实盘的阶梯

回测验证 → 纸交易(Paper Trade) → 小资金测试 → 逐步扩大
    ↑                                            ↓
    └──── 持续监控和迭代 ← 收集实盘反馈 ←────────┘

进阶方向

当你掌握了基础后,可以探索:

  • 强化学习 — 让 AI 在模拟环境中自主学习交易策略
  • NLP 情感分析 — 从新闻和社交媒体提取市场情绪
  • 图神经网络 — 分析股票之间的关联关系
  • 另类数据 — 卫星图像、信用卡数据、供应链信息
  • 高频交易 — 微秒级的市场微观结构分析

量化交易的本质是用数据替代情绪,用概率替代直觉。AI 让这种能力不再只是机构的专属。但记住:模型不是水晶球,风险控制永远第一。